导航:首页 > 编程语言 > pythony

pythony

发布时间:2022-01-28 19:37:07

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函数

next()一次执行一次,并不一次性执行完,是个itertator.也可以通过for来执行

㈢ python中yield是什么意思

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

具体,请参考下以下资料:
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

㈣ python 中yield后面可不可再执行后面的语句

你好 python 并不会自动缓存数据, 极度怀疑你数据没插入成功,或者插入操作不在那个2秒SLEEP的时间里面。

㈤ 关于Python的yield关键字

单看这一句,意思是在说: 如果traindata==True,函数就返回(ID,x,y),否则返回(ID,x)。

㈥ python yield列表去重

如果你想对list去重的话,就直接这样:
a = [5, 5, 2, 1, 9, 1, 5, 10]
a = list(set(a))

㈦ Python yield 语句

我在2x版本下测试下显式调用throw来抛出GeneratorExit异常是可以被捕获的

我查了一下文档,楼主你的理解可能错了,文档的意思是说迭代器调用close退出时如果处于暂停状态就会内部产生一个GeneratorExit异常,这个异常是不能捕获的,内部会转换成RuntimeError抛出

正常退出的话则产生StopIteration异常

测试代码如下

defmy_generator():
try:
yield'dosomething'
exceptValueError:
yield'dealingwiththeexceptions'
exceptGeneratorExit:
yield"Yes,Icanyieldavalue"
finally:
print"Ok,let'sclean"

gen=my_generator()
gen.next()#这行注释掉后则不会抛出异常
try:
gen.close()
exceptRuntimeError:
print"closeerror"

㈧ python的关键字yield有什么作用

yield是python中定义为生成器函数,其本质是封装了 __iter__和__next__方法 的迭代器;



与return返回的区别:return只能返回一次值,函数就终止了,而yield能多次返回值,每次返回都会将函数暂停,下一次next会从上一次暂停的位置继续执行;



以下用示例说明:



deftest(a,b):
print("fromtest(),a+b=%d"%(a+b))
return("我是return返回的")

deftest_yield(a,b): #函数体中有yield关键字,函数就可以称为生成器函数
print("fromtest_yield,a+b=%d"%(a+b))
yield("我是第一次碰到yield关键字返回的") #程序运行时碰到yield,退出函数体并记录位置,下次调用跳过之前运行的代码
print("fromtest_yield,a*2=%d"%(a*2))
yield("我是第二次调用碰到yield关键字返回的")

print(test(11,33))
g=test_yield(11,33)
print(next(g)) #通过next()调用生成器函数
print(next(g)) #第二次调用生成器函数


'''
执行结果:

fromtest(),a+b=44
我是return返回的
fromtest_yield,a+b=44
我是第一次碰到yield关键字返回的
fromtest_yield,a*2=22
我是第二次调用碰到yield关键字返回的

'''

㈨ Python的yield问题

python yield from

defgenerator2():
foriinrange(10):
yieldidefgenerator3():
forjinrange(10,20):
yieldjdefgenerator():
foriingenerator2():
yieldi
forjingenerator3():
yieldj

==

defgenerator():
yieldfromgenerator2()
yieldfromgenerator3()

㈩ python 怎么用yield 返回一个列表

yield yield是用于生成器。什么是生成器,你可以通俗的认为,在一个函数中,使用了yield来代替return的位置的函数,就是生成器。它不同于函数的使用方法是:函数使用return来进行返回值,每调用一次,返回一个新加工好的数据返回给你

阅读全文

与pythony相关的资料

热点内容
华为荣耀系统编译 浏览:730
看板块app哪个好用 浏览:666
java即时编译结果怎么保存 浏览:907
java工程师在深圳 浏览:656
手机sql编译软件 浏览:524
外网服务器地址购买 浏览:994
空调压缩机电容价格 浏览:381
小程序选什么云服务器 浏览:656
如何把java编译回中文 浏览:777
天联软件服务器地址是什么 浏览:964
stc单片机加密 浏览:140
小程序地产广告源码 浏览:542
消费者信息加密私域 浏览:431
程序员开发团队可以怎么创业 浏览:925
设备共享服务器是什么意思 浏览:126
java符号类型 浏览:331
redis客户端java 浏览:214
javatn 浏览:278
应用宝哪里下载王卡免流量app 浏览:235
uv7代喷头加密与不加密 浏览:467