1 from collections import Iterable
2 from collections import Iterator
3 #如上篇博客所讲,生成器可以写成如下形式,当生成器被next()调用或循环,生成器运行到yield所在语句,yield后面紧跟变量将其值赋给yield,yield将其返回
4 def str_ip(ip_start):
5 for ip1 in range(256):
6 for ip2 in range(256):
7 for ip3 in range(256):
8 ip_str_format = "%s.%s.%s.%s"%(str(ip_start), str(ip1), str(ip2), str(ip3) )
9 yield ip_str_format
10 return "this is iter done" #迭代器中此处的return是抛异常时候的值
11
12 #函数调用将其赋给一个变量,此时这个变量就是生成器
13 str_ip_gen = str_ip(66)
14 #使用生成器的next方法来获取数据
15 for i in range(30):
16 print(str_ip_gen.__next__())
17
18 #下面代码使用迭代器的send方法从外面传值给yield达到并行运算的效果
19 def consumer(name):
20 print("准备吃包子了")
21 while True:
22 #此处直接用yield给变量赋值,达到外界传值给生成器的效果
23 baozi = yield
24 print("%s 吃了 %s 包子"%(name, baozi))
25
26 #定义生产者,生产者使用生成器send方法将数据传递给消费者
27 def producer():
28 #构造两个生成器
29 con1 = consumer("xxx")
30 con2 = consumer("yyy")
31 #调用一次next方法,让生成器第一次走到yield的位置,准备下一次调用时接数据
32 con1.__next__()
33 con2.__next__()
34 #循环成产包子
35 for j in ["韭菜", "香菇", "豆腐"]:
36 #此处调用生成器send方法将值传递给yield,并且生成器向下迭代一次。
37 con1.send(j)
38 con2.send(j)
39 producer()
40
41 #迭代器
42 #可用于for循环的有下面几种:1、集合类型:列表 元组 字典 集合 字符串等 2、生成器;可以被用于for循环的通车个可迭代对象,使用isinstance()判断
43 print(isinstance({}, Iterable)) #True,满足这样的条件都是可迭代对象
44 #可以被next方法调用并不断返回下一个值的称为迭代器,用下面语句判断一个对象是不是迭代器。生成器一定就是迭代器,符合迭代器的定义
45 print(isinstance({}, Iterator)) #False
46 #列表 字典等是可迭代对象但不是迭代器,使用iter方法可以将可迭代对象转换成迭代器
47 print(isinstance(iter({}), Iterator)) #True
48
49 """
50 为什么列表 字典等可迭代对象不是迭代器呢?python是迭代器对象表示一种数据流,迭代器对象next方法获取数据流的下一个值;
51 直到没有数据时抛出StopIteration错误。可以把数据流看做有序的集合但是无法提前预知其长度,只能通过next方法向下走。
52 迭代器是惰性的,只有调用一次才向后走一步,但是其可以表示无限大的数据,而列表 字典等非迭代器不可以表示无限大的内容,如全体正整数
53 """