成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
掌握Python不僅僅是記住語法,更重要的是擁抱優(yōu)雅,并知道何時在簡潔和可讀性之間取得平衡。

Python是一種非常容易學(xué)習(xí)的語言,而且它不會強迫你使用特定的慣例。但它也很容易陷入一些誤區(qū),讓你看起來像個初學(xué)者。為了避免看起來像個完全的初學(xué)者,請查看下面的提示以及如何解決這些問題。

1. 不使用enumerate()

Python使得遍歷諸如列表之類的事物變得非常容易。讓我們看看下面的示例:

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

# Returns:
# Python
# is
# fun!

但是,如果你需要引用每個項目的索引,該怎么辦呢?你可能已經(jīng)遇到或者甚至編寫了類似下圖所示的代碼:

vals = ['Python', 'is', 'fun!']
for i in range(len(vals)):
  print(i, vals[i])

# Returns:
# 0 Python
# 1 is
# 2 fun!

這種方法雖然可行,但它并不優(yōu)雅。它也不能立即清楚地說明你的代碼在做什么。

這就是enumerate()函數(shù)的用武之地!讓我們看看它如何使這個過程變得更加簡單:

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

# Returns:
# 0 Python
# 1 is
# 2 fun!

作為一個專業(yè)提示,你甚至可以改變起始值。比如說,你想從1開始標記項目,那么你可以這樣簡單地寫:

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

2. 不使用三元運算符

當(dāng)你使用if-else語句來分配值時,你需要編寫很多行代碼來完成一個簡單的操作。請看下面的場景:

amount = 100
if amount > 50:
    raise_amount = 20
else:
    raise_amount = 10

print(raise_amount)

# Returns:
# 20

在上面的例子中,我們創(chuàng)建了一個if-else語句,檢查某人的銷售金額是否超過50。如果是,那么他們就獲得20的漲幅。否則,他們獲得10的漲幅。

雖然我們的代碼很干凈,但并不簡潔。我們可以通過使用三元賦值來大大簡化它:

amount = 100
raise_amount = 20 if amount > 50 else 10

print(raise_amount)

# Returns:
# 20

這種方法最適用于非常簡單的作業(yè)。雖然可以做得更復(fù)雜,但不要為了簡潔而犧牲可讀性。

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

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

Python推導(dǎo)式使創(chuàng)建列表、字典和生成器變得輕而易舉。它們提供了一種優(yōu)雅且易讀的方式來輕松創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。

讓我們看一個例子,看看如何使用for循環(huán)來創(chuàng)建一個平方數(shù)列表:

squares = []
for i in range(1, 6):
    squares.append(i ** 2)

print(squares)

# Returns:
# [1, 4, 9, 16, 25]

現(xiàn)在,讓我們將其與列表推導(dǎo)式進行比較:

squares = [i ** 2 for i in range(1, 6)]
print(squares)

# Returns:
# [1, 4, 9, 16, 25]

我們可以看到使用列表推導(dǎo)式要簡單和明確得多!代碼不僅更簡潔,而且也更容易閱讀。

創(chuàng)建字典推導(dǎo)式也同樣簡單。讓我們再次比較這兩種方法,創(chuàng)建一個字典,其中鍵是原始數(shù)字,值是它的平方:

squares = {}
for i in range(1, 6):
    squares[i] = i ** 2

print(squares)

# Returns:
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

現(xiàn)在,讓我們看看如何通過字典推導(dǎo)式來簡化這一過程。

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)在,過度使用推導(dǎo)式也是一個問題。所以在這里有一個額外的提示:除非有必要,否則不要什么都用它們。

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

Python推導(dǎo)式非常強大。你可以內(nèi)置復(fù)雜的if-else語句,甚至可以將它們嵌套在彼此之中。

讓我們看看如何加入if-else語句:

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

在上面的例子中,我們使用三元運算符在繼續(xù)迭代的同時返回一個值?,F(xiàn)在,這個例子相當(dāng)簡單,但讓我們看一個更復(fù)雜的例子:

result = [x * 2 if x % 2 == 0 else x * 3 for x in range(10) if x != 5]

這絕對不是什么有趣、可讀的東西。這就引出了這里的重點——如果推導(dǎo)式比使用for循環(huán)更不清晰,那就不要寫推導(dǎo)式。

讓我們將這個推導(dǎo)式轉(zhuǎn)換為一個循環(huán),看看它變得有多易讀:

result = []
for x in range(10):
    if x != 5:
        if x % 2 == 0:
            result.append(x * 2)
        else:
            result.append(x * 3)

可以看到,雖然我們用了更多行來編寫這段代碼,但它的可讀性卻大大提高了。

4. 不使用itertools

Python的itertools是內(nèi)置于Python中的一個函數(shù)庫。雖然表面上看,它的許多函數(shù)似乎很簡單,但它們提供了優(yōu)雅而強大的方式來遍歷不同的對象。

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

假設(shè)你有兩個列表,你想遍歷所有可能的組合??梢跃帉懭缦滤镜那短譮or循環(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

與我們在本文中介紹的其他方法類似,這種方法雖然有效,但并不優(yōu)雅。

值得慶幸的是,itertools提供了product()函數(shù),它可以創(chuàng)建所有項目的笛卡爾積。這意味著我們可以在一個for循環(huán)中直接解包這些值,代碼如下所示:

from itertools import product
colors = ['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

可以看到這種方法簡單多了。

4.2 成對遍歷列表

在某些情況下,你需要成對地遍歷列表,這意味著你需要訪問一個項目及其相鄰的項目。

要做到這一點,可以編寫以下代碼:

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)

這種方法效果很好,但可讀性不強,其作用也不是很明確。

這就是Python 3.10引入的pairwise()函數(shù)的用武之地。讓我們看看如何簡化代碼:

from itertools import pairwise
vals = [1, 2, 3, 4]

for pair in pairwise(vals):
    print(pair)

# Returns:
# (1, 2)
# (2, 3)
# (3, 4)

這是我們之前編寫的代碼的一個更加明確的版本,使我們能夠立即了解代碼的目的。

itertools庫為用戶提供了許多有用的對象迭代函數(shù)。知道何時應(yīng)用這些函數(shù)可以將你的技能提升到更高的層次。

結(jié)論

掌握Python不僅僅是記住語法,更重要的是擁抱優(yōu)雅,并知道何時在簡潔和可讀性之間取得平衡。

牢記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之禪的這一開始的幾行。

責(zé)任編輯:武曉燕 來源: Python學(xué)研大本營
相關(guān)推薦

2024-05-08 12:41:29

Python編程語言

2023-01-17 09:27:18

Python語言

2014-01-03 14:09:57

Git學(xué)習(xí)

2022-07-22 15:55:32

Python代碼語言

2015-09-28 11:15:03

java初學(xué)者建議

2021-01-11 09:13:55

UbuntuLinux發(fā)行版

2025-04-07 01:35:00

Go語言程序

2024-08-17 12:14:06

2022-06-15 15:30:29

Linux新用戶建議

2016-11-11 20:33:53

Hadoop大數(shù)據(jù)云計算

2009-02-18 11:10:40

c++忠告方法

2022-10-19 23:18:27

KubernetesPod錯誤

2024-03-11 18:17:18

Python字符串分隔符

2020-09-06 08:19:11

Python編程語言開發(fā)

2013-03-12 10:26:41

PHP編程語言

2016-10-08 10:15:18

Linux

2010-11-05 09:16:56

PHP

2019-08-29 08:58:24

Python布爾型編程語言

2011-09-16 09:38:19

Emacs

2022-04-24 15:21:01

MarkdownHTML
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕电影在线观看 | 欧美视频中文字幕 | 天天天天操 | 二区不卡| 激情a | 999精品视频| 久久综合成人精品亚洲另类欧美 | 成在线人视频免费视频 | 麻豆va | 精品国产欧美一区二区三区成人 | 国产激情精品视频 | 一级片片 | 亚洲精品视频在线播放 | 日本综合在线观看 | 奇米久久久 | 欧美精品在线播放 | 久久久久精 | 欧美网址在线观看 | 国产精品毛片无码 | 国产精品久久久久久久模特 | h视频在线免费 | 日韩毛片中文字幕 | 99这里只有精品视频 | 久草视频在线播放 | 日本一区二区不卡 | 欧美性一区二区三区 | 福利社午夜影院 | 久久精品一区 | 黄色毛片网站在线观看 | 91精品国产一区二区在线观看 | 国产午夜精品一区二区三区嫩草 | 在线一区二区三区 | av三级| 日韩精品一区二 | 99热国产免费 | 台湾佬久久 | 91素人| 亚洲免费视频在线观看 | 国产福利二区 | 久久久久久国产精品免费免费 | 91久久 |