本文,我們將分享一些有助于我們掌握 Python 的高級概念。如迭代器、生成器、裝飾器等!
異常處理是一個很重要的概念,它可以幫助我們更好地解決程序中的各種問題。
異常是在程序執行過程中發生并中斷的情況。它可能由于多種原因而發生。比如:除法運算中分母為0的情況,會拋出:ZeroDivisionError;導入不存在的包時,會拋出:ImportError;列表越界時,會拋出:IndexError。python 中大約有30個內置異常。
我們使用 try 和 except 來處理 Python 中的異常。語法如下:
try: pass # 可能發生異常的代碼except ValueError: pass # 發生異常時執行的代碼except ZeroDivisionError: pass # 發生異常時執行的代碼else: pass # 其他情況時執行的代碼finally: pass # 最終執行的執行的代碼
collections 模塊被稱為用于存儲數據的容器。例如列表、元組、集合、字典。Python 中有許多庫是為了提供額外的數據結構而開發的, collections就是其中之一,旨在改進內置容器的功能。該模塊中最常用的五種數據結構:
對可迭代對象的計數。
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有幾個驚艷的方法:# 返回出現次數最多的前3個元素print(count.most_common(3)) # [('1', 4), ('3', 4), ('2', 1)]# 返回生成Counter對象的數據,迭代器格式。for i in count.elements(): print(i) # 1 1 1 2 3 4 3 3 5 6 7 7 1
給元組元素命名,并且可以通過名字訪問元素。
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 是一種可以記住它們插入順序的字典。當然,在最新版本的 Python 中,內置的 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 將返回字典中不存在的鍵的默認值,而不是顯示鍵錯誤。當然新版的dict.get()方法也可以返回默認值。
# 創建一個默認值為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 是一個雙端隊列,可以從兩側添加和刪除元素。
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 模塊提供了各種適用于組合計算的函數。
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 函數是一種匿名函數,它的語法只包含一個語句,即: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 的一個特性,它可以在不顯式修改現有代碼的情況下向現有代碼添加一些新功能。
有兩種類型的裝飾器——函數裝飾器和類裝飾器。裝飾器函數在函數名前有一個@。
要理解裝飾器的概念,我們首先需要了解一件事——python 中的函數是類對象。與其他對象不同,它們可以在函數內部定義,在其他函數中作為參數傳遞,甚至作為函數返回。
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) ##
讓我們理解上面裝飾器的例子:
首先,我們有一個函數名 add,它的工作是獲取兩個變量并返回它們的總和。現在經過一段時間的工作后,我們意識到需要為同一個函數添加乘法和除法功能。現在我們有兩個選擇,第一個是在同一個 add 函數中添加乘法和除法代碼。或者我們可以使用裝飾器來添加功能而無需顯式更改函數。
為了使用裝飾器,我們首先在第 2 行定義了一個裝飾器函數。此函數將 func 作為輸入。在第二行中,我們有另一個函數,因為我們知道我們可以在函數內部定義函數。它是一個具有 *args、**kwargs 函數參數的包裝函數。有了這些,兩者都定義為參數,現在我們可以在函數內部傳遞任意數量的參數。在包裝函數的主體中,我們有乘法邏輯,然后僅使用加法邏輯調用實際的加法函數,最后我們有除法邏輯。當我們使用一些參數 add(5,6) 調用 add 函數時,輸出將是:
300.833333333333333411
因為它首先執行乘法邏輯并打印值,然后加法邏輯并保存值,然后除法邏輯并打印值,最后返回相加的值并打印值。
生成器是一種返回可迭代對象的函數。它至少包含一個 yield 語句。yield 是 Python 中的一個關鍵字,用于從函數返回值而不破壞其當前狀態或對局部變量的引用。帶有 yield 關鍵字的函數稱為生成器。相對于 return 你可以把 yield 理解為不中斷函數的暫停,并且返回一個值。
生成器僅在需要時生成一次項目。它們的內存效率很高,占用的內存空間更少。
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
線程和多處理都用于同時運行多個腳本。進程是程序的一個實例,線程是進程中的一個實體。
線程化是多個線程同時運行以執行不同任務的技術,而多處理是多個進程同時運行在不同CPU上的技術。下圖對進程和線程的區別進行了說明,更多的信息請參考:這兒
Dunder 是 Double 和 Under 的縮寫,稱為雙下劃線方法,是python中的一種特殊方法。
num =5print(num*6) ## 30print(num.__mul__(6)) ## 30
這些方法主要用于重載預定義的運算符。例如,+、-、*、/ 是必須在數字對象周圍使用的數字運算符,但 + 也用作兩個字符串之間的連接運算符。所以我們可以說 + 運算符被重載來執行多個任務。
a =5b =6print(a+b) ## 11print(a.__add__(b)) ## 11c = 'hello'd = 'world'print(c+d) ## helloworldprint(c.__add__(d)) ## helloworld
日志記錄是在代碼執行時捕獲代碼流的過程。日志記錄有助于輕松調試代碼。它通常在文件中完成,以便我們以后可以檢索它。在 python 中,我們有一個庫日志記錄,可以幫助我們將日志寫入文件。有五個級別的日志記錄:
這兒作者推薦大家一個簡單的日志記錄工具:loguru。
上下文管理器是 Python 中的一個很好的工具,可以幫助進行資源管理。它們允許您在需要時分配和釋放資源。上下文管理器最常用和最受認可的例子是 with 語句。with 主要用于打開和關閉文件。
with open('./test.txt', 'w') as f: f.write('Hello World!')
上面分享的10個提供python水平的高級知識點,希望在你工作或面試中有所幫助。
在編程的路上,挑戰與精進同在,嘗試學習使用裝飾器 、yield、itertool 之類的高級功能,可以讓你的編程生活變得更加有趣!
本文鏈接:http://www.www897cc.com/showinfo-26-52167-0.html十個提高Python水平的高級知識點
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com