15個(gè)Stack Overflow上回答的最多的Python技巧
Python是一種高級(jí)編程語言。由于其可讀性和效率,它已成為全球開發(fā)人員的熱門選擇。但是與任何語言一樣,有一些方法可以利用Python的特性來生成更干凈、更高效和更Python化的代碼。
本文將整理15個(gè)Python技巧,這些技巧都是Stack Overflow上回答最多的問題,并且可以幫你提高代碼質(zhì)量。
1、F-Strings
在Python 3.6中引入的F-Strings提供了一種簡(jiǎn)潔方便的方式來將表達(dá)式嵌入字符串中進(jìn)行格式化。它比% formatting和str.format()都快并且更易讀,所以推薦使用它。
以下是如何使用它們的方法:
name = "John"
age = 24
print(f"My name is {name} and I'm {age} years old.")
Output:
My name is John and I'm 24 years old.
2、列表推導(dǎo)式
當(dāng)您希望基于現(xiàn)有列表的值創(chuàng)建新列表時(shí),列表推導(dǎo)式提供了更短的語法。它可以使代碼更具可讀性和效率。
例如:
numbers = [1, 2, 3, 4, 5]
#List comprehension
squares = [n**2 for n in numbers]
print(squares)
Output:
[1, 4, 9, 16, 25]
3、鏈?zhǔn)奖容^運(yùn)算符
Python允許鏈?zhǔn)奖容^運(yùn)算符,這可以使代碼更具可讀性和整潔性。
例如:
#Chain comparison
x = 10
print(1 < x < 20)
# Output:
True
4、enumerate
當(dāng)我們同時(shí)需要列表項(xiàng)的索引和值時(shí),可以使用enumerate()函數(shù),而不是創(chuàng)建一個(gè)單獨(dú)的變量。
例如:
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits):
print(f"Index: {i}, Fruit: {fruit}")
# Output:
Index: 0, Fruit: apple
Index: 1, Fruit: banana
Index: 2, Fruit: cherry
5、zip
zip()函數(shù)可以同時(shí)遍歷多個(gè)列表,這在處理相同長(zhǎng)度的列表時(shí)非常方便。
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
for num, letter in zip(list1, list2):
print(f"Number: {num}, Letter: {letter}")
# Output:
Number: 1, Letter: a
Number: 2, Letter: b
Number: 3, Letter: c
6、在循環(huán)中使用else子句
在Python中,else子句可以與循環(huán)一起使用。else塊中的代碼在循環(huán)結(jié)束后執(zhí)行,除非循環(huán)被break語句終止。
for i in range(5):
if i == 10:
break
else:
print("Loop finished successfully.")
# Output:
Loop finished successfully.
7、defaultdict
Python中的defaultdict是一個(gè)容器,它為不存在的鍵提供默認(rèn)值,這可以避免KeyError。
from collections import defaultdict
d = defaultdict(int)
print(d["nonexistent_key"])
# Output:
0
8、使用set
Python中的集合以哈希表的形式實(shí)現(xiàn),這為成員測(cè)試提供了恒定的時(shí)間復(fù)雜度。如果需要測(cè)試一個(gè)項(xiàng)是否存在于一個(gè)大型項(xiàng)目集合中,可以使用集合替代列表。
items = set([1, 2, 3, 4, 5])
print(3 in items)
# Output:
True
9、' name == " main " '
在python中,這行代碼確保在python文件作為腳本運(yùn)行時(shí)運(yùn)行代碼的某些部分,而不是在它作為模塊導(dǎo)入時(shí)運(yùn)行。
if __name__ == "__main__":
print("This code runs when the file is executed as a script.")
尤其是在windows下的多線程一定要加上這句話,比如pytorch的dataloader的num_worker大于1的話大概率的報(bào)錯(cuò)來自于沒加這句話
10、使用*args和**kwargs
*args和**kwargs可以讓函數(shù)傳遞可變數(shù)量的參數(shù)。*args用于傳遞非關(guān)鍵字參數(shù),而**kwargs用于傳遞關(guān)鍵字參數(shù)。
def func(*args, **kwargs):
for arg in args:
print(arg)
for key, value in kwargs.items():
print(f"{key}: {value}")
func(1, 2, 3, a=4, b=5)
# Output:
1
2
3
a: 4
b: 5
11、try/except/else/finally
Python的try/except/else/finally結(jié)構(gòu)允許捕獲和處理異常,在沒有異常發(fā)生時(shí)執(zhí)行代碼,并且不管是否發(fā)生異常都可以清理資源。
try:
# Code that may raise an exception
except Exception as e:
# Code that runs when an exception occurs
else:
# Code that runs if no exception occurs
finally:
# Code that runs no matter what
這里的else的用法與循環(huán)中類似,在某些特殊的情況下非常有用
12、使用列表切片
Python中的列表切片可以訪問列表項(xiàng)的子集。還可以使用它來反轉(zhuǎn)列表或克隆列表。
numbers = [1, 2, 3, 4, 5]
print(numbers[1:3])
print(numbers[::-1])
# Output:
[2, 3]
[5, 4, 3, 2, 1]
13、使用' isinstance() '進(jìn)行類型檢查
在Python中,isinstance()函數(shù)檢查一個(gè)對(duì)象是某個(gè)類的實(shí)例還是類的元組。
print(isinstance(1, int))
# Output:
True
14、使用any()和all()
如果可迭代對(duì)象中至少有一個(gè)元素為真,則any()函數(shù)返回True,而all()僅當(dāng)所有元素為真時(shí)返回True。
numbers = [1, 2, 3, 0]
print(any(numbers))
print(all(numbers))
# Output:
True
False
15、collections.Counter
Python中的collections模塊提供了內(nèi)置容器的替代方案。Counter是一個(gè)dict子類,用于對(duì)可哈希對(duì)象進(jìn)行計(jì)數(shù)。它是一個(gè)集合,其中元素被存儲(chǔ)為字典鍵,它們的計(jì)數(shù)被存儲(chǔ)為字典值。
from collections import Counter
# list of students in class 'A'
students = ['Mike', 'John', 'Mike', 'Anna', 'John', 'John']
counter = Counter(students)
print(counter)
# Output:
Counter({'John': 3, 'Mike': 2, 'Anna': 1})
上面的代碼是計(jì)算列表中元素出現(xiàn)頻率的一種簡(jiǎn)單而有效的方法。
總結(jié)
Python是一種強(qiáng)大而靈活的語言,它提供了許多特性和技巧。通過利用這些特性可以編寫更簡(jiǎn)潔、更python化的代碼,并將自己從無數(shù)的Stack Overflow搜索中拯救出來,提高Python技能的最好方法是編寫Python代碼。