開始今日份總結html
今日目錄python
1.生成器函數
2.列表推導式spa
3.匿名函數debug
4.裝飾器code
開始今日份總結htm
1.生成器對象
1.1 生成器的定義blog
定義:生成器本質就是迭代器,生成器是本身用python代碼寫的迭代器內存
1.1.1 生成器函數
def func(): yield 666 yield '三包春藥' ret = func() #函數中含有yield這個關鍵字參數就是一個生成器函數 print(next(ret)) print(next(ret)) print(next(ret)) #一個next對應一個yield,若是輸入多的next則報錯 #StopIteration錯誤
對於yield與return之間的差異
1.1.2 生成器的用法
如今有一個需求:商家須要500個搪瓷杯,找甲乙倆家生產搪瓷杯,甲一次性備料,一次性生產完畢,乙根據生產需求,提了需求,而後生產一部分
甲廠
def glass(): for i in range(500): print('%s號杯子'%i) glass()
乙廠
def glass2(): for i in range(500): yield '%s號杯子'%i obj = glass2() for i in range(100): print(next(obj)) for j in range(20): print(next(obj)) #能夠分批,根據訂單來生產商品,第一批100,第二批20
經過上面咱們能夠得知生成器的特色
1.2 send的用法
send的用法,不止能對應yield傳值,也能夠給上一個yield發送一個值
def func(): msg1 =yield '111' print(msg1) msg2 = yield 'abc' print(msg2) yield [12,13,14] genor = func() print(genor.send(None)) print(genor.send('ABC')) print(genor.send(333)) #結果 111 ABC abc 333 [12, 13, 14] #例外狀況一:第一個send不爲空 報錯:can't send non-None value to a just-started generator 謹記send是對上一個yield賦值 #例外狀況二:在最後一個位置多輸入一個send 報錯:StopIteration 謹記send和和yield是一一對應,多一個就會報這個錯誤
1.3 yield from的用法
這個是最新的python 3.x的用法
#按照咱們的想法應該是迭代的輸出test1.test2 .test3. test4 def func(): li =['test1','test2','test3','test4'] yield li obj = func() for i in obj: print(i) #結果 ['test1', 'test2', 'test3', 'test4'] #緣由是yield是將li當作是單獨的元素返回出來,並非一個個出來 #爲了改善,只能將如下方法 def func(): li =['test1','test2','test3','test4'] yield from li obj = func() for i in obj: print(i) #結果 test1 test2 test3 test4 #yield from是將一個可迭代對象變爲迭代器
2.列表推導式
2.1 列表推導式的優勢以及經常使用的三種方法
列表推導式:用一行代碼構建簡單或者較複雜的列表,還有爲了減小代碼量,還有最重要的裝逼(不知道會不會被打)
2.1.1 循環模式
列表結構: [ 變量(加工後的變量)for 變量 in iterable ]
print([i for i in range(1,101)]) #構建一個列表:['python1期', 'python2期',....'python25期'] l1 = ['python%s期' %i for i in range(1,26)] print(l1) #很簡單的構建了一個列表
2.1.2 篩選模式
列表結構:[變量(加工後的變量)for 變量 in interable if 條件]
# 三十之內全部的偶數留到列表中 # print([i for i in range(1,31) if i % 2 == 0]) # 30之內全部能被3整除的數 # print([i for i in range(1,31)if i % 3 == 0]) # 30之內全部能被3整除的數的平方 # print([i**2 for i in range(1,31)if i % 3 == 0]) # ['地球1號', '地球3號','地球5號',....'地球99號',] # print(['地球%s號'% i for i in range(1,100,2)])
2.1.3 三元模式(循環模式)
其實就是帶三元運算的循環模式
# 構建一個列表:列表裏面的元素是1~20,可是能被3整除元素替換成*。 # ret = '*' if 3>2 else 1 # print(ret) # print(['*' if i % 3 == 0 else i for i in range(1,21)]) # 將至少含有兩個e的名字放到一個列表中 # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], # ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # print([name for l in names for name in l if name.count('e') >= 2])
列表推導式的優缺點
優勢:一行搞定,節省代碼量,高逼格
缺點:
2.2 生成器表達式
與列表推導式基本如出一轍,只是[]換成了()
# l1 = ['python%s期' %i for i in range(1,26)] # gentor = ('python%s期' %i for i in range(1,26)) # print(gentor) # for i in gentor: # print(i)
2.3 字典推導式,集合推導式(瞭解)
# print({i:None for i in range(1,10)}) # mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15} # print({value:key for key,value in mcase.items()}) # # set1 = {1, -2, 3, -4, 4} # print({i ** 2 for i in set1})
3.匿名函數
def func(x, y): return x + y
# print(func(3,4))
# 針對於只有返回值的這樣的函數:python 提供了一個函數能夠簡化:
# 匿名函數。一行函數
func2 = lambda x,y: x + y
print(func2(3,4))
# 寫一個匿名函數:須要三個數字參數,返回值爲三個數相乘
4.裝飾器
詳細內容請看
https://www.cnblogs.com/gbq-dog/p/10222938.html