python 基礎(chǔ) 05 生成器,列表推導(dǎo)式,次要的內(nèi)置函數(shù)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容