15個Stack Overflow上回答的最多的Python技巧
Python是一種高級編程語言。由于其可讀性和效率,它已成為全球開發(fā)人員的熱門選擇。但是與任何語言一樣,有一些方法可以利用Python的特性來生成更干凈、更高效和更Python化的代碼。
本文將整理15個Python技巧,這些技巧都是Stack Overflow上回答最多的問題,并且可以幫你提高代碼質(zhì)量。
1、F-Strings
在Python 3.6中引入的F-Strings提供了一種簡潔方便的方式來將表達式嵌入字符串中進行格式化。它比% 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、列表推導式
當您希望基于現(xiàn)有列表的值創(chuàng)建新列表時,列表推導式提供了更短的語法。它可以使代碼更具可讀性和效率。
例如:
numbers = [1, 2, 3, 4, 5]
#List comprehension
squares = [n**2 for n in numbers]
print(squares)
Output:
[1, 4, 9, 16, 25]
3、鏈式比較運算符
Python允許鏈式比較運算符,這可以使代碼更具可讀性和整潔性。
例如:
#Chain comparison
x = 10
print(1 < x < 20)
# Output:
True
4、enumerate
當我們同時需要列表項的索引和值時,可以使用enumerate()函數(shù),而不是創(chuàng)建一個單獨的變量。
例如:
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ù)可以同時遍歷多個列表,這在處理相同長度的列表時非常方便。
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是一個容器,它為不存在的鍵提供默認值,這可以避免KeyError。
from collections import defaultdict
d = defaultdict(int)
print(d["nonexistent_key"])
# Output:
0
8、使用set
Python中的集合以哈希表的形式實現(xiàn),這為成員測試提供了恒定的時間復雜度。如果需要測試一個項是否存在于一個大型項目集合中,可以使用集合替代列表。
items = set([1, 2, 3, 4, 5])
print(3 in items)
# Output:
True
9、' name == " main " '
在python中,這行代碼確保在python文件作為腳本運行時運行代碼的某些部分,而不是在它作為模塊導入時運行。
if __name__ == "__main__":
print("This code runs when the file is executed as a script.")
尤其是在windows下的多線程一定要加上這句話,比如pytorch的dataloader的num_worker大于1的話大概率的報錯來自于沒加這句話
10、使用*args和**kwargs
*args和**kwargs可以讓函數(shù)傳遞可變數(shù)量的參數(shù)。*args用于傳遞非關鍵字參數(shù),而**kwargs用于傳遞關鍵字參數(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é)構允許捕獲和處理異常,在沒有異常發(fā)生時執(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中的列表切片可以訪問列表項的子集。還可以使用它來反轉(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() '進行類型檢查
在Python中,isinstance()函數(shù)檢查一個對象是某個類的實例還是類的元組。
print(isinstance(1, int))
# Output:
True
14、使用any()和all()
如果可迭代對象中至少有一個元素為真,則any()函數(shù)返回True,而all()僅當所有元素為真時返回True。
numbers = [1, 2, 3, 0]
print(any(numbers))
print(all(numbers))
# Output:
True
False
15、collections.Counter
Python中的collections模塊提供了內(nèi)置容器的替代方案。Counter是一個dict子類,用于對可哈希對象進行計數(shù)。它是一個集合,其中元素被存儲為字典鍵,它們的計數(shù)被存儲為字典值。
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})
上面的代碼是計算列表中元素出現(xiàn)頻率的一種簡單而有效的方法。
總結(jié)
Python是一種強大而靈活的語言,它提供了許多特性和技巧。通過利用這些特性可以編寫更簡潔、更python化的代碼,并將自己從無數(shù)的Stack Overflow搜索中拯救出來,提高Python技能的最好方法是編寫Python代碼。