初识表达式:

  优雅、清晰和务实是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基础之关于表达式的更多相关文章

  1. Python基础—15-正则表达式

    正则表达式 应用场景 特定规律字符串的查找替换切割等 邮箱格式.URL.IP等的校验 爬虫项目中,特定内容的提取 使用原则 只要是能够使用字符串函数解决的问题,就不要使用正则 正则的效率较低,还会降低 ...

  2. python基础之生成器表达式形式、面向过程编程、内置函数部分

    生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为 ...

  3. Python基础笔记系列一:基本工具与表达式

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...

  4. Python之路3【第一篇】Python基础

    本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

  5. 进击的Python【第三章】:Python基础(三)

    Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...

  6. 进击的Python【第二章】:Python基础(二)

    Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...

  7. python基础之循环结构以及列表

    python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.python IDE的选择 IDE的全称叫做集成 ...

  8. Python基础+Pythonweb+Python扩展+Python选修四大专题 超强麦子学院Python35G视频教程

    [保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -- ...

  9. python基础-函数式编程

    python基础-函数式编程  高阶函数:map , reduce ,filter,sorted 匿名函数:  lambda  1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...

随机推荐

  1. 329 experience

    截止到现在,给我最大的冲击就是HTML没有像JAVA那样严格 可以随意搭配,换句话说 HTML要的就是效果 没有一个固定的方法 即便是代码有错误 也可以实现效果 今天的东西挺好吃 能吃的消 哈哈 开森 ...

  2. Django实战(一)-----用户登录与注册系统4(表单)

    我们前面都是手工在HTML文件中编写表单form元素,然后在views.py的视图函数中接收表单中的用户数据,再编写验证代码进行验证,最后使用ORM进行数据库的增删改查.这样费时费力,整个过程比较复杂 ...

  3. roslaunch & gdb 调试指南(待补充)

    1. 安装xterm sudo apt-get install xterm 2. 在launch文件中添加如下内容: <node name="navigation" pkg= ...

  4. Java类锁和对象锁

    一.类锁和对象锁 二.使用注意 三.参考资料 一.类锁和对象锁 类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.class) 对象锁:在代码 ...

  5. 非极大值抑制(NMS)的几种实现

    因为之前对比了RoI pooling的几种实现,发现python.pytorch的自带工具函数速度确实很慢,所以这里再对Faster-RCNN中另一个速度瓶颈NMS做一个简单对比试验. 这里做了四组对 ...

  6. react-router简介

    Web应用中的路由的作用和原理:保证视图和URL的同步,可以把视图看成资源的一种表现.当用户在页面中进行操作时,应用会在若干个交互状态中切换,比如用户会单击浏览器的前进.后退按钮进行切换等.路由系统的 ...

  7. MySQL用户授权【转】

    MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant selec ...

  8. sumafan:python爬虫多线程爬取数据小练习(附答案)

    抓取 https://www.cnbeta.com/ 首页中新闻内容页网址, 抓取内容例子: https://hot.cnbeta.com/articles/game/825125 将抓取下来的内容页 ...

  9. python3+requests库框架设计06-测试脚本

    在项目下新建TestCase文件夹,然后新建.py文件在文件中写关于接口具体的测试脚本,一般我喜欢按照模块来分,一个模块一个.py文件,建议以test开头命名文件 把配置文件改成这样 url:http ...

  10. NodeJS基础教程

    关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...