☆ 10个小技巧,让你的 Python 代码更加优雅~ ☆
10個小技巧改進的 Python 代碼,讓你的代碼更加簡潔、更加 Python 化。
1. 用enumerate代替range
如果你需要遍歷一個列表,并且需要同時獲取索引和元素,大多數情況可能會使用range(len(data))的語法。
比如我們要遍歷一個列表,找到所有的負數:
data = [1, 3, -5, 7, 9, -11] for i in range(len(data)):if data[i] < 0:print(f"索引:{i},元素:{data[i]}")輸出:
索引:2,元素:-5 索引:5,元素:-11雖然這種方法有效,但如果使用 Python 內置的enumerate函數會更好,這個函數會返回遍歷過程中當前索引和當前元素值作為一個元組,因此可以直接輸出索引和值:
data = [1, 3, -5, 7, 9, -11] for i, v, in enumerate(data):if v < 0:print(f"索引:{i},元素:{v}")輸出:
索引:2,元素:-5 索引:5,元素:-112. 深入理解list,替代for循環
假如我們要創建一個從0~9的平方數的列表,一種簡單的方法是先創建一個list,然后通過for循環每次將一個數的平方append到列表的結尾。
squares = [] for i in range(10):squares.append(i ** 2) print(squares)輸出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]但其實通過列表生成式,我們有一種更快捷的方法,只需要一行代碼就能夠實現相同的功能。
squares = [i ** 2 for i in range(10)] print(squares)輸出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]3. 通過 Python 內置的 sorted() 方法對復雜的對象進行排序
排序的需求在很多場景中都很常見,Python中的可迭代對象(列表、元組、字典)都可以進行排序,內置函數sorted()讓我們甚至都不需要自己實現排序算法。
data = [1, 3, -5, 7, 9, -11] sortedData = sorted(data) print(sortedData)輸出:
[-11, -5, 1, 3, 7, 9]sorted()方法自動將列表按照升序排序,如果你想按照降序排序,可以使用sorted()的參數reverse = True。
sorted()方法同樣也適用于元組類型的數據,但是注意排序的結果將返回一個列表。
data = (1, 3, -5, 7, 9, -11) print(data) sortedData = sorted(data) print(sortedData)輸出:
(1, 3, -5, 7, 9, -11) [-11, -5, 1, 3, 7, 9]對于復雜的可迭代對象,比如我們可以創建一個列表,列表中的每一個元素都是一個人的字典信息,然后我們按照每個人的年齡進行排序。
我們可以用sorted()的key參數,傳入一個匿名函數,讓排序按照我們預想的方式進行。
data = [{"name": "Alex", "age": 18},{"name": "Band", "age": 21},{"name": "Coco", "age": 17}] sorted_data = sorted(data, key=lambda x: x["age"]) print(sorted_data)輸出:
[{'name': 'Coco', 'age': 17}, {'name': 'Alex', 'age': 18}, {'name': 'Band', 'age': 21}]4. 使用集合Set存儲唯一值
如果你有一個包含多個值的列表,并且需要去重,一個不錯的技巧是將我們的列表轉換為一個集合。
Python的集合是一種無序的數據類型,并且沒有重復元素,還提供了不同集合之間的運算,可以求交集、并集和差集。
data = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9] setData = set(data) print(setData)輸出:
{1, 3, 5, 7, 9}5. 使用生成器以節省內存
有時候列表并不是最好的選擇。假如我們有一個非常大的列表,有10000個元素,我們想計算所有元素的總和,雖然可以用列表來做,當如果數據量特別大的話我們可能會遇到內存問題,更好的解決方案是使用生成器。
dataList = [i for i in range(10000)] print(sum(dataList)) dataGen = (i for i in range(10000)) print(sum(dataGen))輸出:
49995000 49995000列表生成式與生成器具有相同的語法,不同點在于列表生成式使用的是中括號,而生成器使用的是小括號。
生成器通過類似于懶加載的方式計算我們需要的元素,因此它一次只生成一個元素,并且只在需要的時候才生成。
我們可以使用sys的getsize()方法看一下列表和生成器的大小。
import sysdataList = [i for i in range(10000)] print(sys.getsizeof(dataList), "bytes")dataGen = (i for i in range(10000)) print(sys.getsizeof(dataGen), "bytes")輸出:
85176 bytes 112 bytes6. 在字典中獲取元素使用.get()并且設置默認值
假設我們有一個字典,其中包括不同的鍵,比如商品和價格,在我們的代碼中的某個點,想要獲得商品的價格。
當我們用[]簡單的訪問鍵時,如果鍵不在字典中,那么代碼將會報錯,引發一個KeyError。
dataDict = {"name": "Tesla","price": 250000 } print(dataDict["count"])報錯:
Traceback (most recent call last):File "mian.py", line 5, in <module>print(dataDict["count"]) KeyError: 'count'更好的方式是使用.get()方法,此時如果鍵不存在,則不會引發KeyError,而是返回一個默認值,如果我們不指定默認值,它會直接返回None,如果我們指定默認值,那么它會返回我們指定的默認值。
dataDict = {"name": "Tesla","price": 250000 } print(dataDict.get("count")) print(dataDict.get("count", 0))輸出:
None 07. 計數器collections.Counter
如果你想計算列表中元素的數量,Python中有一個非常方便的工具。
from collections import Counterdata = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9] counter = Counter(data)print(counter)輸出:
Counter({9: 5, 7: 4, 5: 3, 3: 2, 1: 1})Counter可以統計列表中不同元素的數量,并且按照出現次數降序排列,這比我們自己計算要好得多。
如果你想知道某個元素的個數的話,可以直接通過[]訪問,如果這個元素不存在,那么將返回0,并且還可以通過most_common()方法返回排名靠前的幾個元素。
from collections import Counterdata = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9] counter = Counter(data)print(counter[7]) print(counter[11]) print(counter.most_common(2))輸出:
4 0 [(9, 5), (7, 4)]8. 使用f-String格式化字符串(適用于Python 3.6+)
f-String在我看來是最佳的格式化字符串方法,我們只需要在字符串前寫一個f,然后在字符串內部可以直接使用大括號來嵌入變量或表達式。
data = {"name": "Alex", "age": 18} string = f"I'm {data['name']} and I am {data['age']} years old." print(string)輸出:
I'm Alex and I am 18 years old.這種方式更簡單、更簡潔、速度也更快。
9. 使用.join()拼接字符串
假如我們有一個包含不同字符串的列表,我們想把所有的字符串通過空格拼接在一起,千萬不要再用for循環一個一個遍歷然后拼接了,一種更簡潔的方法是通過.joint()方法,它可以使用指定的字符將字符串拼接起來。
strings = ["Hello", "World", "!"] print(" ".join(strings)) print("_".join(strings))輸出:
Hello World ! Hello_World_!10. 使用雙星號語法合并字典(適用于Python 3.5+)
如果我們有兩個字典,并且希望將其合并成一個,此時我們可以使用雙星號**和大括號{}語法。
info1 = {"name": "Alex", "age": 18} info2 = {"name": "Alex", "city": "Bei Jing"} info = {**info1, **info2} print(info)輸出:
{'name': 'Alex', 'age': 18, 'city': 'Bei Jing'}以上就是這篇文章跟大家分享的小技巧。
如果你覺得這篇文章對你有幫助的話,歡迎一鍵三連~
總結
以上是生活随笔為你收集整理的☆ 10个小技巧,让你的 Python 代码更加优雅~ ☆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode Algorithm 剑
- 下一篇: 2020年第十一届蓝桥杯 - 省赛 -