python基础 生成器send方法 迭代器
Posted flag_HW
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础 生成器send方法 迭代器相关的知识,希望对你有一定的参考价值。
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 """
以上是关于python基础 生成器send方法 迭代器的主要内容,如果未能解决你的问题,请参考以下文章