本文,我們將分享一些有助于我們掌握 Python 的高級(jí)概念。如迭代器、生成器、裝飾器等!
異常處理是一個(gè)很重要的概念,它可以幫助我們更好地解決程序中的各種問(wèn)題。
異常是在程序執(zhí)行過(guò)程中發(fā)生并中斷的情況。它可能由于多種原因而發(fā)生。比如:除法運(yùn)算中分母為0的情況,會(huì)拋出:ZeroDivisionError;導(dǎo)入不存在的包時(shí),會(huì)拋出:ImportError;列表越界時(shí),會(huì)拋出:IndexError。python 中大約有30個(gè)內(nèi)置異常。
我們使用 try 和 except 來(lái)處理 Python 中的異常。語(yǔ)法如下:
try: pass # 可能發(fā)生異常的代碼except ValueError: pass # 發(fā)生異常時(shí)執(zhí)行的代碼except ZeroDivisionError: pass # 發(fā)生異常時(shí)執(zhí)行的代碼else: pass # 其他情況時(shí)執(zhí)行的代碼finally: pass # 最終執(zhí)行的執(zhí)行的代碼
collections 模塊被稱為用于存儲(chǔ)數(shù)據(jù)的容器。例如列表、元組、集合、字典。Python 中有許多庫(kù)是為了提供額外的數(shù)據(jù)結(jié)構(gòu)而開(kāi)發(fā)的, collections就是其中之一,旨在改進(jìn)內(nèi)置容器的功能。該模塊中最常用的五種數(shù)據(jù)結(jié)構(gòu):
對(duì)可迭代對(duì)象的計(jì)數(shù)。
from collections import Counterdata = [1,1,1,2,3,4,3,3,5,6,7,7,1]count = Counter(data)print(count) # Counter({1: 4, 2: 1, 3: 4, 4: 1, 5: 1, 6: 1, 7: 2})## ?? Counter有幾個(gè)驚艷的方法:# 返回出現(xiàn)次數(shù)最多的前3個(gè)元素print(count.most_common(3)) # [('1', 4), ('3', 4), ('2', 1)]# 返回生成Counter對(duì)象的數(shù)據(jù),迭代器格式。for i in count.elements(): print(i) # 1 1 1 2 3 4 3 3 5 6 7 7 1
給元組元素命名,并且可以通過(guò)名字訪問(wèn)元素。
from collections import namedtupleUser = namedtuple('User', ['name', 'sex', 'age'])user = User(name='Runoob', sex='male', age=12)print(user) # User(name='Runoob', sex='male', age=12)user = User._make(['RunoX', 'Male', 13])print(user) # User(name='RunoX', sex='Male', age=13)print(user.name, user.sex, user.age) # RunoX Male 13user = user._replace(age=22)print(user) # User(name='RunoX', sex='Male', age=22)print(user._asdict()) # {'name': 'RunoX', 'sex': 'Male', 'age': 22}
OrderedDict 是一種可以記住它們插入順序的字典。當(dāng)然,在最新版本的 Python 中,內(nèi)置的 dict 也可以記住它。
from collections import OrderedDictdictt = OrderedDict()dictt['a'] = 5dictt['d'] = 2dictt['c'] = 1dictt['b'] = 3print(dictt) # OrderedDict([('a', 5), ('d', 2), ('c', 1), ('b', 3)])
defaultdict 將返回字典中不存在的鍵的默認(rèn)值,而不是顯示鍵錯(cuò)誤。當(dāng)然新版的dict.get()方法也可以返回默認(rèn)值。
# 創(chuàng)建一個(gè)默認(rèn)值為0的字典from collections import defaultdictdictt = defaultdict(int)dictt['a'] = 2print(dictt['a']) # 2print(dictt['b']) # 0# 新版本的 `dict.get()` 方法dict = {'a': 1, 'b': 2}print(dict.get('a', 0)) # 1print(dict.get('c', 0)) # 0print(dict.get('c')) # None
deque 是一個(gè)雙端隊(duì)列,可以從兩側(cè)添加和刪除元素。
from collections import dequequeue = deque(['a', 'b', 'c'])queue.append('d')print(queue) # deque(['a', 'b', 'c', 'd'])queue.appendleft('e')print(queue) # deque(['e', 'a', 'b', 'c', 'd'])queue.pop()print(queue) # deque(['e', 'a', 'b', 'c'])queue.popleft()print(queue) # deque(['a', 'b', 'c'])
Python itertools 模塊提供了各種適用于組合計(jì)算的函數(shù)。
from itertools import product, permutations, combinations, combinations_with_replacement, accumulate, groupbya = [1,2,3]print(list(product(a,a))) # [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]print(list(permutations(a))) # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]print(list(combinations(a,2))) # [(1, 2), (1, 3), (2, 3)]print(list(combinations_with_replacement(a,2))) # [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]print(list(accumulate(a))) # [1, 3, 6]print(list(groupby(a))) # [(1, <itertools._grouper object at 0x7f8b8b8b9d10>), (2, <itertools._grouper object at 0x7f8b8b8b9d20>), (3, <itertools._grouper object at 0x7f8b8b8b9d30>)]
lambda 函數(shù)是一種匿名函數(shù),它的語(yǔ)法只包含一個(gè)語(yǔ)句,即:lambda [arg1 [,arg2,.....argn]]:expression。
even_or_odd = lambda a: a%2==0numbers = [1,2,3,4,5]even = list(map(even_or_odd,numbers))print(even) # [False, True, False, True, False]
裝飾器是 Python 的一個(gè)特性,它可以在不顯式修改現(xiàn)有代碼的情況下向現(xiàn)有代碼添加一些新功能。
有兩種類型的裝飾器——函數(shù)裝飾器和類裝飾器。裝飾器函數(shù)在函數(shù)名前有一個(gè)@。
要理解裝飾器的概念,我們首先需要了解一件事——python 中的函數(shù)是類對(duì)象。與其他對(duì)象不同,它們可以在函數(shù)內(nèi)部定義,在其他函數(shù)中作為參數(shù)傳遞,甚至作為函數(shù)返回。
import functoolsdef decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): a,b = args print(a*b) result = func(*args,**kwargs) print(a/b) return result return wrapper@decoratordef add(x,y): return x+yresult = add(5,6)print(result) ##
讓我們理解上面裝飾器的例子:
首先,我們有一個(gè)函數(shù)名 add,它的工作是獲取兩個(gè)變量并返回它們的總和。現(xiàn)在經(jīng)過(guò)一段時(shí)間的工作后,我們意識(shí)到需要為同一個(gè)函數(shù)添加乘法和除法功能。現(xiàn)在我們有兩個(gè)選擇,第一個(gè)是在同一個(gè) add 函數(shù)中添加乘法和除法代碼。或者我們可以使用裝飾器來(lái)添加功能而無(wú)需顯式更改函數(shù)。
為了使用裝飾器,我們首先在第 2 行定義了一個(gè)裝飾器函數(shù)。此函數(shù)將 func 作為輸入。在第二行中,我們有另一個(gè)函數(shù),因?yàn)槲覀冎牢覀兛梢栽诤瘮?shù)內(nèi)部定義函數(shù)。它是一個(gè)具有 *args、**kwargs 函數(shù)參數(shù)的包裝函數(shù)。有了這些,兩者都定義為參數(shù),現(xiàn)在我們可以在函數(shù)內(nèi)部傳遞任意數(shù)量的參數(shù)。在包裝函數(shù)的主體中,我們有乘法邏輯,然后僅使用加法邏輯調(diào)用實(shí)際的加法函數(shù),最后我們有除法邏輯。當(dāng)我們使用一些參數(shù) add(5,6) 調(diào)用 add 函數(shù)時(shí),輸出將是:
300.833333333333333411
因?yàn)樗紫葓?zhí)行乘法邏輯并打印值,然后加法邏輯并保存值,然后除法邏輯并打印值,最后返回相加的值并打印值。
生成器是一種返回可迭代對(duì)象的函數(shù)。它至少包含一個(gè) yield 語(yǔ)句。yield 是 Python 中的一個(gè)關(guān)鍵字,用于從函數(shù)返回值而不破壞其當(dāng)前狀態(tài)或?qū)植孔兞康囊谩в?yield 關(guān)鍵字的函數(shù)稱為生成器。相對(duì)于 return 你可以把 yield 理解為不中斷函數(shù)的暫停,并且返回一個(gè)值。
生成器僅在需要時(shí)生成一次項(xiàng)目。它們的內(nèi)存效率很高,占用的內(nèi)存空間更少。
def fibonacci(n): a,b = 0,1 for i in range(n): a,b = b,a+b yield afor i in fibonacci(5): print(i) ## 1 1 2 3 5
線程和多處理都用于同時(shí)運(yùn)行多個(gè)腳本。進(jìn)程是程序的一個(gè)實(shí)例,線程是進(jìn)程中的一個(gè)實(shí)體。
線程化是多個(gè)線程同時(shí)運(yùn)行以執(zhí)行不同任務(wù)的技術(shù),而多處理是多個(gè)進(jìn)程同時(shí)運(yùn)行在不同CPU上的技術(shù)。下圖對(duì)進(jìn)程和線程的區(qū)別進(jìn)行了說(shuō)明,更多的信息請(qǐng)參考:這兒
Dunder 是 Double 和 Under 的縮寫,稱為雙下劃線方法,是python中的一種特殊方法。
num =5print(num*6) ## 30print(num.__mul__(6)) ## 30
這些方法主要用于重載預(yù)定義的運(yùn)算符。例如,+、-、*、/ 是必須在數(shù)字對(duì)象周圍使用的數(shù)字運(yùn)算符,但 + 也用作兩個(gè)字符串之間的連接運(yùn)算符。所以我們可以說(shuō) + 運(yùn)算符被重載來(lái)執(zhí)行多個(gè)任務(wù)。
a =5b =6print(a+b) ## 11print(a.__add__(b)) ## 11c = 'hello'd = 'world'print(c+d) ## helloworldprint(c.__add__(d)) ## helloworld
日志記錄是在代碼執(zhí)行時(shí)捕獲代碼流的過(guò)程。日志記錄有助于輕松調(diào)試代碼。它通常在文件中完成,以便我們以后可以檢索它。在 python 中,我們有一個(gè)庫(kù)日志記錄,可以幫助我們將日志寫入文件。有五個(gè)級(jí)別的日志記錄:
這兒作者推薦大家一個(gè)簡(jiǎn)單的日志記錄工具:loguru。
上下文管理器是 Python 中的一個(gè)很好的工具,可以幫助進(jìn)行資源管理。它們?cè)试S您在需要時(shí)分配和釋放資源。上下文管理器最常用和最受認(rèn)可的例子是 with 語(yǔ)句。with 主要用于打開(kāi)和關(guān)閉文件。
with open('./test.txt', 'w') as f: f.write('Hello World!')
上面分享的10個(gè)提供python水平的高級(jí)知識(shí)點(diǎn),希望在你工作或面試中有所幫助。
在編程的路上,挑戰(zhàn)與精進(jìn)同在,嘗試學(xué)習(xí)使用裝飾器 、yield、itertool 之類的高級(jí)功能,可以讓你的編程生活變得更加有趣!
本文鏈接:http://www.tebozhan.com/showinfo-26-52167-0.html十個(gè)提高Python水平的高級(jí)知識(shí)點(diǎn)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com