Python是一種非常容易學(xué)習(xí)的語(yǔ)言,而且它不會(huì)強(qiáng)迫你使用特定的慣例。但它也很容易陷入一些誤區(qū),讓你看起來(lái)像個(gè)初學(xué)者。為了避免看起來(lái)像個(gè)完全的初學(xué)者,請(qǐng)查看下面的提示以及如何解決這些問(wèn)題。
Python使得遍歷諸如列表之類(lèi)的事物變得非常容易。讓我們看看下面的示例:
vals = ['Python', 'is', 'fun!']for val in vals: print(val)# Returns:# Python# is# fun!
但是,如果你需要引用每個(gè)項(xiàng)目的索引,該怎么辦呢?你可能已經(jīng)遇到或者甚至編寫(xiě)了類(lèi)似下圖所示的代碼:
vals = ['Python', 'is', 'fun!']for i in range(len(vals)): print(i, vals[i])# Returns:# 0 Python# 1 is# 2 fun!
這種方法雖然可行,但它并不優(yōu)雅。它也不能立即清楚地說(shuō)明你的代碼在做什么。
這就是enumerate()函數(shù)的用武之地!讓我們看看它如何使這個(gè)過(guò)程變得更加簡(jiǎn)單:
vals = ['Python', 'is', 'fun!']for idx, val in enumerate(vals): print(idx, val)# Returns:# 0 Python# 1 is# 2 fun!
作為一個(gè)專(zhuān)業(yè)提示,你甚至可以改變起始值。比如說(shuō),你想從1開(kāi)始標(biāo)記項(xiàng)目,那么你可以這樣簡(jiǎn)單地寫(xiě):
vals = ['Python', 'is', 'fun!']for idx, val in enumerate(vals, start=1): print(idx, val) # Returns:# 1 Python# 2 is# 3 fun!
當(dāng)你使用if-else語(yǔ)句來(lái)分配值時(shí),你需要編寫(xiě)很多行代碼來(lái)完成一個(gè)簡(jiǎn)單的操作。請(qǐng)看下面的場(chǎng)景:
amount = 100if amount > 50: raise_amount = 20else: raise_amount = 10print(raise_amount)# Returns:# 20
在上面的例子中,我們創(chuàng)建了一個(gè)if-else語(yǔ)句,檢查某人的銷(xiāo)售金額是否超過(guò)50。如果是,那么他們就獲得20的漲幅。否則,他們獲得10的漲幅。
雖然我們的代碼很干凈,但并不簡(jiǎn)潔。我們可以通過(guò)使用三元賦值來(lái)大大簡(jiǎn)化它:
amount = 100raise_amount = 20 if amount > 50 else 10print(raise_amount)# Returns:# 20
這種方法最適用于非常簡(jiǎn)單的作業(yè)。雖然可以做得更復(fù)雜,但不要為了簡(jiǎn)潔而犧牲可讀性。
Python推導(dǎo)式使創(chuàng)建列表、字典和生成器變得輕而易舉。它們提供了一種優(yōu)雅且易讀的方式來(lái)輕松創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。
讓我們看一個(gè)例子,看看如何使用for循環(huán)來(lái)創(chuàng)建一個(gè)平方數(shù)列表:
squares = []for i in range(1, 6): squares.append(i ** 2)print(squares)# Returns:# [1, 4, 9, 16, 25]
現(xiàn)在,讓我們將其與列表推導(dǎo)式進(jìn)行比較:
squares = [i ** 2 for i in range(1, 6)]print(squares)# Returns:# [1, 4, 9, 16, 25]
我們可以看到使用列表推導(dǎo)式要簡(jiǎn)單和明確得多!代碼不僅更簡(jiǎn)潔,而且也更容易閱讀。
創(chuàng)建字典推導(dǎo)式也同樣簡(jiǎn)單。讓我們?cè)俅伪容^這兩種方法,創(chuàng)建一個(gè)字典,其中鍵是原始數(shù)字,值是它的平方:
squares = {}for i in range(1, 6): squares[i] = i ** 2print(squares)# Returns:# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
現(xiàn)在,讓我們看看如何通過(guò)字典推導(dǎo)式來(lái)簡(jiǎn)化這一過(guò)程。
squares = {i: i**2 for i in range(1, 6)}print(squares)# Returns:# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
現(xiàn)在,過(guò)度使用推導(dǎo)式也是一個(gè)問(wèn)題。所以在這里有一個(gè)額外的提示:除非有必要,否則不要什么都用它們。
Python推導(dǎo)式非常強(qiáng)大。你可以?xún)?nèi)置復(fù)雜的if-else語(yǔ)句,甚至可以將它們嵌套在彼此之中。
讓我們看看如何加入if-else語(yǔ)句:
even_odd_numbers = [ "Even" if num % 2 == 0 else "Odd" for num in range(10)]print(even_odd_numbers)# Returns:# ['Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even', 'Odd']
在上面的例子中,我們使用三元運(yùn)算符在繼續(xù)迭代的同時(shí)返回一個(gè)值。現(xiàn)在,這個(gè)例子相當(dāng)簡(jiǎn)單,但讓我們看一個(gè)更復(fù)雜的例子:
result = [x * 2 if x % 2 == 0 else x * 3 for x in range(10) if x != 5]
這絕對(duì)不是什么有趣、可讀的東西。這就引出了這里的重點(diǎn)——如果推導(dǎo)式比使用for循環(huán)更不清晰,那就不要寫(xiě)推導(dǎo)式。
讓我們將這個(gè)推導(dǎo)式轉(zhuǎn)換為一個(gè)循環(huán),看看它變得有多易讀:
result = []for x in range(10): if x != 5: if x % 2 == 0: result.append(x * 2) else: result.append(x * 3)
可以看到,雖然我們用了更多行來(lái)編寫(xiě)這段代碼,但它的可讀性卻大大提高了。
Python的itertools是內(nèi)置于Python中的一個(gè)函數(shù)庫(kù)。雖然表面上看,它的許多函數(shù)似乎很簡(jiǎn)單,但它們提供了優(yōu)雅而強(qiáng)大的方式來(lái)遍歷不同的對(duì)象。
假設(shè)你有兩個(gè)列表,你想遍歷所有可能的組合。可以編寫(xiě)如下所示的嵌套for循環(huán):
colors = ['Red', 'Green']sizes = ['S', 'M', 'L']for color in colors: for size in sizes: print(color, size)# Returns:# Red S# Red M# Red L# Green S# Green M# Green L
與我們?cè)诒疚闹薪榻B的其他方法類(lèi)似,這種方法雖然有效,但并不優(yōu)雅。
值得慶幸的是,itertools提供了product()函數(shù),它可以創(chuàng)建所有項(xiàng)目的笛卡爾積。這意味著我們可以在一個(gè)for循環(huán)中直接解包這些值,代碼如下所示:
from itertools import productcolors = ['Red', 'Green']sizes = ['S', 'M', 'L']for color, size in product(colors, sizes): print(color, size)# Returns:# Red S# Red M# Red L# Green S# Green M# Green L
可以看到這種方法簡(jiǎn)單多了。
在某些情況下,你需要成對(duì)地遍歷列表,這意味著你需要訪問(wèn)一個(gè)項(xiàng)目及其相鄰的項(xiàng)目。
要做到這一點(diǎn),可以編寫(xiě)以下代碼:
vals = [1, 2, 3, 4]for i in range(len(vals) - 1): print((vals[i], vals[i+1]))# Returns:# (1, 2)# (2, 3)# (3, 4)
這種方法效果很好,但可讀性不強(qiáng),其作用也不是很明確。
這就是Python 3.10引入的pairwise()函數(shù)的用武之地。讓我們看看如何簡(jiǎn)化代碼:
from itertools import pairwisevals = [1, 2, 3, 4]for pair in pairwise(vals): print(pair)# Returns:# (1, 2)# (2, 3)# (3, 4)
這是我們之前編寫(xiě)的代碼的一個(gè)更加明確的版本,使我們能夠立即了解代碼的目的。
itertools庫(kù)為用戶(hù)提供了許多有用的對(duì)象迭代函數(shù)。知道何時(shí)應(yīng)用這些函數(shù)可以將你的技能提升到更高的層次。
掌握Python不僅僅是記住語(yǔ)法,更重要的是擁抱優(yōu)雅,并知道何時(shí)在簡(jiǎn)潔和可讀性之間取得平衡。
牢記Python之禪:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
上述提示應(yīng)能真正幫助你領(lǐng)悟Python之禪的這一開(kāi)始的幾行。
本文鏈接:http://www.www897cc.com/showinfo-26-92153-0.html四個(gè)Python初學(xué)者式的錯(cuò)誤及其優(yōu)化建議
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com