初识表达式:

  优雅、清晰和务实是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. git详细介绍

    Git管理我们的代码会经历三个不过程 1. 工作区:没有提交的代码就是存放的工作区 2. 暂存区:通过 git add 文件名 命令提交代码该文件就放在暂存区 3. 历史区:通过 git commit ...

  2. android 内存回收及怎样避免内存泄露

    http://blog.vunso.com/201307/android%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6%E5%8F%8A% ...

  3. cxf动态调用外部web service 报告异常java.lang.NoSuchFieldError: QUALIFIED

    原因:cxf 依赖的xmlschema-core 与xfire-all依赖的xmlschema冲突.(百度搜索亦得知:cxf 依赖的xmlschema-core 与axis2-kernel依赖的xml ...

  4. vue工具知识

    1.访问数据自动格式化 Google jsonview插件(已用) 2.字体图标库. https://icomoon.io/  上传svg可生成字体图标

  5. MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)

    create table 表名 ( 列名1 列属性, 列名2 列属性 ... ... 列名n 列属性 )engine myisam charset utf8; (增加表的一列) (一)在表的最末列增加 ...

  6. MySql cmd下的学习笔记 —— 有关表的操作(对表中数据的增,删,改,查)

    (知识回顾) 连接数据库 mysql -uroot -p111 先建立一个新库 create database test1; use test1; 由于今天的主要内容是表的操作,建立表的详细过程不是本 ...

  7. 加扰与加密&解扰与解密

    原文:https://blog.csdn.net/yuan892173701/article/details/8743543 加扰就是改变标准电视信号的特性,在发送端按规定处理,而加密就是在加解扰系统 ...

  8. LaTeX IEEE模板

    因为课程作业的要求需要完成一篇IEEE格式的论文,所以选择入门LaTeX.但是期间遇到了各种各样莫名其妙的坑.前前后后挣扎了两个多星期终于完成了IEEE模板的设置.下面详细记录一下让我深恶痛绝的心路历 ...

  9. ORA-03113: end-of-file on communication channel 磁盘慢,数据库启动失败

    磁盘慢,数据库启动失败:解决思路:1.让数据文件offline: 2.删除表空间 SQL> startup pfile='/server/oracle/admin/test/pfile/init ...

  10. WPF DataGrid 列显示0,-1(作废、删除)状态,1,2(支出、收入)类型,操作人(在其他表中),如何转换格式。

    操作人,左联,Join on letf //容我补充 状态,类型,类似的转换,在xmlns中引入common   xmlns:com="clr-namespace:XXX.Common&qu ...