python 基礎(chǔ) 05
1.生成器
#生成器
#生成器的本質(zhì)就是迭代器。他與迭代器的區(qū)別是,生成器是我么自己用py#thon代碼構(gòu)建的數(shù)據(jù)結(jié)構(gòu),迭代器是他提供的,或者轉(zhuǎn)化來的
#獲取生成器的三種方式:
##生成器函數(shù)
##生成器表達(dá)式
##python內(nèi)部提供的一些
#生成器函數(shù)獲取生成器
def func():
print(111)
print(222)
yield 3
yield 4
ret = func()
#ret就變成了生成器對象,因為生成器本質(zhì)上是個迭代器,所以這個ret就是個迭代器對象,普通打印只能打印內(nèi)存地址
print(ret) #<generator object func at 0x01DA83E0>
#要想打印ret,要用到 next() 函數(shù) 或 __next__ 方法
print(next(ret)) #或 print(ret.__next__())
print(ret.__next__())
#return yield
#return : 函數(shù)中只存在一個return結(jié)束函數(shù),并且給函數(shù)執(zhí)行者返回值
#yield : 只要函數(shù)中有 yield ,函數(shù)就是生成器函數(shù),yield 不結(jié)束
# 函數(shù),一個yield對應(yīng)一個next()
#吃包子
#用可迭代對象
def func3():
l1 = []
for i in range(1,5001):
l1.append(f"{i}號包子")
return l1
ret = func3()
print(ret)
#用生成器
def func2():
for i in range(1,5001):
yield f"{i}號包子"
ret = func2()
for i in range(200):
print(next(ret))
#yield from
def func4():
l1 = [1,2,3,4,5]
yield from l1
#將列表變成迭代器返回
ret = func4()
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
#如果使用多個 yield from,那就會先把第一個 yield from 迭代完了再執(zhí)行第二個
def func():
lst1 = ['衛(wèi)龍','老冰棍','北冰洋','牛羊配']
lst2 = ['饅頭','花卷','豆包','大餅']
yield from lst1
yield from lst2
g = func()
#因為,g是個迭代器了,就可以直接用for 循環(huán)去遍歷他,然后打印,for循環(huán)內(nèi)
#本來就是要把可迭代對象轉(zhuǎn)換為迭代器然后一個一個執(zhí)行的
for i in g:
print(i)
# 簡述一下yield 與yield from的區(qū)別。
#
# 看下面代碼,能否對其簡化?說說你簡化后的優(yōu)點?
#
#
def chain(*args):
# ('abc',(0,1,2))
for it in args:
for i in it:
yield i
g = chain('abc',(0,1,2))
怎么讓生成器產(chǎn)出值?
next ,for 循環(huán), 轉(zhuǎn)化成list
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(list(g))
print(list(g)) # 將迭代器轉(zhuǎn)化成列表
def chain(*args):
# ('abc',(0,1,2))
for it in args:
yield from it # 'abc' (0,1,2)
g = chain('abc',(0,1,2))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(list(g))
# yield from 優(yōu)化了內(nèi)層循環(huán),提高了效率。
def func():
# yield [1,2,3]
yield from [1,2,3]
'''
yield 1
yield 2
yield 3
'''
g = func()
print(next(g))
print(next(g))
print(next(g))
2.列表推導(dǎo)式
#用一行代碼構(gòu)建一個比較復(fù)雜且有規(guī)律的列表
#列表推導(dǎo)式分為兩種:
#1.循環(huán)模式:[表達(dá)式 for i in iterable]
#2.篩選模式:[表達(dá)式 for i in iterable if 條件]
#列表推倒式只能構(gòu)建比較復(fù)雜且有規(guī)律的列表
#超過三層循環(huán)才能構(gòu)建成功的列表不推薦使用
#查找錯誤能力低,不好看出來錯誤。debug模式不行
#但是列表推導(dǎo)式更簡單,更裝逼。
#比如我們創(chuàng)建一個含有1-10的列表,原來都這么干
l1=[]
for i in range(1,11):
l1.append(i)
print(l1)
#用列表推倒式
l1 = [i for i in range(1,11)]
print(l1)
#循環(huán)模式
##將10以內(nèi)所有整數(shù)的平方寫入列表
l2 = [i*i for i in range(1,11)]
print(l2)
##100以內(nèi)所有的偶數(shù)寫入列表
l3 = [i for i in range(1,101) if i%2==0]
print(l3)
##從'python1期'到'python100期'寫入列表lst
l4 = [f'python{i}期' for i in range(1,101)]
print(l4)
#篩選模式
##30以內(nèi)能被3整除的數(shù)
l5 = [i for i in range(1,31) if i%3==0]
print(l5)
#過濾掉長度小于3的字符串列表,并將剩下的轉(zhuǎn)換成大寫字母
l = ['wusir', 'laonanhai', 'aa', 'b', 'taibai']
l6 = [i.upper() for i in l if len(i)>=3]
print(l6)
#找到嵌套列表中名字含有兩個‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
l7 = [name for i in names for name in i if name.count('e')==2]
print(l7)
#用列表推導(dǎo)式構(gòu)建一個列表[2,3,4,5,6,7,8,9,10,'J','Q','k','A']
l8 = [i for i in range(2,11)]+list('JQKA')
print(l8)
3.生成器表達(dá)式
#生成器表達(dá)式
#與列表推倒式寫法幾乎一模一樣
#就是把列表推倒式的中括號[]改成小括號()
#與列表推導(dǎo)式的區(qū)別
#寫法上:[] ()
#本質(zhì)上,列表推導(dǎo)式得到個iterable對象,生成器表達(dá)式得到一個生成器iterator
#列表推導(dǎo)式
print([i for i in range(1,11)])
#生成器表達(dá)式,有點就是省內(nèi)存
obj = (i for i in range(1,11))
for i in obj:
print(i)
4.字典推導(dǎo)式與集合推導(dǎo)式
#字典推導(dǎo)式
#
lst1 = ['jay','jj','meet']
lst2 = ['周杰倫','林俊杰','郭寶元']
dict1 = {lst2[i]:lst1[i] for i in range(len(lst1))}
print(dict1)
#集合推導(dǎo)式
s1 = {i for i in range(1,11)}
print(s1)
5.次要的內(nèi)置函數(shù)
#內(nèi)置函數(shù) 68個
#這個文件里邊的,了解就好
#次重要的內(nèi)置函數(shù)
# eval() 剝?nèi)プ址庖?,把字符串?dāng)代碼運(yùn)行,這個東西很危險據(jù)說,
# 在網(wǎng)絡(luò)傳輸?shù)?str input 輸入的時候,sql注入的時候絕對不用
# eval()是有返回值的
s1 = '1 + 3'
print(s1)
print(eval(s1))
s = '{"name":"alex"}'
print(s,type(s))
#print(dict(s)) #會報錯
print(eval(s),type(eval(s)))
# exec() 與eval()幾乎一樣,處理代碼流的
msg = '''
for i in range(10):
print(i)
'''
print(msg)
exec(msg)
#hash() 獲取一個對象的哈希值
# 不可變對象才具有哈希值
print(hash('owfjfosjfio'))
# help() 獲取方法對象的使用方法
print(help(str))
print(help(str.upper))
# callable() 判斷一個對象是否可調(diào)用,就是能不能加括號()
s1 = 'jsofjiofjio'
print(callable(s1))
def func():
pass
print(callable(func))
# int() 將一個字符串或數(shù)字轉(zhuǎn)換為整型
# float() 將整數(shù)或字符串轉(zhuǎn)換成浮點數(shù)
# complex() 函數(shù)用于創(chuàng)建一個值為 real + imag * j 的復(fù)數(shù)或者轉(zhuǎn)化一個字符串或數(shù)為復(fù)數(shù)。如果第一個參數(shù)為字符串,則不需要指定第二個參數(shù)
print(complex(1,2))
# bin() 將十進(jìn)制轉(zhuǎn)化為二進(jìn)制字符串并返回
print(bin(10),type(bin(10))) # 0b1010 <class 'str'>
# oct() 將十進(jìn)制轉(zhuǎn)化為八進(jìn)制字符串并返回
print(oct(10),type(oct(10))) # 0o12 <class 'str'>
# hex() 將十進(jìn)制轉(zhuǎn)換為十六進(jìn)制字符串并返回
print(hex(10),type(hex(10))) # 0xa <class 'str'>
# divmod() 計算除數(shù)與被除數(shù)的結(jié)果,返回一個包含商和余數(shù)的元組(a // b, a % b)
print(divmod(7,2)) # (3, 1)
# round() 保留浮點數(shù)的小數(shù)位數(shù),默認(rèn)保留整數(shù)
print(round(7/3,2))
print(round(7/3))
print(round(3.1415926,3))
# pow() 求x**y次冪,三個參數(shù)為 x**y 的結(jié)果對 z 取余(取對數(shù))
print(pow(2,3))
print(pow(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() 輸入字符找該字符的編碼的位置
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
print(all([1,2,True,0]))
# any() 可迭代對象中,有一個True 就是 True
print(any([1,'',0]))