生成器:是自定义的迭代器(自己用python代码写的迭代器),函数中见到yield的就是生成器

那么yield前后的变量又该怎么理解

看例子一

def counter(name):
print('%s ready to count'%name)
num_list=[]
while True: #这个语句的作用是循环利用yield,这样的话对象就可以无限传值了
#yield前的变量是接收值的
num=yield '现在的列表是%s'%num_list #yield后面的变量会打印处理
num_list.append(num)
print('%s start to count %s'%(name,num)) e=counter('xincheng')
print(e.send(None)) #或者 next(e)
print(e.send(''))
print(e.send(''))
for i in range(3,10):
print(e.send(i))

例子一打印结果为:

xincheng ready to count
现在的列表是[]
xincheng start to count 1
现在的列表是['']
xincheng start to count 2
现在的列表是['', '']
xincheng start to count 3
现在的列表是['', '', 3]
xincheng start to count 4
现在的列表是['', '', 3, 4]
xincheng start to count 5
现在的列表是['', '', 3, 4, 5]
xincheng start to count 6
现在的列表是['', '', 3, 4, 5, 6]
xincheng start to count 7
现在的列表是['', '', 3, 4, 5, 6, 7]
xincheng start to count 8
现在的列表是['', '', 3, 4, 5, 6, 7, 8]
xincheng start to count 9
现在的列表是['', '', 3, 4, 5, 6, 7, 8, 9]

例子一结果

例子二:

def counter(name):
print('%s ready to count'%name)
num_list=[]
while True:
num=yield num_list,'hehe' #yield后面的变量会答应处理,多个用,隔开,结果就会放入一个元组中
num_list.append(num)
print('%s start to count %s'%(name,num)) #yield后面的语句一般为下一个yield的开始 e=counter('xincheng')
next(e)
s=e.send('') #xincheng start to count 1
print(s,type(s)) #(['1'], 'hehe') <class 'tuple'> yield后面的东西是给对象传的值,多个值放在一个元组中

例子三:yield from 可以从一些地方获取值

def gen1():
for c in 'ab':
yield c
for i in range(3):
yield i
print(list(gen1())) def gen2():
yield from 'ab'
yield from range(3) print(list(gen2())) #两个print的值都为['a', 'b', 0, 1, 2]

面试题一

def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1) print(list(g1)) #[0, 1, 2, 3]
print(list(g2)) #[] #g是第一个生成器,g1取得值来自于g,g2取值来自于g1,归根到底还是g,list是可迭代对象,将g1赋予list得方法,其实是从g中取值,而且取完了,g2自然就是空值了 请看下面得变体
def demo():
for i in range(4):
yield i g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(next(g)) # 0
print(next(g1)) # 1
print(next(g2)) # 2

面试题二:

def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test()
for n in [1,10]:
g=(add(n,i) for i in g) print(list(g)) #此例子的for循环中有两个元素,其结果为 [20, 21, 22, 23] #如果将for循环下面得表达式换成g=[add(n,i) for i in g] 换成了【】,结果为[11, 12, 13, 14] #如果将for循环的表达式换成 for n in [1,3,10] 或者 for n in [1,11,10] 都是三个元素,其结果为[30, 31, 32, 33] #如果是 for n in [1,3,6,7,10,11,100,10]总共8个元素 其结果为[80, 81, 82, 83]

面试二总结:生成器的特点是惰性机制,也就是说你找它要,它才会给你值

  在上一题的for循环中,不管你循环多少次,生成器的取值都是列表【】中的最后一个值

  g在取值前,是一个内存地址,for循环一直改变着g的内存地址,最后是n=10的内存地址

  for循环一次,g中的值就加一次,每次加的都是n=10的内存地址的值

  for循环第一次: 10+0  10+1 10+2 10+3

  for循环第二次:10+10+0  10+10+1 10+10+2 10+10+3

  如果有第三次:10*3+0 10*3+1  10*3+2 10*3+3

  。。。。。。

关于生成器---(yield)的更多相关文章

  1. Python入门之迭代器/生成器/yield的表达方式/面向过程编程

    本章内容 迭代器 面向过程编程 一.什么是迭代 二.什么是迭代器 三.迭代器演示和举例 四.生成器yield基础 五.生成器yield的表达式形式 六.面向过程编程 ================= ...

  2. PHP性能优化利器:生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  3. [PY3]——函数——生成器(yield关键字)

    函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...

  4. 6 生成器 yield 协程

    1.生成器 ----> 1 b = [x*2 for x in range(100000000000)] MemoryError: 想生成一个存放很多数据的列表,但是又不想内存占用太多 每次用一 ...

  5. day4 内置函数 迭代器&生成器 yield总结 三元运算 闭包

    内置函数: 内置函数 # abs()返回一个数字的绝对值.如果给出复数,返回值就是该复数的模. b = -100 print(b) print(abs(b)) # all() 所有为真才为真,只要有一 ...

  6. PHP 生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  7. python3使用迭代生成器yield减少内存占用

    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中.其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会 ...

  8. Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递

    python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...

  9. Python全栈之路8--迭代器(iter)和生成器(yield)

    一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文, ...

  10. (转) Python Generators(生成器)——yield关键字

    http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...

随机推荐

  1. WPF 多线程异常抛送到UI线程

    无论是winform还是WPF,在.NET 2.0之后 只要是多线程中产生了异常都会导致程序强制结束. 那么我们一般的做法是将未知的多线程的异常抛送到UI线程去,然后进行处理.. 正确的多线程中的异常 ...

  2. 干了2个月java开发最深的体会

    综上为JQuery中ajax的操作,感觉使用多了,和form表单的处理还是非常相似的,只不过实现的功能不一样罢了.学习编程,其实就是学习对数据的流转处理,也即是程序的运行流程,如何从前台获取,传输到服 ...

  3. grandstack graphql 开发模型

    当前grandstack 支持两类开发方式 js (使用Neo4j-graphql-js) 插件模型 js 模型 参考https://github.com/rongfengliang/grand-st ...

  4. jquery 1.9里面已经删除了toggle(fn1, fn2)函数:

    jquery 1.9里面已经删除了toggle(fn1, fn2)函数:引用Note: This method signature was deprecated in jQuery 1.8 and r ...

  5. KindEditor 上传文件 在Asp.net中的使用

    以前一直用FCK编辑器,因为配置比较简单,但是发现Kindeditor这个编辑器更加好看,更加灵活,就用了下. 但是发现在上传文件的时候,出现了大问题,弄了我好久的时间,为了记录下,或许能帮助到您,共 ...

  6. Javascript 正则验证带 + 号的邮箱地址

    很多邮箱地址是可以加上 + 加号为同一个邮箱地址. 比如 Gmail. 如果需要验证带 + 号的邮箱,如下: str = "65485+55@gmail.com"; documen ...

  7. 【柚子木字幕組】【BBC】 Are Our Kids Tough Enough? Chinese School 英國的孩子足夠堅強嗎?中式教學

    https://www.youtube.com/watch?v=ypT6c4NZ6jk 最近很火的一个bbc纪录片 讲的是英国学校请几个中国老师到他们那里试行中国教育的故事 作为学习英文的素材很不错

  8. vue-cli 引入阿里巴巴字体图标:注意点

    vue-cli 引入阿里巴巴字体图标:注意点 下载的 iconfont.css 文件中: .iconfont { font-family:"iconfont" !important ...

  9. wxWidgets:消息处理流程

    首先解释下EventHandler. wxWidgets中EventHandler并不是简单的指消息(事件)处理函数,而是一个用于处理窗口系统消息的类.收到消息后,wxEventHandler会调用e ...

  10. XStream和Dom4j的区别

    对于搞技术的人来说,xml文件的处理应该并不陌生吧,先总述下,个人感觉XStream在处理XML文件和JavaBean对象互转时比较好,dom4j对常用的xml配置文件操作比较好点:首先,Dom4j ...