① python中yield是什么意思
一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
具体,请参考下以下资料:
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
② Python初学者,python中return和yield怎么用的两个有什么区别
return:函数在return的地方返回,并跳出,后续代码均不执行
yield:yield 的作用就是把一个函数变成一个 generator,函数执行到yield 时返回并退出,下次调用时从yield 的下一句代码执行
③ 如何理解Python关键字yield
当函数被调用时,函数体中的代码是不会运行的,函数仅仅是返回一个生成器对象。这里理解起来可能稍微有点复杂。
函数中的代码每次会在 for循环中被执行,接下来是最难的一部分:
for第一次调用生成器对象时,代码将会从函数的开始处运行直到遇到 yield为止,然后返回此次循环的第一个值,接着循环地执行函数体,返回下一个值,直到没有值返回为止。
④ python中print,return和yield的区别
def func1(): for i in range(1, 5): print idef func2(): for i in range(1, 5): return idef func3(): for i in range(1, 5): yield i
func1()
print func2()print func3()
1.print并不会阻断程序的执行,就不用多说了。
2.func2()方法中的循环执行第一次就被return结束掉了。(后面的2、3、4就不会有返回的机会了)
3.yield你可以通俗的叫它"轮转容器",可用现实的一种实物来理解:水车,先yield来装入数据、产出generator object、使用next()来释放;好比水车转动后,车轮上的水槽装入水,随着轮子转动,被转到下面的水槽就能将水送入水道中流入田里。
def func3(): for i in range(1,5): yield i#装入 gob = func3()#generator 类型print next(gob)#1 释放的第一个装入的数据,(先入先出)print next(gob)#2print next(gob)#3print next(gob)#4
print next(gob)#报错
个人理解,yield在python内部是当作list处理的:
def func3(): for i in range(1,5): yield i
yi = []
yi = func3()for y in yi: print y
1
2
3
4
⑤ 如何理解Python关键字yield
理解迭代的内部机制
迭代是操作可迭代对象(实现了 __iter__()
方法)和迭代器(实现了 __next__()
方法)的过程。可迭代对象是任何你可以从其得到一个迭代器对象的任意对象(译注:调用内建函数iter()),迭代器是能让你在可迭代对象上进行迭代的对象(译注:这里好绕,迭代器实现了 __iter__()
方法,因此它也是一个可迭代对象)。
⑥ python中return和yield怎么用的两个有什么区别
常看到别人使用或讨论yield语法,能搜到的中文解释却不多,今天决心搞定yield,把暂时的理解贴到这里.
搞定yield之前: 叠代器(iterator)
发现yield: 生成器(constructor)
使用yield: 递归调用
1. iterator
叠代器最简单例子应该是数组下标了,且看下面的c++代码:
int array[10];
for ( int i = 0; i < 10; i++ )
printf("%d ", array[i]);
叠代器工作在一个容器里(array[10]),它按一定顺序(i++)从容器里取出值(array[i])并进行操作(printf("%d ", array[i])。
上面的代码翻译成python:
array = [i for i in range(10)]
for i in array:
print i,
for i in array干了什么(别乱想)?首先,array作为一个list是个容器,其次list这个内建类型有默认的next行为,python发现这些之后采 取的秘密的没被各位看到的动作是:拿出array这丫容器的叠代器,从里面next一下把值给i供for循环主体处置,for把这个值print了。
现在的问题是数据可以做容器叠代,代码可以吗?
怎么不行,碗碟可以用来放菜,wk们不就联想出用nt盛吗,当然我们的yield不会那么yellow + bt
2. constructor
怎么把函数变成constructor? 在函数体里有yield就行了!
def gen():
print 'enter'
yield 1
print 'next'
yield 2
print 'next again'
for i in gen():
print i
各位!python看到gen函数里出现yield,知道可以用next了,问题是怎么对代码这个容器玩next?
从容器里拿到iterator的时候它还什么也不是,处在容器入口处,对于数组来说就是下标为-1的地方,对于函数来说就是函数入口嘛事没干,但是万事俱备就欠next。
开始for i in g,next让itreator爬行到yield语句存在的地方并返回值,
再次next就再爬到下一个yield语句存在的地方并返回值,依次这样直到函数返回(容器尽头)。
您一定看出来上面代码的输出是:
enter
1
next
2
next again
如果没看出来请不要往下看了免得反被yield搞定。
3. 使用yield
yield的代码叠代能力不但能打断函数执行还能记下断点处的数据,下次next书接上回,这正是递归函数需要的。
例如中序遍历二叉树:
(应该是David Mertz写的)
def inorder(t):
if t:
for x in inorder(t.left):
yield x
yield t.label
for x in inorder(t.right):
yield x
for n in inorder(tree)
print n
当然yield这种代码next的能力还可以用在其它方面,发现拍案的在贴咯。
⑦ python中yield和return有什么区别
yield
yield是用于生成器。什么是生成器,你可以通俗的认为,在一个函数中,使用了yield来代替return的位置的函数,就是生成器。它不同于函数的使用方法是:函数使用return来进行返回值,每调用一次,返回一个新加工好的数据返回给你;yield不同,它会在调用生成器的时候,把数据生成object,然后当你需要用的时候,要用next()方法来取,同时不可逆。你可以通俗的叫它"轮转容器",可用现实的一种实物来理解:水车,先yield来装入数据、产出generator object、使用next()来释放;好比水车转动后,车轮上的水槽装入水,随着轮子转动,被转到下面的水槽就能将水送入水道中流入田里。
def func3():
for i in range(1,5):
yield i#装入
gob = func3()#generator 类型
print next(gob)#1 释放的第一个装入的数据,(先入先出)
print next(gob)#2
print next(gob)#3
print next(gob)#4
print next(gob)#报错
复制代码
return
这个大家都知道了,一句话,return既可以终止函数的执行,也可以返回函数加工处理好的数据,只是这个数据需要一个载体来进行保存,通常是变量。非条件判断的时候,只要遇见return,函数就结束执行。
⑧ 如何理解Python关键字yield
理解迭代的内部机制
迭代是操作可迭代对象(实现了 __iter__()
方法)和迭代器(实现了 __next__()
方法)的过程。可迭代对象是任何你可以从其得到一个迭代器对象的任意对象(译注:调用内建函数iter()),迭代器是能让你在可迭代对象上进行迭代的对象(译注:这里好绕,迭代器实现了 __iter__()
方法,因此它也是一个可迭代对象)。
⑨ yield 是什么 python
单看这一句,意思是在说:如果traindata==True,函数就返回(ID,x,y),否则返回(ID,x)。