Python基础之关于表达式
初识表达式:
优雅、清晰和务实是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新
的列表时可以使用列表解析(List comprehensions)和生成表达式,通过这两个操作,我们可以看到这三个观点是如何
在python中和谐统一起来的。
一、三元表达式:
#定义阶段
def my_max(x,y): #定义一个比较两个参数大小的函数
max = x if x > y else y #用三元表达式表示
print(max) #打印最大值
#调用阶段
my_max(1,2) #按位置传入参数x=1,y=2
----------以下是输出结果-----------
2
二、列表表达式:
在需要改变列表而不是需要新建某列表时,可以使用列表解析。列表解析表达式为:
[expr for iter_var in iterable]
[expr for iter_var in iterable if judging condition]
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应
用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该
iter_var的内容,最后用表达式的计算值生成一个列表。
实例如下:
l=['egg%s' %i for i in range(8)] #没有判断条件的形式
print(l)
l1=['egg%s' %i for i in range(8) if i > 4] #有判断条件的形式
print(l1)
----------以下是输出的结果------------
['egg0', 'egg1', 'egg2', 'egg3', 'egg4', 'egg5', 'egg6', 'egg7'] #列表l的结果
['egg5', 'egg6', 'egg7'] #列表l1的结果
以上例子不用列表表达式的话,代码如下:
l = [] #定义l为空列表
for i in range(8):
l.append('egg%s'%i) #往空列表追加内容
print(l) #打印输出
-----------------------------输出结果------------------------------
['egg0', 'egg1', 'egg2', 'egg3', 'egg4', 'egg5', 'egg6', 'egg7']
----------------以下是有判断条件的-----------------
l1 = [] #定义l为空列表
for i in range(8):
if i > 4 :
l1.append('egg%s'%i) #往空列表追加内容
print(l1) #打印输出
------------输出结果------------
['egg5', 'egg6', 'egg7']
下面来一段相对复杂的代码:
要求:将下面列表l和字符串s里的元素都一一搭配起来。
l = [1,2,3,4]
s = "hello"
l1 = []
-----------下面是没有判断条件的-----------
for i in l : #循环列表l
for j in s: #循环字符串s
t = (i,j) #将得到的值赋值给t
l1.append(t) #将t追加到空列表l1
print(l1) #打印输出
--------------------------------输出结果----------------------------------
[(1, 'h'), (1, 'e'), (1, 'l'), (1, 'l'), (1, 'o'), (2, 'h'), (2, 'e'),\
(2, 'l'), (2, 'l'), (2, 'o'), (3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), \
(3, 'o'), (4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
---------------------------下面是有判断条件的------------------------------
for i in l : #循环列表l
if i > 2 : #加上判断条件
for j in s: #循环字符串s
t = (i,j) 将得到的值赋值给t
l1.append(t) #将t追加到空列表l1
print(l1) #打印输出
-------------------输出结果-------------------
[(3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), (3, 'o'),\
(4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
下面用列表表达式来执行:
l = [1,2,3,4]
s = "hello"
l1 = [(i,j) for i in l for j in s]
print(l1)
--------------------------------输出结果--------------------------------
[(1, 'h'), (1, 'e'), (1, 'l'), (1, 'l'), (1, 'o'), (2, 'h'), (2, 'e'),\
(2, 'l'), (2, 'l'), (2, 'o'), (3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), \
(3, 'o'), (4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
-------------------------下面是有判断条件的-------------------------------
l1 = [(i,j) for i in l if i > 2 for j in s]
print(l1)
---------------------输出结果------------------------
[(3, 'h'), (3, 'e'), (3, 'l'), (3, 'l'), (3, 'o'),\
(4, 'h'), (4, 'e'), (4, 'l'), (4, 'l'), (4, 'o')]
三、生成器表达式:
在应用场景中当序列过长, 而每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析。生
成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的,而不是[],如下:
[expr for iter_var in iterable]
[expr for iter_var in iterable if judging condition]
语法同上面列表解析,此处略。
实例如下:
g = ("egg%s"%i for i in range(8) if i > 3) #有判断条件的生成器表达式
print(g)
print(next(g)) #手动next1
print(next(g)) #手动next2
for i in g: #自动在g里使用next方法
print(i) #打印结果
--------------------------以下输出结果------------------------------
<generator object <genexpr> at 0x0000000002532D58> #生成器g的内存地址
egg4 #手动next1结果
egg5 #手动next1结果
egg6 #使用for循环的结果,因为迭代器是一次性的,so,会接着上面打印
egg7 #使用for循环的结果
说明:
1、当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性。
2、当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析。
3、当序列过长, 而每次只需要获取一个元素时,使用生成器表达式。
4、列表解析的性能相比要比map要好,实现相同功能的for循环效率最差(和列表解析相比差两倍)。
5、列表解析可以转换为 for循环或者使用map(其中可能会用到filter、lambda函数)表达式,但是列表解析更
为简单明了,后者会带来更复杂和深层的嵌套。
Python基础之关于表达式的更多相关文章
- Python基础—15-正则表达式
正则表达式 应用场景 特定规律字符串的查找替换切割等 邮箱格式.URL.IP等的校验 爬虫项目中,特定内容的提取 使用原则 只要是能够使用字符串函数解决的问题,就不要使用正则 正则的效率较低,还会降低 ...
- python基础之生成器表达式形式、面向过程编程、内置函数部分
生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...
- Python基础笔记系列一:基本工具与表达式
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...
- Python之路3【第一篇】Python基础
本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...
- 进击的Python【第三章】:Python基础(三)
Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...
- 进击的Python【第二章】:Python基础(二)
Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...
- python基础之循环结构以及列表
python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.python IDE的选择 IDE的全称叫做集成 ...
- Python基础+Pythonweb+Python扩展+Python选修四大专题 超强麦子学院Python35G视频教程
[保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -- ...
- python基础-函数式编程
python基础-函数式编程 高阶函数:map , reduce ,filter,sorted 匿名函数: lambda 1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...
随机推荐
- UOJ #30【CF Round #278】Tourists
求从$ x$走到$ y$的路径上可能经过的最小点权,带修改 UOJ #30 $ Solution:$ 如果两个点经过了某个连通分量,一定可以走到这个连通分量的最小值 直接构建圆方树,圆点存原点的点权 ...
- Django REST Framework API Guide 03
本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...
- jquery判断表单内容是否为空
//判断表单数据是否为空 var t = $('form').serializeArray(); $.each(t,function(i,item){ if(item['value'] == '') ...
- CentOS 7安装Redis
第一步:安装gcc依赖 先通过gcc -v是否有安装gcc,如果没有安装,执行命令 yum install -y gcc(yum install -y gcc-c++) 第二步:下载redis安装包 ...
- 20165337岳源 第四次实验 Android开发
1.实验要求: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章 参考http://www.cnblogs.com ...
- com.nostra13.universalimageloader 加载displayImage图片时图片模糊的处理办法
配置显示参数: DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(defaultR ...
- linux 服务器下的基本操作
1.SSH 上传: scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载: scp user(远端用户 ...
- HDFS-put: unexpected URISyntaxException
目的:将某zip上传到HDFS某目录 [hdfs@mr1 jars]$ hadoop fs -put "20180720_155245 label.zip" /user/File/ ...
- 题解-PKUWC2018 Slay the Spire
Problem loj2538 Solution 在考场上当然要学会写暴力,考虑如果手上已经有了\(a\)张攻击牌和\(b\)张强化牌: 首先强化牌会在攻击牌之前用(废话),其次要将两种牌分别从大往小 ...
- 【转】Java并发编程:阻塞队列
在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...