Python初學(xué)者必學(xué)的20個(gè)重要技巧
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。
Python是世界上使用最廣泛的編程語言之一,原因有很多:易理解、用途非常廣泛、包含了大量的模塊和庫(kù)等等。其中,簡(jiǎn)潔和較高的可讀性使Python在所有軟件中非常突出。
作為一名數(shù)據(jù)科學(xué)家,筆者每天都在使用Python,這是筆者工作的一個(gè)重要部分。在這個(gè)過程中,筆者學(xué)會(huì)了一些驚人的技巧。
1. 交換價(jià)值
數(shù)字交換通常涉及存儲(chǔ)在臨時(shí)變量中的值。然而,我們可以通過使用Python技巧中的一行代碼,不需要使用瞬變變量就可以實(shí)現(xiàn)這一點(diǎn)。
- """valueswapping"""
- a, b=5, 10
- print(a, b) a, bb= b, a print(a, b) output 10, 5
2. 列表中所有項(xiàng)的一個(gè)字符串
必須對(duì)一個(gè)字符串列表進(jìn)行卷積時(shí),可以通過for循環(huán)來更新每一項(xiàng)以此連續(xù)不斷地執(zhí)行此操作。然而這樣做很麻煩,特別是在列表很長(zhǎng)的情況下。在Python中,字符串是不可變的。因此,在每?jī)蓚€(gè)拼接中,左字符串和右字符串都應(yīng)該被復(fù)制成一個(gè)新的字符串。
如下所示,使用join()函數(shù)是一種更為簡(jiǎn)潔的解決方法:
- p = ["Python", "is", "a","popular", "language"]
- print(" ".join(p))output
- Python is a popular language
3. 列表中最常見的元素
確定列表中最經(jīng)常出現(xiàn)的值。如果不同的項(xiàng)目以相同的方式出現(xiàn),則打印其中的一個(gè)。創(chuàng)建列表集以刪除冗余值。因此在集合中能找到每一項(xiàng)的最大事件數(shù),然后再考慮最大的。
- list1 = [0, 1, 2, 3, 3, 2, 3, 1, 4, 5, 4]
- print(max(set(list1), key = list1.count))output
- 3
4. 測(cè)試兩個(gè)字符串是否為相同字母異序詞
- defanagram(string_1,string_2):
- """Test if the stringsare anagrams.
- string_1: string
- string_2: string
- returns: boolean
- """
解決上述問題,從而弄清楚兩個(gè)字符串是否是相同字母異序詞。給定兩個(gè)字符串string_1 和string_2,測(cè)試這兩個(gè)字符串是否互為相同字母異序詞。
- from collections importCounter
- defanagram(string_1,string_2): returnCounter(string_1) ==Counter(string_2) anagram('pqrs','rqsp')
- True
- anagram('pqrs','rqqs')
- False
圖源:unsplash
5. 逆轉(zhuǎn)字符串
切片是Python中的一種方便技巧,它還可以用于逆轉(zhuǎn)字符串中項(xiàng)的順序。
- # with slicing
- str ="PQRST"
- reverse_str = str[::-1]
- print(reverse_str) Output TSRQP
6. 反轉(zhuǎn)列表
使用這種方法創(chuàng)建列表的副本,而且列表沒有按順序排序。要?jiǎng)?chuàng)建一個(gè)副本,需要更多的空間來容納所有現(xiàn)有的元素。
- # using slicing approach
- defReverse(lst): lstlst1 = lst[::-1]
- return lst1
- lst = [5, 6, 7, 8, 9, 10]
- print(Reverse(lst))
- output
- [10, 9, 8, 7, 6, 5]
7. 轉(zhuǎn)置矩陣
轉(zhuǎn)置矩陣意味著將列變換為行,反之亦然。使用Python,可以通過以下代碼與zip函數(shù)結(jié)合,并使用*工具解壓縮矩陣的轉(zhuǎn)置列表。
- mat=[(5,6,7),(8,9,10),(11,12,13),(14,15,16)]
- for row in mat:
- print(row)
- print("\n")
- t_mat=zip(*mat)
- for row in t_mat:
- print(row)
- output
- (5, 6, 7)
- (8, 9, 10)
- (11, 12, 13)
- (14, 15, 16)
- (5, 8, 11, 14)
- (6, 9, 12, 15)
- (7, 10, 13, 16)
8. 鏈?zhǔn)奖容^
在編程中,測(cè)試兩個(gè)以上的條件是很正常的。假設(shè)需要測(cè)試以下內(nèi)容:
- p < q< r
更聰明的做法確實(shí)是在Python中通過鏈?zhǔn)絹砭帉憽H蝿?wù)鏈表示如下:
- if p< q< r:
- {.....}
返回布爾值來比較判斷正確與否。示例如下:
- # chaining comparison
- a =3
- print(1< a<10)
- print(5< a<15)
- print(a <7< a*7<49)
- print(8> a<=6)
- print(3== a>2)
- output
- True
- False
- True
- True
- True
9. ‘get’字典
下面是訪問Python字典中鍵值的傳統(tǒng)方法:
- dict = {"P":1, "Q":2}
- print(dict["P"])
- print(dict["R"])
代碼的第三行會(huì)產(chǎn)生一個(gè)關(guān)鍵錯(cuò)誤:
- Traceback (most recent call last):
- File ".\dict.py", line 3, in
- print (dict["R"])
- KeyError: 'R'
為了防止這種情況的出現(xiàn),可以使用get()函數(shù)。當(dāng)在字典中可用時(shí),該技巧可以提供特定鍵的值。若不可用,則不會(huì)返回任何值(如果 get()只使用了一個(gè)參數(shù))。
- dict = {"P":1, "Q":2}
- print(dict.get("P"))
- print(dict.get("R"))
- print(dict.get("R","Unavailable! "))
- output 1
- None
- Unavailable!
10. 按值給字典排序
排序在日常編程中一直是很有用的。Python中的字典在許多應(yīng)用程序中被廣泛使用,范圍從競(jìng)爭(zhēng)領(lǐng)域到開發(fā)人員領(lǐng)域。構(gòu)造一本字典,并按字母順序顯示所有鍵,按值列出按字母順序排序的鍵和值。
- defdict():
- keyval ={} # Initializing the value keyval[3] =48
- keyval[2] =6
- keyval[5] =10
- keyval[1] =22
- keyval[6] =15
- keyval[4] =245
- print ("Task3:-\nKeys and Values sorted",
- "in alphabetical order by thevalue")
- # Remember this would arrange inaphabetical sequence # Convert it to float to mathematicalpurposes print(sorted(keyval.elements(), key =
- lambda k_val:(k_val[1], k_val[0])))
- defmain(): dict() if __name__=="__main__":
- main() output
- [(2, 6), (5, 10), (6, 15), (1, 22), (3, 48), (4, 245)]
圖源:unsplash
11. 列表推導(dǎo)
要從不同的迭代中構(gòu)造新的列表,需要使用列表推導(dǎo)。由于列表推導(dǎo)式產(chǎn)生列表,因此它們包含表達(dá)式的括號(hào),該表達(dá)式將被執(zhí)行到每個(gè)元素。推導(dǎo)列表更簡(jiǎn)單,因?yàn)镻ython解釋器旨在檢測(cè)循環(huán)中的循環(huán)模式。
- # Multiplying each item in the list with 3
- list1 = [2,4,6,8]
- list2 = [3*p for p in list1]
- print(list2)
- [6,12,18,24]
12. 執(zhí)行部分計(jì)劃所花費(fèi)的時(shí)間
這個(gè)重點(diǎn)展示了計(jì)算程序或程序的一部分執(zhí)行所花費(fèi)的時(shí)間。計(jì)算時(shí)間有助于優(yōu)化Python腳本,使其執(zhí)行得更好。
- import time
- initial_Time = time.time()
- # Program to test follows x, y=5,6
- z = x+ y # Program to test ending ending_Time = time.time()
- Time_lapsed_in_Micro_sec= (ending_Time- initial_Time)*(10**6)
- print(" Timelapsed in micro_seconds: {0} ms").format(Time_lapsed_in_Micro_sec)
13. 合并字典
這是Python中的一個(gè)重要技巧:使用一個(gè)表達(dá)式來合并兩個(gè)字典并將結(jié)果存儲(chǔ)在第三個(gè)字典中。單個(gè)表達(dá)式是 **,這不會(huì)影響其他兩個(gè)字典。**表示參數(shù)是一個(gè)字典。使用**是一種快捷方式,這樣就可以通過使用字典直接向函數(shù)傳遞多個(gè)參數(shù)。
使用這個(gè)函數(shù),首先將第一個(gè)字典的所有元素傳遞給第三個(gè)字典,然后將第二個(gè)字典傳遞給第三個(gè)字典。這將替換第一個(gè)字典的重復(fù)鍵
- dic1 = {'men': 6, 'boy': 5}
- dic2 = {'boy': 3, 'girl': 5}
- merged_dic = {**dic1, **dic2}
- print(merged_dic)
- Output
- {'men': 6, 'boy': 3, 'girl': 5}
14. 數(shù)字化
下面是使用了 map()函數(shù)、列表推導(dǎo)以及一種更簡(jiǎn)單的數(shù)字化方法編寫的代碼:
- number =2468
- # with map
- digit_list =list(map(int, str(number)))
- print(digit_list) [2, 4, 6, 8]
- # with list comprehension
- digit_list = [int(a) for a instr(number)]
- print(digit_list) [2, 4, 6, 8]
- # Even simpler approach digit_list =list(str(number))
- print(digit_list) [2, 4, 6, 8]
15. 測(cè)試獨(dú)特性
一些列表操作要求測(cè)試列表中的所有項(xiàng)是否完全不同。嘗試在列表中執(zhí)行集合操作時(shí),通常會(huì)發(fā)生這種情況,這個(gè)特殊的實(shí)用程序在這時(shí)必不可少。
- defuniq(list):
- iflen(list)==len(set(list)): print("totalitems are unique")
- else:
- print("Listincludes duplicate item")
- uniq([0,2,4,6])
- total items are unique uniq([1,3,3,5])
- List includesduplicate item
16. 使用枚舉
在循環(huán)中使用枚舉數(shù)可以快速查找索引:
- sample_list = [4, 5, 6]
- for j, item inenumerate(sample_list):
- print(j, ': ', item)
- Output
- 0 : 4
- 1 : 5
- 2 : 6
17. 在一行中計(jì)算任意數(shù)的階乘
此技巧可以幫助你在一行中找到一個(gè)給定數(shù)的階乘:
- import functools
- fact = (lambda i: functools.reduce(int.__mul__, range(1,i+1),1)(4)
- print(fact)
- Output 24
18. 返回幾個(gè)函數(shù)的元素
許多計(jì)算機(jī)語言都不提供這個(gè)功能。但是對(duì)于Python,函數(shù)會(huì)產(chǎn)生幾個(gè)元素。查看下面的實(shí)例,了解它是如何執(zhí)行的:
- # function returning several elements.
- defa():
- return5, 6, 7, 8
- # Calling the abovefunction.
- w, x, y, z=a()
- print(w, x, y, z)
- Output
- 5678
19. 加入一個(gè)真正的Python切換大小寫語句
下面是使用字典復(fù)制大小寫轉(zhuǎn)換結(jié)構(gòu)的腳本:
- defaswitch(a):
- returnaswitch._system_dic.get(a, None)
- aswitch._system_dic = {'mangoes': 4, 'apples': 6, 'oranges': 8}
- print(aswitch('default'))
- print(aswitch('oranges'))
- Output None
- 8
20. 使用splat操作符解包函數(shù)參數(shù)
splat操作符提供了一種解包參數(shù)列表的有效方法:
- deftest(a, b, c):
- print(p, q, r)
- test_Dic = {'a': 4, 'b': 5, 'c': 6}
- test_List = [10, 11, 12] test(*test_Dic)
- test(**test_Dic)
- test(*test_List)
- #1-> p q r
- #2-> 4 5 6
- #3-> 10 11 12
掌握這些小技巧,快速有效地完成Python任務(wù)。