一、迭代器与生成器:

迭代器(iterator):

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,迭代器的一大优点是不要求事先准备好事代过程中所有元素。迭代器仅仅在迭代至某个元素时才计算该元素,元素在被迭代器所迭代之前,元素可以不存在,或被销毁。这个特点使得迭代器特别适合用于遍历一些巨大的或是无限的集合,比如几个 G 的文件。

特点:

  1、访问者不需要关心迭代器的内部结构,仅需通过迭代器的 next() 方法不断去取下一个内容。

  2、不能随机访问集合中的某个值,只能从头至尾依次访问。

  3、集合中有元素 [a,b,c,d] 迭代至元素 c 时,不能在向后访问元素 b  (PS:迭代器不能后退)

  4、可以容易的循环较大数据集合,节省内存。

  5、__iter__ 方法:如果某个类可被迭代,类中必须要有这个方法。

  6、迭代器在取值的时候,不会将集合中的值一次全部取出,迭代一次,取出一个值,一直取到迭代器中无值,也就意味着在至值 n 之前,并不需要 n 有值。

生成迭代器:

>>>a = iter([1,2,3,4])   # iter 方法将指定的集合变成迭代器
>>>print (a) # 迭代器中的值只能被迭代取出。
<list_iterator object at 0x0000005B729C6BE0> # 返回的是迭代器的内存地址。
>>> a.__next__() # 迭代器有 next 方法,用来迭代集合中的下一个值
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
5
>>> a.__next__() # 迭代器中只有五个值,迭代到第六次时,就会超出值个数,导致停止迭代
Traceback (most recent call last):
File "F:/Blogs.py", line 14, in <module>
StopIteration # 停止迭代。

生成器(generator):

通过 list 方法,可以创建一个列表,但是内存容量是有限的,假如创建一个包含1000万元素的列表,加载至内存需要花费较长时间,但是我们仅仅需要它的前几个元素,整个列表也需要被加载至内存,此时内存空间就被浪费了。

定义:一个函数被调用时返回一个迭代器,那这个函数就叫生成器(generator),如果函数中包含 yield 语法,那这个函数就会变成生成器。

代码:

def cash(max):
while max >0:
max -= 1
yield 1 # 每次执行至 yield 时,就会使函数中断,并保存中断位置
print ("我来取钱了") # 当第 yield 中断后,返回时 就会打印此句 ATM = cash(5) # 将生成器 cash 的内存地址,赋值给 ATM 变量,执行 ATM 就等于执行生成器 cash
print ("取到 %s 万" %ATM.__next__()) # 生成器的 __next__ 方法
print ("取到 %s 万" %ATM.__next__())
print ("取到 %s 万" %ATM.__next__())
print ("取到 %s 万" %ATM.__next__())
print ("取到 %s 万" %ATM.__next__())
print ("取到 %s 万" %ATM.__next__()) # 生成器中只有5个元素此时再取就会报错 > 取到 1 万 # yield 中断后,__next__() 方法输出具体数值
> 我来取钱了 # 第一次 __next__ 方法执行完毕,返回函数继续 yield 下面执行打印此句
> 取到 1 万
> 我来取钱了
> 取到 1 万
> 我来取钱了
> 取到 1 万
> 我来取钱了
> 取到 1 万
> 我来取钱了
> Traceback (most recent call last):
> print ("取到 %s 万" %ATM.__next__())
> StopIteration

作用:

yield 主要效果就是可以使函数中断,并保存中断状态,记录中断在了哪个位置,当下一次调用这个函数时,继续上次 yield 中断的位置继续向下执行。

另外,还可通过 yield 实现在单线程的情况下实现并发运算效果。

import time    # 导入时间模块
def consumer(name): # 生成器
print ("%s 准备吃包子啦!" %name)
while True:
baozi = yield # 断点,yield 接收 send 方法传递进来的参数 print ("包子[%s]来了,被[%s]吃了!" %(baozi,name)) # def producer(name):
c = consumer('A') # 传递给生成器的变量
c2 = consumer('B') # 传递给生成器的变量
c.__next__() # 触发取生成器中的内容
c2.__next__() # 触发取生成器中的内容
print ("老子开始准备做包子啦!")
for i in range(3): # 循环十次,退出程序
time.sleep(1) # 暂停一秒
print("做了2个包子!")
c.send(i) # 通过变量向 yield 传递参数,发送后即进入迭代器
c2.send(i) # 同上
producer("alex") # 触发函数
> A 准备吃包子啦!
> B 准备吃包子啦!
> 老子开始准备做包子啦!
> 做了2个包子!
> 包子[0]来了,被[A]吃了!
> 包子[0]来了,被[B]吃了!
> 做了2个包子!
> 包子[1]来了,被[A]吃了!
> 包子[1]来了,被[B]吃了!
> 做了2个包子!
> 包子[2]来了,被[A]吃了!
> 包子[2]来了,被[B]吃了!

Python Day04的更多相关文章

  1. My way to Python - Day04 - 模块

    re模块 什么是正则表达式 正则表达式,英文叫做Regular Expression.简单说,正则表达式就是一组规则,用于实现字符串的查找,匹配,以实现关于字符串的相关操作,比如替换,删除等. 正则表 ...

  2. python day04笔记总结

    2019.4.1 S21 day04笔记总结 昨日内容补充 1.解释器/编译器 1.解释型语言.编译型语言 2.解释型:写完代码后提交给解释器,解释器将代码一行行执行.(边接收边解释/实时解释) 常用 ...

  3. python———day04

    一.tuple (元组) 元组被称为制度列表,可以被查询,但是不能被修改. 元组写在小括号里(),元素之间用逗号隔开. tup1 = () #空元组 tup2 = (20,) #只有一个元素的元组 记 ...

  4. python day04 作业答案

    1. 1) li=['alex','WuSir','ritian','barry','wenzhou'] print(len(li)) 2) li=['alex','WuSir','ritian',' ...

  5. python day04作业

  6. python02---基础数据类型

    python02---基础数据类型 一. 什么是数据类型 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,&quo ...

  7. Python基础(函数部分)-day04

    写在前面 上课第四天,打卡: 加勒比海盗今天上映:端午节公司发的粽子很有范! 一.函数的基本概念 - 函数是什么?  函数,就是一个'锤子',一个具有特定功能的'锤子',使用者可以在适当的时候使用这个 ...

  8. python开发学习-day04(迭代器、生成器、装饰器、二分查找、正则)

    s12-20160123-day04 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  9. python s13 day04

    1.1 all() 和 any( )   all() any()   0,None,"", [], (),{} #布尔值为0的 列举,None ,空列表,空元祖,空. print( ...

随机推荐

  1. 【转】}目前比较全的CSS重设(reset)方法总结

    在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈现相同的视 ...

  2. Web Service数据源

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. LaTeX用dvi编译,Yap浏览器弹出对话框,决解办法(傻瓜教程)

      1,打开windows-----所有运用,找到CTEX的文件目录 2,打开Previewer对话框 打开后如图: 2,选择view – option 打开后如下图: 3,选择Display---- ...

  4. An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

    如果你和我一样遇到了这个问题,那么你就要检查你要操作的Model对象查询,更新操作的数据库上下文也就是DBContext是否一致.如果不一致也就是说你用AContext去查如AContext.SET& ...

  5. 【java基础】成员变量和局部变量

    成员变量和局部变量 根据定义变量位置的不同,可以将变量分为成员变量和局部变量        成员变量是在类范围内定义的变量        局部变量是在一个方法内定义的变量   成员变量可以分为:   ...

  6. Python文件使用“wb”方式打开,写入内容

    Python文件使用"wb"方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. 所以写入 ...

  7. python unicode转中文及转换默认编码

    一. 在爬虫抓取网页信息时常需要将类似"\u4eba\u751f\u82e6\u77ed\uff0cpy\u662f\u5cb8"转换为中文,实际上这是unicode的中文编码.可 ...

  8. 加速编码的 JavaScript 库和工具

    JavaScript库是 一个提前写好的JavaScript文件库,它可以很容易的开发基于JavaScript的应用,特别是AJAX和一些其它的以web为中心的技术.运用JavaScript最基本的方 ...

  9. 强大的命令行工具wmic

    1.wmic=Microsoft Windows Management Instrumentation 2. C:\WINDOWS\system32\wbem 下的东西,特别是.xsl格式化文件,实现 ...

  10. JavaScipt 数据交互

    标准的w3c直接提供了XMLHttpRequest方法,我们主要站在设计的角度来理解,如何设计出低耦合高内聚的代码jquery对Ajax的处理主要体现在对浏览器兼容,数据的处理过滤以及各种事件的封装上 ...