Python中的Comprehensions和Generations
Python中的Comprehensions和Generations语法都是用来迭代的。Comprehensions语法可用于list,set,dictionary上,而Generations语法分为Generator函数和Generator表达式。
Comprehensions
以list的Comprehensions语法为例:
# 常规语法
[expression for target in iterable]
[x ** 2 for x in range(10)] # 加入if语句
[expression for target in iterable if condiction]
[x ** 2 for x in range(10) if x % 2 == 0] # 完整语法
[expression for target1 in interable1 if condition1
for target2 in interable2 if condition2
for target3 in interable3 if condition3
...
for targetN in iterableN if condictionN]
[x + y + z for x in 'spam' if x in 'sm'
for y in 'SPAM' if y in ('P', 'A')
for z in '' if z > '']
通过Comprehensions的完整语法,可以发现,Comprehensions语法是允许嵌套的,它们等于嵌套的for循环:
res = [] for x in 'spam':
if x in 'sm':
for y in 'SPAM':
if y in ('P', 'A'):
for z in '':
if z > '':
res.append[x + y + z]
而set和dictionary的Comprehensions语法与list的Comprehensions语法类似,不同之处只在于,对于set来说,只需将list Comprehensions语法中的[]换成{};对于dictinary来说,除了将[]换成{},expression是由:分隔的两个表达式:
>>>{x * x for x in range(10)} # set的语法
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>>{x: x * x for x in range(10)} # dictionary的语法
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Generations
Generations分为Generator函数和Generator表达式。
1 Generator函数
1) Generator函数的定义和普通函数定义一样,不同之处在于,Generator函数需要使用yield表达式。yield表达式的作用是告诉Python,当调用Generator函数时,返回的是一个迭代器。当遍历这个返回的迭代器时,Generator函数开始运行,当碰到yield表达式时,一方面将yield表达式的值返给迭代器,另一方面暂停Generator函数的执行;当下次遍历的时候,Generator函数继续运行yiled表达式后面的语句,这样周而复始,直到迭代完毕:
def test():
for i in range(5):
yield i
print('###') >>>G = test() # 调用Generator函数返回的是一个迭代器
>>>G
<generator object test at 0x7f1246c1ee60> >>>next(G) # 返回yield表达式的值,并在那里暂停
0 >>>next(G) # 继续迭代,运行yield后面的语句,由于for循环,再次碰到yield语句,返回yield语句的值,并且再次暂停
###
1 >>>next(G) # 继续迭代
###
2 >>> next(G) # 继续迭代
###
3 >>>>next(G) # 继续迭代
###
4 >>>next(G) # 继续迭代,此时迭代结束
### # print语句还是会执行
Traceback (most rencent call last):
File "<stdin>", line 1, in <module>
StopInteration
在Generator函数中也可以包含return语句,如果碰到return语句,迭代就会提前结束:
def test():
for i in range(5):
return
yield
print('###') >>>G = test() # 返回迭代器
>>>G
<generator object test at 0x7f1246c1eee08> >>>next(G) # 遇到return语句,迭代提前结束
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopInteration
2) send方法
在Python 2.5之后,Generator函数返回的迭代器可以使用send方法。send方法也是遍历迭代器,不同之处是send方法允许传递一个值,而这个值会变成yield的返回值,从这个意义上将,yield此时是一个表达式,而不是一条语句:
def test():
for i range(5):
X = (yied i) + 10 # 如果不加括号,等价于 X = yield (i + 10)
print('%s %d' %('###', X)) >>>G = test()
>>>next(G) # 必须首先调用next方法来启动迭代器
0 >>>G.send(77)
### 87
1
2 Generator表达式
Generator表达式和list Comprehensions十分类似,区别就是将[]换成()就可以了,并且括号也不是必须的。如果Generator表达式已经被括号包围了,并且Generator表达式是括号里面的唯一表达式,那么就可以省略括号,否则,就需要使用:
>>>sum(x ** 2 for x in range(4)) # 括号可以省略 >>>sorted((x ** 2 for x in range(4)), reverse=True) # 需要使用括号
Scope
在Python 3.X中,对于Comprehensions和Generator表达式自己生命的变量,该变量只能在Comprehensions和Generator表达式内部使用,外部无法访问这些变量;在Python 2.X中,规则基本和Python 3.X中一样,唯一的例外就是在Python 2.X中,list Comprehensions生命的变量,并不是只有list Comprehensions内部使用,外部也可以访问:
>>>(X for X in range(5)) # Python 3.X , Python 2.X
>>>X
NameError: name 'X' is not defined >>>[X for X in range(5)] # Pyhon 3.X
>>>X
NameError: name 'X' is not defined >>>[X for X in range(5)] # Pyhon 2.X
>>>X # 可以访问
4
Python中的Comprehensions和Generations的更多相关文章
- 详解Python中的循环语句的用法
一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...
- python 中的列表解析和生成表达式 - 转
优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析( List comprehensions)和生成表达式,通过这两 ...
- 可爱的 Python : Python中函数式编程,第一部分
英文原文:Charming Python: Functional programming in Python, Part 1 摘要:虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包 ...
- Python中的列表解析和生成表达式
摘要:优雅.清晰和务实都是python的核心价值观,如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析( List comprehensions)和生成表达式,通过 ...
- python中列表生成式
1.简介 列表生成式即List Comprehensions,是Python中用于创建list的生成式. 2.示例 [表达式 循环体 条件语句] #!/usr/bin/env python # - ...
- python中对 函数 闭包 的理解
最近学到 函数 闭包的时候,似懂非懂.迷迷糊糊的样子,很是头疼,今天就特意查了下关于闭包的知识,现将我自己的理解分享如下! 一.python 闭包定义 首先,关于闭包,百度百科是这样解释的: 闭包是指 ...
- 从底层带你理解Python中的一些内部机制
下面博文将带你创建一个字节码级别的追踪API以追踪Python的一些内部机制,比如类似YIELDVALUE.YIELDFROM操作码的实现,推式构造列表(List Comprehensions).生成 ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- python中的生成器,迭代器及列表生成式
列表生成器: 即List Comprehensions. 在python中,可通过内置的强大有简单的生成式来创建列表.例如创建一个1到10的列表list [1, 2, 3, 4, 5, 6, 7, ...
随机推荐
- Sass使用
1. 什么是Sass ??? Sass是一个将脚本解析成CSS的脚本语言,也可以称为CSS扩展语言. 2. 安装: 第一步:先安装Ruby (sass基于Ruby语言开发而成,因此安装sass前需 ...
- PHP实现全自动化邮件发送 phpmailer
PHPmailer composer地址 function SendMail($msg,$theme,$content) { $mail = new \PHPMailer\PHPM ...
- hadoop的自定义分组实现 (Partition机制)
hadoop开发中我们会遇到类似这样的问题,比如 如何将不同省份的手机号分别输出到不同的文件中,本片文章将对hadoop内置的Partition类进行重写以解决这个问题. MapReduce的使用者通 ...
- JS第一周学习笔记整理
目录 JS正式课第一周笔记整理 JS正式课第一周笔记整理 webstorm : 代码编辑器 浏览器: 代码解析器: Git : 是一个工具;用于团队协作开发项目管理代码的工具:在工作中用git.svn ...
- sublime解决gbk中文乱码包括Package Control: Install Package 无法使用
最近喜欢上了sublime,打算抛弃notepad,但是发现sublime居然不支持gbk编码,再上网查找资料之后,总结了一套解决方法,目前为止是行之有效的. 日期:2019年3月14日 第一步:到G ...
- 中国大学MOOC-C程序设计(浙大翁恺)—— 时间换算
时间换算(10分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小 ...
- IIC总线协议和时序
IIC标准速率为100Kbit/s,快速模式400Kbit/s,支持多机通信,支持多主控模块,但是同一时刻只允许有一个主控.由数据线SDA和时钟SCL构成串行总线:每个电路模块都有唯一地址.I2C设备 ...
- ECMAScript 5 compatibility shims for legacy JavaScript engines
ECMAScript 5 compatibility shims for legacy JavaScript engines https://github.com/es-shims/es5-shim
- Java面向对象之抽象方法&接口
在开始写抽象类之前,有一个问题我觉得想清楚会对理解抽象类很有帮助:那就是为什么要设计抽象类? 难道用类还不够么,为什么要设计出抽象类这样一个东西.我们可以换个角度来理解,就是有些类本来就是不应该被实例 ...
- 北京Uber优步司机奖励政策(12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...