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的操做:  app

#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

案例:ide

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同樣的做用,那麼咱們可不能夠這樣作:spa

def foo():
    while True:
        x = yield              #函數有yield,函數執行的結果就是生成器,即foo()就是生成器。而要執行的話就須要next(g).
        print("value:",x)

g = foo()
g.send(1) #執行給yield傳值,這樣行不行呢?

很明顯,是不行的;3d

TypeError: can't send non-None value to a just-started generator

錯誤提示:不能傳遞一個非空值給一個未啓動的生成器。code

  也就是說,在一個生成器函數未啓動以前,是不能傳遞數值進去。必須先傳遞一個None進去或者調用一次next(g)方法,才能進行傳值操做。對象

三:內置函數blog

 

abs(x)            #取絕對值,若是是複數,返回值是該複數的模
divomd(x,y)     #函數完成除法運算,返回商和餘數
isinstance(object,type)    #判斷對象是否是此類型
chr()                 #函數返回ASCII碼對應的字符串    
ord()                   #函數返回字符串對應的ASCII碼
max(),min()      #返回函數的最大值與最小值(字母:z>a)

 內置函數實例/:ip

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
相關文章
相關標籤/搜索