偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

11個(gè)技巧讓你編寫出更好的Python代碼

開發(fā) 后端
在本教程中,我們將展示11個(gè)技巧來編寫更好的Python代碼!我們展示了許多優(yōu)秀實(shí)踐,它們通過使代碼更加簡潔和更具python風(fēng)格來改進(jìn)代碼。

在本教程中,我們將展示11個(gè)技巧來編寫更好的Python代碼!我們展示了許多優(yōu)秀實(shí)踐,它們通過使代碼更加簡潔和更具python風(fēng)格來改進(jìn)代碼。以下是所有技巧的概述:

  • 使用enumerate()而不是range(len())進(jìn)行迭代
  • 使用列表comprehension代替原始的for循環(huán)
  • 使用內(nèi)置的Sort()方法對復(fù)雜的迭代進(jìn)行排序
  • 用集合存儲唯一的值
  • 使用generators節(jié)省內(nèi)存
  • 用.get()和.setdefault()在字典中定義默認(rèn)值
  • 用collections.Counter計(jì)數(shù)hashable對象
  • 用f- string格式化字符串(Python 3.6+)
  • 用.join()連接字符串
  • 用雙星號語法合并字典** (Python 3.5+)
  • 用if x in list簡化if語句,而不是單獨(dú)檢查每一項(xiàng)

 

1. 使用enumerate()而不是range(len())進(jìn)行迭代

如果我們需要遍歷一個(gè)列表,并且需要跟蹤索引和當(dāng)前項(xiàng),大多數(shù)人會使用range(len())語法。在本例中,我們希望遍歷一個(gè)列表,檢查當(dāng)前項(xiàng)是否為負(fù),并在本例中將列表中的值設(shè)置為0。雖然range(len())語法可以工作,但使用內(nèi)置的枚舉函數(shù)更好。這將以元組的形式返回當(dāng)前索引和當(dāng)前項(xiàng)。因此,我們可以直接檢查這里的值,也可以訪問帶有索引的項(xiàng)。

  1. data = [1, 2, -3, -4] 
  2. # weak: 
  3. for i in range(len(data)): 
  4.     if data[i] < 0: 
  5.         data[i] = 0 
  6.  
  7. # better: 
  8. data = [1, 2, -3, -4] 
  9. for idx, num in enumerate(data): 
  10.     if num < 0: 
  11.         data[idx] = 0 

 

2. 使用list comprehension代替原始的for循環(huán)

假設(shè)我們想要?jiǎng)?chuàng)建一個(gè)具有特定值的列表,在本例中是一個(gè)包含0到9之間所有平方數(shù)的列表。冗長乏味的方法是創(chuàng)建一個(gè)空列表,然后使用for循環(huán),進(jìn)行計(jì)算,并將其附加到列表中:

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

一種更簡單的方法是list comprehension。這里我們只需要一行來實(shí)現(xiàn)同樣的事情:

  1. # better: 
  2. squares = [i*i for i in range(10)] 

list comprehension能力非常強(qiáng)大,甚至包括if語句。注意,list comprehension的用法有一點(diǎn)爭議。它不應(yīng)該被過度使用,尤其是當(dāng)它損害了代碼的可讀性時(shí)。但我個(gè)人認(rèn)為這種語法是清晰和簡潔的。

3. 使用內(nèi)置的Sort()方法對復(fù)雜的迭代進(jìn)行排序

如果我們需要對一些可迭代的對象,例如列表、元組或字典進(jìn)行排序,我們不需要自己實(shí)現(xiàn)排序算法。我們可以簡單地使用內(nèi)置的排序函數(shù)。這將自動按升序?qū)?shù)字進(jìn)行排序,并返回一個(gè)新的列表。如果我們想讓結(jié)果按降序排列,我們可以使用參數(shù)reverse=True。正如我所說的,這適用于任何可迭代的對象,所以這里我們還可以使用元組。但是請注意,結(jié)果是一個(gè)列表!

  1. data = (3, 5, 1, 10, 9) 
  2. sortedsorted_data = sorted(data, reverse=True) # [10, 9, 5, 3, 1] 

現(xiàn)在假設(shè)我們有一個(gè)復(fù)雜的迭代器。這里是一個(gè)列表,列表里面有字典,我們想要根據(jù)字典中的年齡對列表進(jìn)行排序。為此,我們還可以使用排序函數(shù),然后傳入應(yīng)該用于排序的關(guān)鍵參數(shù)。鍵必須是一個(gè)函數(shù),所以這里我們可以使用lambda和返回年齡的單行函數(shù)。

  1. data = [{"name": "Max", "age": 6},  
  2.         {"name": "Lisa", "age": 20},  
  3.         {"name": "Ben", "age": 9} 
  4.         ] 
  5. sortedsorted_data = sorted(data, key=lambda x: x["age"]) 

 

4. 用集合存儲惟一的值

如果我們有一個(gè)有多個(gè)值的列表,并且只需要唯一的值,一個(gè)很好的技巧是將我們的列表轉(zhuǎn)換為集合。集合是一種無序的集合數(shù)據(jù)類型,沒有重復(fù)的元素,所以在這種情況下,它刪除了所有重復(fù)的元素。

  1. my_list = [1,2,3,4,5,6,7,7,7] 
  2. my_set = set(my_list) # removes duplicates 

如果我們已經(jīng)知道我們需要唯一的元素,比如這里的質(zhì)數(shù),我們可以馬上用花括號創(chuàng)建一個(gè)集合。這允許Python進(jìn)行一些內(nèi)部優(yōu)化,并且它還有一些方便的方法來計(jì)算兩個(gè)集合之間的交集和差異。

 

5. generator節(jié)省內(nèi)存

在技巧2中,我向你展示了list comprehension。但是列表并不總是最好的選擇。假設(shè)我們有一個(gè)非常大的列表有10000項(xiàng)我們想計(jì)算所有項(xiàng)的和。當(dāng)然,我們可以使用列表來實(shí)現(xiàn)這一點(diǎn),但是我們可能會遇到內(nèi)存問題。這是一個(gè)我們可以使用生成器的完美例子。與list comprehension類似,我們可以使用生成器理解,它具有相同的語法,但使用圓括號而不是方括號。生成器懶洋洋地計(jì)算我們的元素,即。,它一次只生成一個(gè)條目,并且只在被請求時(shí)生成。如果我們計(jì)算這個(gè)生成器的和,我們看到我們得到了相同的正確結(jié)果。

  1. # list comprehension 
  2. my_list = [i for i in range(10000)] 
  3. print(sum(my_list)) # 49995000 
  4.  
  5. # generator comprehension 
  6. my_gen = (i for i in range(10000)) 
  7. print(sum(my_gen)) # 49995000 

 

6. 用.get()和.setdefault()在字典中定義默認(rèn)值

假設(shè)我們有一個(gè)字典,它有不同的鍵,比如物品和物品的價(jià)格。在代碼的某個(gè)時(shí)候,我們想要獲得條目的計(jì)數(shù),并且假設(shè)這個(gè)鍵也包含在字典中。當(dāng)我們簡單地嘗試訪問密鑰時(shí),它將崩潰我們的代碼并引發(fā)一個(gè)KeyError。所以更好的方法是在字典上使用.get()方法。這也會返回鍵的值,但是如果鍵不可用,它不會引發(fā)鍵錯(cuò)誤。相反,它返回我們指定的默認(rèn)值,如果我們沒有指定它,則返回None。

  1. my_dict = {'item': 'football', 'price': 10.00} 
  2. price = my_dict['count'] # KeyError! 
  3.  
  4. # better: 
  5. price = my_dict.get('count', 0) # optional default value 

 

7. 用collections.Counter計(jì)數(shù)hashable對象

如果我們需要計(jì)算列表中元素的數(shù)量,那么在collections模塊中有一個(gè)非常方便的工具可以完成此工作。我們只需要從集合中導(dǎo)入計(jì)數(shù)器,然后用列表作為參數(shù)創(chuàng)建計(jì)數(shù)器對象。如果我們打印這個(gè),那么對于列表中的每一項(xiàng),我們都可以看到這個(gè)項(xiàng)出現(xiàn)的次數(shù),而且它已經(jīng)排好序了,最常用的項(xiàng)在前面。單獨(dú)計(jì)算會好得多。如果我們想要獲得某一項(xiàng)的計(jì)數(shù),只需訪問該項(xiàng),它就會返回相應(yīng)的計(jì)數(shù)。如果不包含該項(xiàng),則返回0。

  1. from collections import Counter 
  2.  
  3. my_list = [10, 10, 10, 5, 5, 2, 9, 9, 9, 9, 9, 9] 
  4. counter = Counter(my_list) 
  5.  
  6. print(counter) # Counter({9: 6, 10: 3, 5: 2, 2: 1}) 
  7. print(counter[10]) # 3 

 

8. 用f-strings格式化字符串(Python 3.6+)

這是自Python 3.6以來的新特性,在我看來是格式化字符串的最佳方式。我們只需要在字符串前面寫一個(gè)f,然后在字符串里面我們可以使用大括號來訪問變量。與舊的格式化規(guī)則相比,這更簡單、更簡潔,也更快。此外,我們可以在大括號中編寫在運(yùn)行時(shí)計(jì)算的表達(dá)式。舉個(gè)例子,我們想要輸出變量i的平方,我們可以簡單地把這個(gè)操作寫在f字符串中。

  1. name = "Alex" 
  2. my_string = f"Hello {name}" 
  3. print(my_string) # Hello Alex 
  4.  
  5. i = 10 
  6. print(f"{i} squared is {i*i}") # 10 squared is 100 

 

9. 用.join()連接字符串

假設(shè)我們有一個(gè)包含不同字符串的列表,我們想將所有元素組合成一個(gè)字符串,每個(gè)單詞之間用空格分隔。壞的方法是這樣做:

  1. list_of_strings = ["Hello", "my", "friend"] 
  2.  
  3. # BAD: 
  4. my_string = "" 
  5. for i in list_of_strings: 
  6.     my_string += i + " "  

我們定義了一個(gè)空字符串,然后遍歷該列表,然后將單詞和空格追加到該字符串。你應(yīng)該知道,字符串是不可變的元素,所以這里我們每次都要?jiǎng)?chuàng)建新的字符串。對于大型列表,此代碼可能非常慢,所以您應(yīng)該立即忘記這種方法!更好、更快、也更簡潔的是.join()方法:

  1. .join() method: 
  2. # GOOD: 
  3. list_of_strings = ["Hello", "my", "friend"] 
  4. my_string = " ".join(list_of_strings) 

 

10. 用雙星號語法合并字典** (Python 3.5+)

這種語法是自Python 3.5以來的新語法。如果我們有兩個(gè)字典并且想要合并它們,我們可以為兩個(gè)字典使用花括號和雙星號。這里字典1有名字和年齡,字典2也有名字和城市。在與這個(gè)簡潔的語法合并之后,我們最終的字典中有所有3個(gè)鍵。

  1. d1 = {'name': 'Alex', 'age': 25} 
  2. d2 = {'name': 'Alex', 'city': 'New York'} 
  3. merged_dict = {**d1, **d2} 
  4. print(merged_dict) # {'name': 'Alex', 'age': 25, 'city': 'New York'} 

 

11. 用if x in list簡化if語句,而不是單獨(dú)檢查每一項(xiàng)

假設(shè)我們有一個(gè)主色為紅色、綠色和藍(lán)色的列表。在代碼的某個(gè)地方,我們有一個(gè)包含一些顏色的新變量,這里是c =紅色。然后我們要檢查這個(gè)顏色是否來自我們的主色。我們當(dāng)然可以像這樣檢查列表中的每一項(xiàng):

  1. colors = ["red", "green", "blue"] 
  2.  
  3. c = "red" 
  4.  
  5. # cumbersome and error-prone 
  6. if c == "red" or c == "green" or c == "blue": 
  7.     print("is main color") 

但這可能會變得很麻煩,我們很容易出錯(cuò),例如,如果我們這里有一個(gè)錯(cuò)誤的紅色。更簡單也更好的方法是使用語法if x in list。

 

責(zé)任編輯:趙寧寧 來源: Python學(xué)會
相關(guān)推薦

2017-08-30 19:32:08

代碼程序員編程

2017-08-30 11:10:25

代碼

2017-10-10 16:28:51

前端CSS建議

2023-01-04 08:17:21

Typescript技巧欺騙性

2020-06-23 07:50:13

Python開發(fā)技術(shù)

2023-03-27 23:57:25

JavaScrip開發(fā)技巧

2020-05-08 19:52:31

Reactreact.js前端

2012-05-22 00:06:01

程序員軟件開發(fā)代碼編寫

2020-06-23 07:48:18

Python開發(fā)技術(shù)

2020-06-10 07:49:56

Python代碼開發(fā)工具

2014-08-11 12:54:27

構(gòu)建模塊代碼審查編程

2024-10-22 08:11:15

2022-02-01 16:02:03

PythonWeb服務(wù)器

2015-10-30 10:33:02

溝通程序員事業(yè)發(fā)展

2024-01-08 17:09:07

Python解釋器CPython

2019-04-29 08:31:25

PythonPandas數(shù)據(jù)

2022-05-10 10:28:21

JavaScript代碼

2024-10-08 10:24:41

Python編程語言

2022-01-06 22:31:21

Python技巧代碼

2022-10-08 08:51:21

KDE PlasmaLinux 桌面Linux
點(diǎn)贊
收藏

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