yield

Why is this python generator returning the same value everytime?

独自空忆成欢 提交于 2019-12-28 01:11:55
问题 I have this generator that yields lists: def gen(): state = [None] for i in range(5): state[0] = i yield state And here's the output, when I call it: >>> list(gen()) [[4], [4], [4], [4], [4]] Why are all the elements [4] ? Shouldn't it be [[0], [1], [2], [3], [4]] ? 回答1: You are reusing the same list object. Your generator returns the one object over and over again, manipulating it as it goes, but any other references to it see those same changes: >>> r = list(gen()) >>> r [[4], [4], [4], [4]

python基础之Day14

好久不见. 提交于 2019-12-28 01:11:20
一、生成器 1、什么是生成器   在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值称之为生成器,生成器本质就是迭代器 2、为什么要有生成器  生成器是一种自定义迭代器的方式  注:   生成器在刚刚生成时不执行里面任何代码 总结yield的功能 1、提供一种自定义迭代器的方式 2、yield可以暂停住函数,返回值 yield VS return 相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制 不同点:return只能返回一次值,yield可以返回多次值 用yield写一个简单的range函数 1 2 3 4 5 def my_range(start,stop,step = 1 ) while stat<stop: yield start start + = step g = my_range( 0 , 4 )  二、杂项 1、三元表达式 条件成立时返回值 if条件 else 条件不成立时返回值 例如: def max2(x,y)   if x>y:     return x   else:     return y x=10 y=20 max2(x,y) 上述功能可以直接使用三元表达式实现: res=x if x>y else y print(res) 2、列表生成式 l=[item**2 for item in range(1

What's the yield keyword in JavaScript?

試著忘記壹切 提交于 2019-12-27 11:50:33
问题 I heard about a "yield" keyword in JavaScript, but I found very poor documentation about it. Can someone explain me (or recommend a site that explains) its usage and what it is used for? 回答1: The MDN documentation is pretty good, IMO. The function containing the yield keyword is a generator. When you call it, its formal parameters are bound to actual arguments, but its body isn't actually evaluated. Instead, a generator-iterator is returned. Each call to the generator-iterator's next() method

python函数

こ雲淡風輕ζ 提交于 2019-12-27 09:52:38
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 。 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 def ChangeInt(a): a = 10 b = 2 ChangeInt(b) print(b) def changeme(mylist): "修改传入的列表" mylist.append([1, 2, 3, 4]) print("函数内取值: ", mylist) return # 调用changeme函数 mylist = [10, 20, 30] changeme(mylist) print("函数外取值: ", mylist) def printme(str): "打印任何传入的字符串" print(str) return #

Python-迭代器和生成器

▼魔方 西西 提交于 2019-12-27 07:25:23
一、递归和迭代:   1、递归(问路的案例)     递归算法是自己调用自己的过程   2、迭代(父生子,子生孙)       更新换代 二、迭代器协议:   1、迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发StopTteration异常,已终止迭代(只能往下走,不能往上走)   2、可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)   3、协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(for循环,sum,max,min函数等)使用迭代器协议访问对象   4、for循环的本质就是遵循迭代器协议取访问对象,那么for循环的对象肯定都是迭代器。   5、不可迭代对象:字符串,列表,元组,字典,集合,文件对象。只不过for循环时,调用了他们的内部__iter__()方法,把他们变成了可迭代对象     -注-       1、生成器是可迭代对象       2、实现了延迟计算,看内存(按需执行)         3、生成器本质和其他类型一样,都是实现了迭代器协议,只不过生成器是一边计算一边生成,从而节省内存空间,其余的可迭代对象没有这个功能 三、迭代器:     1、遵循迭代器协议的访问方式: 1 x='hello' # 非可迭代对象 2 # print(dir(x)) 3 iter

python_10 迭代器和生成器

徘徊边缘 提交于 2019-12-27 07:21:27
迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义_iter_方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象 for循环机制: for循环的本质:循环所有对象,全都是使用迭代器协议。 (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环时,调用了他们内部的_iter_方法,把他们变成了可迭代对象 然后for循环调用可迭代对象的_next_方法去取值,而且for循环会捕捉Stopiteration异常,以终止迭代。 s='abc' s_i=s.__iter__() print(s_i.__next__()) print(s_i.__next__()) print(s_i.__next__()) print(s_i.__next__())#抛StopIteration异常 >>>a >>>b >>>c >>>a Traceback (most recent call last): b File "E:/ch/Pylearning/Learning_09.py",

Python的迭代器与生成器

喜你入骨 提交于 2019-12-27 07:12:10
Python中的生成器和迭代器方便好用,但是平时对生成器和迭代器的特性掌握的不是很到位,今天将这方面的知识整理一下。 迭代器 为了更好的理解迭代器和生成,我们需要简单的回顾一下迭代器协议的概念。 迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。 for循环 for循环的本质:循环所有对象,全都是使用迭代器协议。 for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了, 列表,字符串,元组,字典,集合,文件对象等本质上来说都不是可迭代对象,在使用for循环的时候内部是先调用他们内部的_iter_方法,使他们变成了可迭代对象,然后在使用可迭代对象的_next_方法依次循环元素,当元素循环完时,会触发StopIteration异常,for循环会捕捉到这种异常,终止迭代。

Python学习:yield的使用

∥☆過路亽.° 提交于 2019-12-27 04:12:19
初步认识 1、首先将yield看成一个return,即返回的操作语义; 2、其次,将yield看成一个生成器的一部分。 范例1 通过一个代码范例来演示下yield所起的作用: def foo ( ) : print ( "starting..." ) while True : res = yield 4 print ( "res:" , res ) g = foo ( ) print ( next ( g ) ) print ( "*" * 20 ) print ( next ( g ) ) 以上代码的输出结果为: starting . . . 4 ** ** ** ** ** ** ** ** ** ** res : None 4 代码运行的步骤解释如下: 1、程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象); 2、直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环; 3、程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g)

迭代器和生成器

情到浓时终转凉″ 提交于 2019-12-27 03:50:39
迭代器和生成器 迭代和可迭代 什么是迭代(iteration)? 如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来,如果我们想要访问所有的元素,那我们可以用for循环来遍历这个list或者tuple,而这种遍历我们就叫做迭代。 可迭代(iterable)? 其实你已经知道,不是所有的数据类型都是可迭代的。那么可迭代的数据类型都有什么特点呢? print(dir([1,2])) print(dir((2,3))) print(dir({1:2})) print(dir({1,2})) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '_

18、迭代器和生成器

别等时光非礼了梦想. 提交于 2019-12-27 03:47:32
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 1、处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器) 2、 批量处理文件,用户指定要查找的目录和内容,将本层目录下所有文件中包含要查找内容的每一行都输出到屏幕 本篇导航: 可迭代的 迭代器 生成器 列表推导式和生成器表达式 一、可迭代的 for i in 50: print(i) #运行结果: # Traceback (most recent call last): # File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in <module> # for i in 50: # TypeError: 'int' object is not iterable 报错: TypeError: 'int' object is not iterable 类型报错:'int'对象是不可迭代的 何为迭代? iterable: 可迭代的;迭代的; 可迭代的:从上面代码可以简单分析出能被for循环取值的就是可迭代,那么我们就可以初步总结出可迭代的类型: str、list、tuple、set、dict 可迭代的 ——对应的标志 拥有__iter__方法 print('__iter__' in dir([1,2,3]))