日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

四個(gè)Python初學(xué)者式的錯(cuò)誤及其優(yōu)化建議

來(lái)源: 責(zé)編: 時(shí)間:2024-06-05 17:45:28 152觀看
導(dǎo)讀Python是一種非常容易學(xué)習(xí)的語(yǔ)言,而且它不會(huì)強(qiáng)迫你使用特定的慣例。但它也很容易陷入一些誤區(qū),讓你看起來(lái)像個(gè)初學(xué)者。為了避免看起來(lái)像個(gè)完全的初學(xué)者,請(qǐng)查看下面的提示以及如何解決這些問(wèn)題。1. 不使用enumerate()Pyth

Python是一種非常容易學(xué)習(xí)的語(yǔ)言,而且它不會(huì)強(qiáng)迫你使用特定的慣例。但它也很容易陷入一些誤區(qū),讓你看起來(lái)像個(gè)初學(xué)者。為了避免看起來(lái)像個(gè)完全的初學(xué)者,請(qǐng)查看下面的提示以及如何解決這些問(wèn)題。f1s28資訊網(wǎng)——每日最新資訊28at.com

1. 不使用enumerate()

Python使得遍歷諸如列表之類(lèi)的事物變得非常容易。讓我們看看下面的示例:f1s28資訊網(wǎng)——每日最新資訊28at.com

vals = ['Python', 'is', 'fun!']for val in vals:    print(val)# Returns:# Python# is# fun!

但是,如果你需要引用每個(gè)項(xiàng)目的索引,該怎么辦呢?你可能已經(jīng)遇到或者甚至編寫(xiě)了類(lèi)似下圖所示的代碼:f1s28資訊網(wǎng)——每日最新資訊28at.com

vals = ['Python', 'is', 'fun!']for i in range(len(vals)):  print(i, vals[i])# Returns:# 0 Python# 1 is# 2 fun!

這種方法雖然可行,但它并不優(yōu)雅。它也不能立即清楚地說(shuō)明你的代碼在做什么。f1s28資訊網(wǎng)——每日最新資訊28at.com

這就是enumerate()函數(shù)的用武之地!讓我們看看它如何使這個(gè)過(guò)程變得更加簡(jiǎn)單:f1s28資訊網(wǎng)——每日最新資訊28at.com

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ě):f1s28資訊網(wǎng)——每日最新資訊28at.com

vals = ['Python', 'is', 'fun!']for idx, val in enumerate(vals, start=1):    print(idx, val)    # Returns:# 1 Python# 2 is# 3 fun!

2. 不使用三元運(yùn)算符

當(dāng)你使用if-else語(yǔ)句來(lái)分配值時(shí),你需要編寫(xiě)很多行代碼來(lái)完成一個(gè)簡(jiǎn)單的操作。請(qǐng)看下面的場(chǎng)景:f1s28資訊網(wǎng)——每日最新資訊28at.com

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的漲幅。f1s28資訊網(wǎng)——每日最新資訊28at.com

雖然我們的代碼很干凈,但并不簡(jiǎn)潔。我們可以通過(guò)使用三元賦值來(lái)大大簡(jiǎn)化它:f1s28資訊網(wǎng)——每日最新資訊28at.com

amount = 100raise_amount = 20 if amount > 50 else 10print(raise_amount)# Returns:# 20

這種方法最適用于非常簡(jiǎn)單的作業(yè)。雖然可以做得更復(fù)雜,但不要為了簡(jiǎn)潔而犧牲可讀性。f1s28資訊網(wǎng)——每日最新資訊28at.com

3. 使用推導(dǎo)式

3.1 不使用推導(dǎo)式

Python推導(dǎo)式使創(chuàng)建列表、字典和生成器變得輕而易舉。它們提供了一種優(yōu)雅且易讀的方式來(lái)輕松創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。f1s28資訊網(wǎng)——每日最新資訊28at.com

讓我們看一個(gè)例子,看看如何使用for循環(huán)來(lái)創(chuàng)建一個(gè)平方數(shù)列表:f1s28資訊網(wǎng)——每日最新資訊28at.com

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)行比較:f1s28資訊網(wǎng)——每日最新資訊28at.com

squares = [i ** 2 for i in range(1, 6)]print(squares)# Returns:# [1, 4, 9, 16, 25]

我們可以看到使用列表推導(dǎo)式要簡(jiǎn)單和明確得多!代碼不僅更簡(jiǎn)潔,而且也更容易閱讀。f1s28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建字典推導(dǎo)式也同樣簡(jiǎn)單。讓我們?cè)俅伪容^這兩種方法,創(chuàng)建一個(gè)字典,其中鍵是原始數(shù)字,值是它的平方:f1s28資訊網(wǎng)——每日最新資訊28at.com

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ò)程。f1s28資訊網(wǎng)——每日最新資訊28at.com

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è)額外的提示:除非有必要,否則不要什么都用它們。f1s28資訊網(wǎng)——每日最新資訊28at.com

3.2 過(guò)度使用推導(dǎo)式

Python推導(dǎo)式非常強(qiáng)大。你可以?xún)?nèi)置復(fù)雜的if-else語(yǔ)句,甚至可以將它們嵌套在彼此之中。f1s28資訊網(wǎng)——每日最新資訊28at.com

讓我們看看如何加入if-else語(yǔ)句:f1s28資訊網(wǎng)——每日最新資訊28at.com

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ù)雜的例子:f1s28資訊網(wǎng)——每日最新資訊28at.com

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)式。f1s28資訊網(wǎng)——每日最新資訊28at.com

讓我們將這個(gè)推導(dǎo)式轉(zhuǎn)換為一個(gè)循環(huán),看看它變得有多易讀:f1s28資訊網(wǎng)——每日最新資訊28at.com

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ě)這段代碼,但它的可讀性卻大大提高了。f1s28資訊網(wǎng)——每日最新資訊28at.com

4. 不使用itertools

Python的itertools是內(nèi)置于Python中的一個(gè)函數(shù)庫(kù)。雖然表面上看,它的許多函數(shù)似乎很簡(jiǎn)單,但它們提供了優(yōu)雅而強(qiáng)大的方式來(lái)遍歷不同的對(duì)象。f1s28資訊網(wǎng)——每日最新資訊28at.com

4.1 避免嵌套循環(huán)

假設(shè)你有兩個(gè)列表,你想遍歷所有可能的組合。可以編寫(xiě)如下所示的嵌套for循環(huán):f1s28資訊網(wǎng)——每日最新資訊28at.com

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)雅。f1s28資訊網(wǎng)——每日最新資訊28at.com

值得慶幸的是,itertools提供了product()函數(shù),它可以創(chuàng)建所有項(xiàng)目的笛卡爾積。這意味著我們可以在一個(gè)for循環(huán)中直接解包這些值,代碼如下所示:f1s28資訊網(wǎng)——每日最新資訊28at.com

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)單多了。f1s28資訊網(wǎng)——每日最新資訊28at.com

4.2 成對(duì)遍歷列表

在某些情況下,你需要成對(duì)地遍歷列表,這意味著你需要訪問(wèn)一個(gè)項(xiàng)目及其相鄰的項(xiàng)目。f1s28資訊網(wǎng)——每日最新資訊28at.com

要做到這一點(diǎn),可以編寫(xiě)以下代碼:f1s28資訊網(wǎng)——每日最新資訊28at.com

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),其作用也不是很明確。f1s28資訊網(wǎng)——每日最新資訊28at.com

這就是Python 3.10引入的pairwise()函數(shù)的用武之地。讓我們看看如何簡(jiǎn)化代碼:f1s28資訊網(wǎng)——每日最新資訊28at.com

from itertools import pairwisevals = [1, 2, 3, 4]for pair in pairwise(vals):    print(pair)# Returns:# (1, 2)# (2, 3)# (3, 4)

這是我們之前編寫(xiě)的代碼的一個(gè)更加明確的版本,使我們能夠立即了解代碼的目的。f1s28資訊網(wǎng)——每日最新資訊28at.com

itertools庫(kù)為用戶(hù)提供了許多有用的對(duì)象迭代函數(shù)。知道何時(shí)應(yīng)用這些函數(shù)可以將你的技能提升到更高的層次。f1s28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論

掌握Python不僅僅是記住語(yǔ)法,更重要的是擁抱優(yōu)雅,并知道何時(shí)在簡(jiǎn)潔和可讀性之間取得平衡。f1s28資訊網(wǎng)——每日最新資訊28at.com

牢記Python之禪:f1s28資訊網(wǎng)——每日最新資訊28at.com

Beautiful is better than ugly.f1s28資訊網(wǎng)——每日最新資訊28at.com

Explicit is better than implicit.f1s28資訊網(wǎng)——每日最新資訊28at.com

Simple is better than complex.f1s28資訊網(wǎng)——每日最新資訊28at.com

Complex is better than complicated.f1s28資訊網(wǎng)——每日最新資訊28at.com

Flat is better than nested.f1s28資訊網(wǎng)——每日最新資訊28at.com

Sparse is better than dense.f1s28資訊網(wǎng)——每日最新資訊28at.com

Readability counts.f1s28資訊網(wǎng)——每日最新資訊28at.com

上述提示應(yīng)能真正幫助你領(lǐng)悟Python之禪的這一開(kāi)始的幾行。f1s28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接: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

上一篇: 萬(wàn)字聊一聊RocketMQ一條消息短暫而又精彩的一生

下一篇: 詳解51種企業(yè)應(yīng)用架構(gòu)模式

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 清水县| 舟山市| 湖南省| 朔州市| 赤峰市| 乡城县| 乐昌市| 天长市| 潞西市| 涪陵区| 和田县| 江油市| 华池县| 时尚| 思南县| 阿图什市| 当涂县| 罗甸县| 高碑店市| 石屏县| 睢宁县| 牡丹江市| 沾化县| 逊克县| 乐陵市| 玉田县| 抚州市| 土默特右旗| 昌乐县| 梅州市| 河东区| 朝阳市| 任丘市| 怀柔区| 都匀市| 昌吉市| 乌兰县| 德阳市| 博客| 星子县| 宣武区|