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的功能一样
  #3: send传多个值时,必须以元组的形式
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: 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)) #从大到小
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

 

 

posted on 2017-06-21 22:41  俊先生  阅读(620)  评论(0编辑  收藏  举报