yield的语法规则是:
在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行。当没有可继续next()时,抛出异常,该异常可被for循环处理。
def fib(n):
def fib(n):
a, b = 0, 1
i = 0
while i < n:
yield b
a, b = b, a+b
i += 1
if __name__ == '__main__':
f = fib(10)
for item in f:
print(item)
python中,含有yield关键字的对象就是一个生成器,每次调用next方法时会执行到yield后面的语句,然后返回yield后面代码块的执行结果
def foo():
bar_a = yield 1 # bar_a是语句块(yield 1)的返回值,默认为None
bar_b = yield bar_a
yield "最后一个值,再迭代就要报StopIteration了"
f = foo() # 创建生成器,此时没有执行foo()里的任何语句
print(next(f)) # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
print(next(f)) # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。
# 然后执行到语句块(yield bar_a),bar_b也还没有被创建
print(next(f)
>>>1
>>>None
>>>最后一个值,再迭代就要报StopIteration了
send()
def foo():
bar_a = yield 1
bar_b = yield bar_a
yield "最后一个值,再迭代就要报StopIteration了"
f = foo()
print(f.send(None)) # 和next(f)的效果一模一样
print(f.send("my lover")) # 覆盖yield 1语句的返回值
print(next(f))
>>>1
>>>my lover
>>>最后一个值,再迭代就要报StopIteration了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
时间:2020-05-30
Python字典生成式、集合生成式、生成器用法实例分析
本文实例讲述了Python字典生成式.集合生成式.生成器用法.分享给大家供大家参考,具体如下: 字典生成式: 跟列表生成式一样,字典生成式用来快速生成字典,不同的是,字典需要两个值 #d = {key: value for (key, value) in iterable} d1 = {'x': 1, 'y': 2, 'z': 3} d2 = {k: v for (k, v) in d1.items()} print(d2) 集合生成式: 集合生成式格式和列表生成式类似,不过用的是大括号: s1
python实现随机加减法生成器
本文实例为大家分享了python实现随机加减法生成器的具体代码,供大家参考,具体内容如下 为了让外甥女练习算术,用python给她写了个自动出加减法的小程序. 该程序使用了文字转语音的库pyttsx,程序运行时,会有相对应的语音提示.pyttsx文档 为了防止小孩乱按键盘,导致非法输入,我添加了异常处理: def validate(num):#判断输入是否非法 try: num=int(num) except: say("非法输入,请重新输入") return False return
Python+OpenCv制作证件图片生成器的操作方法
本项目使用Python和OpenCv实现身份证图片生成工具,填入信息,选择一张头像图片(即可生成黑白和彩色身份证图片).可以选择是否自动抠图,自动抠图目前仅支持蓝色背景,对自动抠图效果不满意可以手动抠图. 在线抠图地址: https://burner.bonanza.com/ https://www.gaoding.com/koutu 参照标准: 正面 "姓名"."性别"."民族"."出生年月日"."住址"
python 生成器和迭代器的原理解析
一.生成器简介 在python中,生成器是根据某种算法边循环边计算的一种机制.主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的数据超过内存四分之一的大小时就应该使用生成器. 二.生成器有什么特点? 1.和传统的容器相比,生成器更节省内存. 2.延迟计算,在我们需要结果时就调用一下生成器的next()方法即可. 3.可迭代,你可以像遍历list一样,遍历生成器 三.如何创建生成器? 在python中有两种方式创建生成器:生成
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
1.iterable iterator区别 要了解两者区别,先要了解一下迭代器协议: 迭代器协议是指:对象需要提供__next__()方法,它返回迭代中的元素,在没有更多元素后,抛出StopIteration异常,终止迭代. 可迭代对象就是:实现了迭代器协议的对象. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)通过迭代器协议访问对象,因此,for循环并不需要知道对象具体是什么,只需要知道对象能够实现迭代器协议即可. 迭代器(ite
python颜色随机生成器的实例代码
1. 代码: def random_color(number=number): color = [] intnum = [str(x) for x in np.arange(10)] #Out[138]: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] alphabet = [chr(x) for x in (np.arange(6) + ord('A'))] #Out[139]: ['A', 'B', 'C', 'D', 'E', 'F']
Python生成器的使用方法和示例代码
本文是<Effect Python 编写高质量Python代码的59个有效方法>的学习笔记.主要记录生成器的使用方法和示例代码. 返回队列的函数 如果函数要产生一系列结果,那么最简单的做法就是把这些结构都放在一份列表里,然后将其返回给调用者. def index_words(text): """用append方法将这些此的首字母索引添加到result列表中,并在函数结束时将其返回给调用者.""" result = [] if text
简单了解Python生成器是什么
前言 生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得不得去理解它.使用它.甚至爱上它. 提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作 Android 系统,那么生成器就是 iOS,二者功能上差不多,但是生成器更优雅. 什么是迭代器 顾名思义,迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实
简单了解python 生成器 列表推导式 生成器表达式
生成器就是自己用python代码写的迭代器,生成器的本质就是迭代器. 通过以下两种方式构建一个生成器: 1.通过生成器函数 2.生成器表达式 生成器函数: 函数 def func1(x): x += 1 return x print(func1(5)) 生成器函数 def func1(x): x += 1 yield x g_obj = func1(5) print(g_obj.__next__()) 一个next对应一个yield. yield VS return return 结束函数,给函
简单理解Python中基于生成器的状态机
简单生成器有许多优点.生成器除了能够用更自然的方法表达一类问题的流程之外,还极大地改善了许多效率不足之处.在 Python 中,函数调用代价不菲:除其它因素外,还要花一段时间解决函数参数列表(除了其它的事情外,还要分析位置参数和缺省参数).初始化框架对象还要采取一些建立步骤(据 Tim Peters 在 comp.lang.python 上所说,有 100 多行 C 语言程序:我自己还没检查 Python 源代码呢).与此相反,恢复一个生成器就相当省力:参数已经解析完了,而且框架对象正"无所事事
Python生成器定义与简单用法实例分析
本文实例讲述了Python生成器定义与简单用法.分享给大家供大家参考,具体如下: 一.什么是生成器 在Python中,由于受到内存的限制,列表容量肯定是有限的.例如我们创建一个包含一亿个元素的列表,Python首先会在内存中开辟足够的空间来存储这个包含一亿个元素的列表,然后才允许用户去使用这个列表,这就可能会导致以下问题: 1.内存中没有足够的内存空间开存储这个列表,从而导致列表无法创建 2.即使列表成功创建,然而仍会消耗很长的时间,导致程序效率低下 3.若用户只想访问列表前面的几个元素,则后面
python生成器/yield协程/gevent写简单的图片下载器功能示例
本文实例讲述了python生成器/yield协程/gevent写简单的图片下载器功能.分享给大家供大家参考,具体如下: 1.生成器: '''第二种生成器''' # 函数只有有yield存在就是生成器 def test(i): while True: i += 1 res = yield i print(res) i += 1 return res def main(): t = test(1) # 创建生成器对象 print(next(t)) # next第一次执行从上到下,yield是终点 p
python生成器推导式用法简单示例
本文实例讲述了python生成器推导式用法.分享给大家供大家参考,具体如下: 1.生成器推导式是继列表推导式后的有一中python推导式,他比列表推导式速度更快,占用的内存也更少. 2.使用生成器对象时,可以根据需要将他转化为列表或者元组,也可以是哟个生成器对像__next__()方法或内置函数next()进行遍历,其具有惰性求值的特点,进行一次遍历后便不能再次方位内部元素,即访问一次立马清空生成器对象 >>> g = ((i+2)**2 for i in range(10)) >
简单谈谈python中的语句和语法
python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句中,多条语句组成代码块,多个代码块再组成一整个程序.python的核心其实是由语句和表达式组成.所以在这里简单探讨一下python中的语句和表达式. 因为以后可能会接触到两个版本的python,所以这里讲一讲python2与python3的语句差异: 1.python2中没有nolocal语句. 2.prin
Python生成器以及应用实例解析
本文研究的主要是Python生成器及其应用,具体如下. 一.定义 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象 二.生成器的两种形式(Python有两种不同的方式提供生成器) 1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 yield的功能: 把函数的结果做生迭代器(以一
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
本文实例讲述了Python 生成器,迭代,yield关键字,send()传参给yield语句操作.分享给大家供大家参考,具体如下: demo.py(生成器,yield关键字): # 生成器是一个特殊的迭代器.可以用for...in遍历. # 带有yield关键字的函数,不再是一个函数,而是一个生成器模板.调用该模板会返回一个生成器对象. def create_num(all_num): a, b = 0, 1 current_num = 0 while current_num < all_num
Python生成器generator用法示例
本文实例分析了Python生成器generator用法.分享给大家供大家参考,具体如下: 生成器generator本质是一个函数,它记住上一次在函数体中的位置,在生成器函数下一次调用,会自动找到该位置,局部变量都保持不变 l = [x * 2 for x in range(10)] # 列表生成式 g = (x * 2 for x in range(10)) print(l,g) # l打印的是一个列表,g则是一个generator的内存地址 一次性打印获取generator的所有元素: for