day8-基礎函數的學習(三)

開始今日份總結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之間的差異

  • 倆者都會返回值,return是給函數的執行者返回值,yield是給next()返回值
  • 碰到return會結束函數,yield只會凍結函數,有一個next喚醒輸出

   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])

列表推導式的優缺點

優勢:一行搞定,節省代碼量,高逼格

缺點:

  • 不能用debug模式
  • 列表推導式有毒,會盲目去使用列表推導式去寫,建議超過三層的不要輕易使用列表推導式

  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

相關文章
相關標籤/搜索