首页 > 代码库 > yield的表达式形式与内置函数

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结束.
View Code

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)传值
View Code

案例:

技术分享
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(火腿)
View Code

 注意点:

既然send()方法有和next一样的作用,那么我们可不可以这样做:

def foo():
    while True:
        x = yield              #函数有yield,函数执行的结果就是生成器,即foo()就是生成器。而要执行的话就需要next(g).
        print("value:",x)

g = foo()
g.send(1) #执行给yield传值,这样行不行呢?

很明显,是不行的;

TypeError: cant 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)) #从大到小
View Code
技术分享
# 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)
View Code

 

 

yield的表达式形式与内置函数