Python中的Comprehensions和Generations语法都是用来迭代的。Comprehensions语法可用于list,set,dictionary上,而Generations语法分为Generator函数和Generator表达式。

Comprehensions

以list的Comprehensions语法为例:

#常规语法

[expression for target initerable]

[x** 2 for x in range(10)]#加入if语句

[expression for target in iterable ifcondiction]

[x** 2 for x in range(10) if x % 2 ==0]#完整语法

[expression for target1 in interable1 ifcondition1for target2 in interable2 ifcondition2for target3 in interable3 ifcondition3

...for targetN in iterableN ifcondictionN]

[x+ y + z for x in 'spam' if x in 'sm'

for y in 'SPAM' if y in ('P', 'A')for z in '123' if z > '1']

通过Comprehensions的完整语法,可以发现,Comprehensions语法是允许嵌套的,它们等于嵌套的for循环:

res =[]for x in 'spam':if x in 'sm':for y in 'SPAM':if y in ('P', 'A'):for z in '123':if z > '1':

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表达式后面的语句,这样周而复始,直到迭代完毕:

deftest():for i in range(5):yieldiprint('###')>>>G = test() #调用Generator函数返回的是一个迭代器

>>>G

>>>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"", line 1, in StopInteration

在Generator函数中也可以包含return语句,如果碰到return语句,迭代就会提前结束:

deftest():for i in range(5):return

yield

print('###')>>>G = test() #返回迭代器

>>>G

>>>next(G) #遇到return语句,迭代提前结束

Traceback (most recent call last):

File"", line 1, in StopInteration

2) send方法

在Python 2.5之后,Generator函数返回的迭代器可以使用send方法。send方法也是遍历迭代器,不同之处是send方法允许传递一个值,而这个值会变成yield的返回值,从这个意义上将,yield此时是一个表达式,而不是一条语句:

deftest():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 notdefined>>>[X for X in range(5)] #Pyhon 3.X

>>>X

NameError: name'X' is notdefined>>>[X for X in range(5)] #Pyhon 2.X

>>>X #可以访问

4

python comprehensions_Python中的Comprehensions和Generations相关推荐

  1. Python Tutorial中英双语对照文档1

    本文根据官方文档 http://www.pythondoc.com/pythontutorial3/ 和 中文文档 http://www.pythondoc.com/pythontutorial3/ ...

  2. Python Tutorial中英双语对照文档3

    接 Python Tutorial中英双语对照文档2 CHAPTER NINE CLASSES 类 Classes provide a means of bundling data and funct ...

  3. python调用什么函数实现对文件内容的读取_如何使用python语言中的方法对文件进行读写操作...

    在我们使用python语言中的文件时,可以使用open()方法打开文件,close()方法关闭文件,read()方法读取文件内容,write()方法写入内容到文件中.下面利用几个实例说明文件读写方法, ...

  4. python图像中如何显示中文

    python图像中如何显示中文 在开头加入这两行即可 from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei']

  5. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  6. python 类中定义类_Python中的动态类定义

    python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...

  7. Python培训分享:Python新版本中的6个新特性

    Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...

  8. Python培训常识:Python面试中常被问到的几种设计模式要知道

    学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常 ...

  9. python语言中如何使用注释

    每一种计算机语言都有自己的注释方式,我们知道注释的作用是解释这些代码,方便程序员以后的检查和修改.而且注释的一部分在运行程序的过程中不起作用,也不会显示出来.下面我们将为大家介绍,在python语言中 ...

  10. arcgis里python窗口运行,在 Python 窗口中执行工具

    当第一次打开 Python 窗口时,它会显示类似这样的界面: 左侧区域为 Python 的主提示窗口,在这里执行 Python 命令.右侧区域为帮助和语法窗口,工具运行时,在这里显示执行消息:输入代码 ...

最新文章

  1. 写了 5 年 Java,这些坑还是没躲过……
  2. python那么慢为什么还有人用-为什么Python运算慢还拿来搞AI?这三点大多数都不知道?...
  3. liigo:爱可视70平板电脑使用感受,遗憾与满足并存
  4. 共享可写节包含重定位_深度探索win32可执行文件格式
  5. snprintf()返回值的陷阱
  6. 全国院线总票房破 50 亿!影院复工后,哪些电影最受欢迎?
  7. C语言:判断m是否为素数
  8. kubernetes 一个窗口可以使用kubectl 另一个窗口不可以The connection to the server localhost:8080 was refused - did you
  9. [转]coolfire黑客入门教程系列之(七)
  10. 计算机辅助翻译技术工具,浅析计算机辅助翻译技术对译者的影响
  11. 详解u盘装系统找不到镜像文件怎么回事
  12. Python中格式化操作漂亮打印文件的读取和写入
  13. 服务器固件测试--PCI设备的介绍(集成网卡和外插网卡)
  14. EDP to LVDS转换设计电路|EDP to LVDS转接板电路|Capstone/CS5211芯片电路原理图参考
  15. 2009 年幸福的一年
  16. zookeeper报错Have smaller server identifier, so dropping the connection
  17. C语言中的清屏函数(自己编写)
  18. 现在做外卖CPS晚吗?应该怎样做效果好一点?
  19. java工具类 PDF转图片
  20. RTS game/engine Links

热门文章

  1. CHKJ3000E错误解决
  2. 论文简述 | PL-VINS:具有点和线特征的实时单目视觉惯性SLAM
  3. xUtils3 图片加载模块
  4. DevExpress WPF v19.1新版亮点:PDF Viewer等控件新功能
  5. 框架Thinkphp5 简单的实现行为 钩子 Hook
  6. 程序中使用log4J打印信息的两种方式
  7. 【BZOJ 3442】 3442: 学习小组 (最大费用流)
  8. javascript中concat方法深入理解
  9. 第一部分 1.2 定义OC的类和创建OC的对象
  10. ArcMap提取不规则线的坐标