02Python-生成器函式-列表推導式-生成器表示式-匿名函式-內建函式
阿新 • • 發佈:2020-11-21
目錄
Day12
生成器函式
迭代器:Python中內建的一種節省空間的工具
生成器的本質就是一個迭代器
迭代器和生成器的區別: 一個是python自帶的,一個是程式設計師自己寫的
生成器產生方式,yield與return的區別
1.生成器函式
2.生成器表示式
3.python提供的一些內建函式,返回一個生成器
yield與return的區別:
return 結束函式;給函式的執行者返回一個值;(多個值通過元組的形式返回)。
yield 不結束函式;對應著給next返回值;(多個值通過元組的形式返回)。
生成器函式
def func(): print(111) return 2 ret = func() print(ret) # 執行此函式,遇到return結束函式; # 將數字2返回給ret def func(): print(111) yield 2 ret = func() # 生成器物件 print(ret) # <generator object func at 0x000001D13B582D00> # 只要函式中出現了yield,那麼它就不是函數了,它是生成器函式。 # 一個next對應一個yield print(next(ret)) # 111 2
生成器的舉例
def shuyang(): list1 = [] for i in range(1, 2001): list1.append(f'{i}只羊') return list1 print(shuyang()) def shuyang_v1(): for i in range(1, 2001): yield f'{i}只羊' ret = shuyang_v1() # print(ret.__next__()) # 1只羊 # print(next(ret)) # 2只羊 for i in range(200): print(next(ret)) for i in range(200): print(next(ret))
yield與yiled from
yield:對應next給next返回值;
yield from:將一個可迭代物件的每一個元素返回給next;節省程式碼,提升效率(代替了for迴圈);
def func():
l1 = [1,2,3]
yield from l1
'''
yield 1
yield 2
yield 3
'''
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
列表推導式,生成器表示式(字典推導式,集合推導式)
列表推導式
列表推導式:一行程式碼構建一個有規律比較複雜的列表。
列表推導式構建方式:
1.迴圈模式:[變數(加工後的變數) for 變數 in iterable]
2.篩選模式:[變數(加工後的變數) for 變數 in iterable if 條件]
列表推導式優缺點:
優點:簡單,快捷;
缺點:可讀性不高,不好拍錯;
迴圈模式
# lst = []
# for i in range(1,101):
# lst.append(i)
# print(lst)
l1 = [ i for i in range(1,101)]
print(l1)
將10以內所有整數的平方寫入列表:
print([i ** 2 for i in range(1,11)])
100以內所有的偶數寫入列表:
print([i for i in range(1,101,2)])
寫入1只羊到100只羊到列表:
print([f'{i}只羊' for i in range(1,101)])
篩選模式
lst = []
for i in range(20):
if i % 2 == 0:
lst.append(i)
print(lst)
print([i for i in range(20) if i % 2 == 0])
三十以內可以被4整除的數
print([i for i in range(1,31) if i % 4 == 0])
過濾長度小於3的字串列表,剩下的轉換成大寫字母
l1 = ['xiaoming', 'xiaohong', 'xx', 'dagouzi', 'ai']
print([i.upper() for i in l1 if len(i) > 3])
找到巢狀列表中名字包含有兩個'e'的所有名字
names = [['Tom', 'billy', 'jeff', 'adnre', 'weet', 'see', 'jill', 'timee','aege'],
['wang', 'tetate', 'aaaa','bbbb','ccc','edddae']]
l2 = []
for i in names:
for j in i:
if j.count('e') == 2:
l2.append(j)
print(l2)
# 推導式
print([j for i in names for j in i if j.count('e') == 2])
生成器表示式,節省記憶體
與列表推導式幾乎一模一樣:
迴圈模式,篩選模式
st = (i for i in range(1,10))
如何觸發生成器(迭代器)取值
1.next(st)
print(next(st))
2.for 迴圈
for i in st:
print(i)
3.資料轉化
print(list(st))
字典推導式
字典推導式和集合推導式也是有迴圈模式和篩選模式兩種
# 字典推導式
l1 = ['xiaoming', 'xiaohong', 'xiaogang','zhangsan', 'lisi']
# {0:'xiaoming", 1:'xiaohong', 2:'xiaogang', 3:'zhangsan', 4:'lisi'}
dic = {}
for i in range(len(l1)):
dic[i] = l1[i]
print(dic)
print({i:l1[i] for i in range(len(l1))})
集合推導式
print({i for i in range(10)})
print({i for i in range(10) if i % 2 == 0})
匿名函式
匿名函式:沒有名字的函式;
匿名函式只能構建簡單的函式,一句話函式;
def func(x,y):
return x + y
print(func(1,2))
# 匿名函式構建:lambda 關鍵字:定義一個匿名函式
func2 = lambda x,y: x + y
print(func2(1,2))
# 匿名函式經常用法:與內建函式結合使用
# 寫匿名函式:接受一個可切片的資料,返回索引為0與2對應的元素(元組形式)
lst = [1,2,3,4,5]
func = lambda x: (x[0],x[2])
print(func(lst))
# 寫匿名函式:接收兩個int引數,將較大的資料返回
func1 = lambda x, y: x if x > y else y
print(func1(2,4))
內建函式
內建函式:內建的函式;python內建函式68種;
str() dir() range() len() print()
max() min() open() input() type()
int() enumerate() list() id() set()
dict() iter() next() tuple() bool()
globals() locals() frozenset()
eval exce -- 慎用
# eval 剝去字串的外衣,返回裡面的本質
s = "{1: 'xiaoming'}"
ret = eval(s)
print(ret,type(ret))
s2 = '1 + 3'
print(s2)
print(eval(s2))
# exec 程式碼流,過程,沒有返回值
s3 = """
for i in range(3):
print(i)
"""
exec(s3)