生成器
生成器的本質(zhì)就是一個迭代器
生成器和迭代器的區(qū)別:
? 生成器是 python 自帶的
? 生成器是程序員寫的
生成器
定義一個生成器
基于函數(shù)
函數(shù)體中存在 yield 就是一個生成器
函數(shù)名 ( ) 就是產(chǎn)生一個生成器
推導(dǎo)式
list : [ ] [ 變量(加工后的變量) for 循環(huán) 加工條件]
dic : {} {鍵 : 值 for 循環(huán) 加工條件}
set : { } {變量 (加工后的變量) for 循環(huán) 加工條件 }
生成迭代器 : ( 變量 (加工后的變量) for 循環(huán) 加工條件)
內(nèi)置函數(shù)
迭代器:python 中內(nèi)置的一種節(jié)省空間的工具
生成器的本質(zhì)是一個迭代器
迭代器和生成器額區(qū)別 : 一個是 python 自帶的,一個是程序員自己寫的
def func(): if 3 > 2: yield "你好" if 4 > 2: yield "我好" yield "大家好"g = func()print(g.__next__())print(g.__next__())print(g.__next__())#你好我好大家好下面這樣的結(jié)果也是一樣的def func(): if 3 > 2: yield "你好" if 4 > 2: yield "我好" yield "大家好"g = func()for i in g: print(i)
# for 循環(huán)的本質(zhì)while True: try: print(g.__next__()) except StopIteration : break
def foo(): for i in range(10): pass yield i count = 1 while True: yield count count = 1g = foo()print(next(g))print(next(g))print(next(g))# 或者for i in g print(i)
這里是新的坑def foo(): for i in range(10): pass yield i count = 1 while True: yield count count = 1print(foo().__next__())print(foo().__next__()) #記住這個是調(diào)用新的生成器#00
send() 只是了解def func(): a = yield "是send" print(a) yield "你好"g = func()print(g.send(None)) #send 第一次只能是 Noneprint(g.send(123))
def func(): lst = [] for i in range(1000000): lst.append(i) return lstprint(func()) #這個結(jié)果實(shí)在是太強(qiáng)大了,雞蛋太多 所以找只雞 想吃就下一個所以參考下面的代碼def func(): for i in range(100000): yield ig = func()for i in range(50): #想吃幾個拿幾個 print(next(g))
def func(): lst1 = ["牛肉羊","雞蛋羹","玉米","火腿腸","米飯","拉面"] for i in lst1: yield ig = func()print(next(g))print(next(g))#牛肉羊雞蛋羹
def func(): lst1 = ["牛肉羊","雞蛋羹","玉米","火腿腸","米飯","拉面"] lst2 = ["小浣熊","蘋果","梨子","桃子","西瓜","芒果"] yield from lst1 yield from lst2g = func()print(next(g))print(next(g))結(jié)果牛肉羊雞蛋羹
def func(): lst1 = ["牛肉羊","雞蛋羹","玉米","火腿腸","米飯","拉面"] lst2 = ["小浣熊","蘋果","梨子","桃子","西瓜","芒果"] yield from lst1 yield from lst2g = func()print(next(g))print(next(g)) #是先走完 lst1 然后再走 lst2for i in g : #結(jié)果牛肉羊雞蛋羹玉米火腿腸米飯拉面小浣熊蘋果梨子桃子西瓜芒果
生成器總結(jié):
list 推導(dǎo)式[變量 for i in range(20)]lst = []for i in range(20): lst.append(i)print(lst) 為了簡潔代碼 有了以下的操作print(list(i for i in range(20)))
篩選模式[變量(加工后的變量) for 循環(huán) 加工方式]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 ])這兩個的結(jié)果是一樣的,你看第二個多簡潔
生成器表達(dá)式循環(huán)模式g = (i for i in range(20))print(next(g))print(next(g))print(list([i for i in range(20)]))
#字典模式 # {鍵:值 for 循環(huán) 加工條件}print({i:i 1 for i in range(10)})#{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}print({i:i 1 for i in range(20) if i % 2 == 0}){0: 1, 2: 3, 4: 5, 6: 7, 8: 9, 10: 11, 12: 13, 14: 15, 16: 17, 18: 19}
集合推導(dǎo)式print({i for i in range(20)}){0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}print({i for i in range(20) if i % 2 == 0 }){0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
list:# [變量(加工后的變量) for循環(huán)]# [變量(加工后的變量) for循環(huán) 加工條件]# 生成器表達(dá)式:# (變量(加工后的變量) for循環(huán))# (變量(加工后的變量) for循環(huán) 加工條件)# 字典推導(dǎo)式:# {鍵:值 for循環(huán) 加工條件}# 集合推導(dǎo)式:# {變量(加工后的變量) for循環(huán) 加工條件}
eval:執(zhí)行字符串類型的代碼,并返回最終結(jié)果。
eval('2 2') # 4n=81eval("n 4") # 85eval('print(666)') # 666
exec:執(zhí)行字符串類型的代碼。
s = '''for i in [1,2,3]: print(i)'''exec(s)
以上兩個內(nèi)置函數(shù)很強(qiáng)大 工作中禁止使用
hash:獲取一個對象(可哈希對象:int,str,Bool,tuple)的哈希值。
print(hash(12322))print(hash('123'))print(hash('arg'))print(hash('alex'))print(hash(True))print(hash(False))print(hash((1,2,3)))'''-2996001552409009098-463751598188813973912528502973977326415'''
help:函數(shù)用于查看函數(shù)或模塊用途的詳細(xì)說明。
print(help(list))print(help(str.split))
callable:函數(shù)用于檢查一個對象是否是可調(diào)用的。如果返回True,仍然可能調(diào)用失??;但如果返回False,調(diào)用對象ojbect絕對不會成功。
name = 'alex'def func(): passprint(callable(name)) # Falseprint(callable(func)) # True
int:函數(shù)用于將一個字符串或數(shù)字轉(zhuǎn)換為整型。
print(int()) # 0print(int('12')) # 12print(int(3.6)) # 3print(int('0100',base=2)) # 將2進(jìn)制的 0100 轉(zhuǎn)化成十進(jìn)制。結(jié)果為 4
float:函數(shù)用于將整數(shù)和字符串轉(zhuǎn)換成浮點(diǎn)數(shù)。
complex:函數(shù)用于創(chuàng)建一個值為 real imag * j 的復(fù)數(shù)或者轉(zhuǎn)化一個字符串或數(shù)為復(fù)數(shù)。如果第一個參數(shù)為字符串,則不需要指定第二個參數(shù)。。
print(float(3)) # 3.0print(complex(1,2)) # (1 2j)
bin:將十進(jìn)制轉(zhuǎn)換成二進(jìn)制并返回。
oct:將十進(jìn)制轉(zhuǎn)化成八進(jìn)制字符串并返回。
hex:將十進(jìn)制轉(zhuǎn)化成十六進(jìn)制字符串并返回。
print(bin(10),type(bin(10))) # 0b1010 <class 'str'>print(oct(10),type(oct(10))) # 0o12 <class 'str'>print(hex(10),type(hex(10))) # 0xa <class 'str'>
divmod:計算除數(shù)與被除數(shù)的結(jié)果,返回一個包含商和余數(shù)的元組(a // b, a % b)。
round:保留浮點(diǎn)數(shù)的小數(shù)位數(shù),默認(rèn)保留整數(shù)。
pow:求xy次冪。(三個參數(shù)為xy的結(jié)果對z取余)
print(divmod(7,2)) # (3, 1)print(round(7/3,2)) # 2.33print(round(7/3)) # 2print(round(3.32567,3)) # 3.326print(pow(2,3)) # 兩個參數(shù)為2**3次冪print(pow(2,3,3)) # 三個參數(shù)為2**3次冪,對3取余。
bytes:用于不同編碼之間的轉(zhuǎn)化。
# s = '你好'# bs = s.encode('utf-8')# print(bs)# s1 = bs.decode('utf-8')# print(s1)# bs = bytes(s,encoding='utf-8')# print(bs)# b = '你好'.encode('gbk')# b1 = b.decode('gbk')# print(b1.encode('utf-8'))
ord:輸入字符找當(dāng)前字符編碼的位置
chr:輸入當(dāng)前編碼的位置數(shù)字找出其對應(yīng)的字符
# ord 輸入字符找該字符編碼的位置# print(ord('a'))# print(ord('中'))# chr 輸入位置數(shù)字找出其對應(yīng)的字符# print(chr(97))# print(chr(20013))
repr:返回一個對象的string形式(原形畢露)。
# %r 原封不動的寫出來# name = 'taibai'# print('我叫%r'%name)# repr 原形畢露print(repr('{"name":"alex"}'))print('{"name":"alex"}')
all:可迭代對象中,全都是True才是True
any:可迭代對象中,有一個True 就是True
# all 可迭代對象中,全都是True才是True# any 可迭代對象中,有一個True 就是True# print(all([1,2,True,0]))# print(any([1,'',0]))
來源:https://www.icode9.com/content-4-339751.html