yield的表达式形式与内置函数
Posted 俊先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yield的表达式形式与内置函数相关的知识,希望对你有一定的参考价值。
yield的功能:
1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行。
2.为封装好的的函数能够使用__iter__和__next__方法,
3.遵循迭代器的取值方式 .__next__(),触发函数的执行和函数的保存都是通过yeild保存的。 .
一:yield的表达式形式
def foo(): print(‘starting‘) while True: x=yield #yield的表达式形式 print(‘value : ‘,x) g=foo() next(g) #next(g)==g.semd(None) g.send(2) #send的效果:1.将携带的值传给yield,注意是yiled,而不是x,然后yiled赋值给x 2.send()方法具有和next()方法一样的功能,也就是继续执行,直到碰到yield结束.
yield表达式形式(例如: x = yield)下,生成器会有一个send的操作:
#send的效果:
# 1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
# 2:与next的功能一样
def foo(): print(‘starting‘) while True: x=yield print(‘value:‘,x) foo() #next(g) # g.send(1) foo()#不执行print(‘starting‘),因为定义该函数,解释器在检测语法的时候,检测到有yield,那么在执行该函数的时候就不会打印。 g.send(1) ###send 有///传值+next的功能,传值给yield,再赋值给x,再接着往后走,直到下一个yield停止。 g.send-----1567890`124680>首先要给一个初始化的值,才能再g.send(1)传值
案例:
def good(func): def good1(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return good1 @good def eater(name): print(‘%s starting to eat ‘%name) food_list=[] while True: food=yield food_list food_list.append(food) print(‘%s start to eat %s‘%(name,food)) print(food_list) m=eater(‘jason‘) m.send(‘火腿‘)
注意点:
既然send()方法有和next一样的作用,那么我们可不可以这样做:
def foo(): while True: x = yield #函数有yield,函数执行的结果就是生成器,即foo()就是生成器。而要执行的话就需要next(g). print("value:",x) g = foo() g.send(1) #执行给yield传值,这样行不行呢?
很明显,是不行的;
TypeError: can‘t send non-None value to a just-started generator
错误提示:不能传递一个非空值给一个未启动的生成器。
也就是说,在一个生成器函数未启动之前,是不能传递数值进去。必须先传递一个None进去或者调用一次next(g)方法,才能进行传值操作。
二:内置函数
abs(x) #取绝对值,如果是复数,返回值是该复数的模 divomd(x,y) #函数完成除法运算,返回商和余数 isinstance(object,type) #判断对象是不是此类型 chr() #函数返回ASCII码对应的字符串 ord() #函数返回字符串对应的ASCII码 max(),min() #返回函数的最大值与最小值(字母:z>a)
内置函数实例/:
func2=lambda x:x**2 #匿名函数:相当于return x**2 # map:映射 # l=[1,2,3,4] # m=map(lambda x:x**2,l) #reduce:合并 from functools import reduce print(reduce(lambda x,y:x+y,range(100),100)) # filter:过滤 # names=[‘alex_sb‘,‘yuanhao_sb‘,‘wupeiqi_sb‘,‘egon‘] # print(list(filter(lambda name:name.endswith(‘_sb‘),names))) # #sorted 升序 # l=[1,2,4,9,-1] # print(sorted(l)) #从小到大 # print(sorted(l,reverse=True)) #从大到小
# s=‘hello‘ # l=[1,2,3] # # for i in zip(s,l): #拉链,s,l 一一随对应 # print(i) l=[‘a‘,‘b‘,‘c‘] for i in enumerate(l): print(i) # =========结果========== (0, ‘a‘) (1, ‘b‘) (2, ‘c‘)
以上是关于yield的表达式形式与内置函数的主要内容,如果未能解决你的问题,请参考以下文章