自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十個(gè)提高Python水平的高級知識點(diǎn)

開發(fā) 前端
分享一些有助于我們掌握 Python 的高級概念。如迭代器、生成器、裝飾器、雙端隊(duì)列、排序字典等!

本文,我們將分享一些有助于我們掌握 Python 的高級概念。如迭代器、生成器、裝飾器等!

一、異常處理

異常處理是一個(gè)很重要的概念,它可以幫助我們更好地解決程序中的各種問題。

異常是在程序執(zhí)行過程中發(fā)生并中斷的情況。它可能由于多種原因而發(fā)生。比如:除法運(yùn)算中分母為0的情況,會(huì)拋出:ZeroDivisionError;導(dǎo)入不存在的包時(shí),會(huì)拋出:ImportError;列表越界時(shí),會(huì)拋出:IndexError。python 中大約有30個(gè)內(nèi)置異常。

我們使用 try 和 except 來處理 Python 中的異常。語法如下:

try:
    pass # 可能發(fā)生異常的代碼
except ValueError:
    pass # 發(fā)生異常時(shí)執(zhí)行的代碼
except ZeroDivisionError:
    pass # 發(fā)生異常時(shí)執(zhí)行的代碼
else:
    pass # 其他情況時(shí)執(zhí)行的代碼
finally:
    pass # 最終執(zhí)行的執(zhí)行的代碼

二、collections模塊

collections 模塊被稱為用于存儲(chǔ)數(shù)據(jù)的容器。例如列表、元組、集合、字典。Python 中有許多庫是為了提供額外的數(shù)據(jù)結(jié)構(gòu)而開發(fā)的, collections就是其中之一,旨在改進(jìn)內(nèi)置容器的功能。該模塊中最常用的五種數(shù)據(jù)結(jié)構(gòu):

1. Counter

對可迭代對象的計(jì)數(shù)。

from collections import Counter
data = [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對象的數(shù)據(jù),迭代器格式。
for i in count.elements():
    print(i) # 1 1 1 2 3 4 3 3 5 6 7 7 1

2. namedtuple

給元組元素命名,并且可以通過名字訪問元素。

from collections import namedtuple
User = 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 13
user = user._replace(age=22)
print(user) # User(name='RunoX', sex='Male', age=22)
print(user._asdict()) # {'name': 'RunoX', 'sex': 'Male', 'age': 22}

3. OrderedDict

OrderedDict 是一種可以記住它們插入順序的字典。當(dāng)然,在最新版本的 Python 中,內(nèi)置的 dict 也可以記住它。

from collections import OrderedDict
dictt = OrderedDict()
dictt['a'] = 5
dictt['d'] = 2
dictt['c'] = 1
dictt['b'] = 3
print(dictt) # OrderedDict([('a', 5), ('d', 2), ('c', 1), ('b', 3)])

4. defaultdict

defaultdict 將返回字典中不存在的鍵的默認(rèn)值,而不是顯示鍵錯(cuò)誤。當(dāng)然新版的dict.get()方法也可以返回默認(rèn)值。

# 創(chuàng)建一個(gè)默認(rèn)值為0的字典
from collections import defaultdict
dictt = defaultdict(int)
dictt['a'] = 2
print(dictt['a']) # 2
print(dictt['b']) # 0

# 新版本的 `dict.get()` 方法
dict = {'a': 1, 'b': 2}
print(dict.get('a', 0)) # 1
print(dict.get('c', 0)) # 0
print(dict.get('c')) # None

5. deque

deque 是一個(gè)雙端隊(duì)列,可以從兩側(cè)添加和刪除元素。

from collections import deque
queue = 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'])

三、itertools 模塊

Python itertools 模塊提供了各種適用于組合計(jì)算的函數(shù)。

  1. product(iterable,iterable):兩個(gè)iterables的笛卡爾積
  2. permutation(iterable):所有可能的排序,沒有重復(fù)元素
  3. combinations(iterable,n):指定長度的所有可能組合,不重復(fù)。這里 n 是組合元組的大小。
  4. combinations_with_replacement(iterable,n):指定長度的所有可能的組合,重復(fù)。
  5. accumlate(iterable) :返回累積iterable元素的總和。
  6. groupby(iterable,key=FUNC) :返回一個(gè)迭代器,其中包含來自可迭代對象的連續(xù)鍵和組。
from itertools import product, permutations, combinations, combinations_with_replacement, accumulate, groupby
a = [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ù)

lambda 函數(shù)是一種匿名函數(shù),它的語法只包含一個(gè)語句,即:lambda [arg1 [,arg2,.....argn]]:expression。

even_or_odd = lambda a: a%2==0
numbers = [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ù)是類對象。與其他對象不同,它們可以在函數(shù)內(nèi)部定義,在其他函數(shù)中作為參數(shù)傳遞,甚至作為函數(shù)返回。

import functools
def 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

@decorator
def add(x,y):
    return x+y
result = add(5,6)
print(result) ##

讓我們理解上面裝飾器的例子:

首先,我們有一個(gè)函數(shù)名 add,它的工作是獲取兩個(gè)變量并返回它們的總和?,F(xiàn)在經(jīng)過一段時(shí)間的工作后,我們意識到需要為同一個(gè)函數(shù)添加乘法和除法功能?,F(xiàn)在我們有兩個(gè)選擇,第一個(gè)是在同一個(gè) add 函數(shù)中添加乘法和除法代碼?;蛘呶覀兛梢允褂醚b飾器來添加功能而無需顯式更改函數(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í),輸出將是:

30
0.8333333333333334
11

因?yàn)樗紫葓?zhí)行乘法邏輯并打印值,然后加法邏輯并保存值,然后除法邏輯并打印值,最后返回相加的值并打印值。

六、迭代器

生成器是一種返回可迭代對象的函數(shù)。它至少包含一個(gè) yield 語句。yield 是 Python 中的一個(gè)關(guān)鍵字,用于從函數(shù)返回值而不破壞其當(dāng)前狀態(tài)或?qū)植孔兞康囊谩в?yield 關(guān)鍵字的函數(shù)稱為生成器。相對于 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 a

for i in fibonacci(5):
    print(i) ## 1 1 2 3 5

七、進(jìn)程和線程

線程和多處理都用于同時(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ù)。下圖對進(jìn)程和線程的區(qū)別進(jìn)行了說明,更多的信息請參考:這兒

八、雙下劃線方法

Dunder 是 Double 和 Under 的縮寫,稱為雙下劃線方法,是python中的一種特殊方法。

num =5
print(num*6) ## 30
print(num.__mul__(6)) ## 30

這些方法主要用于重載預(yù)定義的運(yùn)算符。例如,+、-、*、/ 是必須在數(shù)字對象周圍使用的數(shù)字運(yùn)算符,但 + 也用作兩個(gè)字符串之間的連接運(yùn)算符。所以我們可以說 + 運(yùn)算符被重載來執(zhí)行多個(gè)任務(wù)。

a =5
b =6
print(a+b) ## 11
print(a.__add__(b)) ## 11
c = 'hello'
d = 'world'
print(c+d) ## helloworld
print(c.__add__(d)) ## helloworld

九、日志

日志記錄是在代碼執(zhí)行時(shí)捕獲代碼流的過程。日志記錄有助于輕松調(diào)試代碼。它通常在文件中完成,以便我們以后可以檢索它。在 python 中,我們有一個(gè)庫日志記錄,可以幫助我們將日志寫入文件。有五個(gè)級別的日志記錄:

  1. Debug 調(diào)試:用于診斷問題的詳細(xì)信息。
  2. Info 信息:成功確認(rèn)。
  3. Warning 警告:發(fā)生意外情況時(shí)。
  4. Error 錯(cuò)誤:由于比警告更嚴(yán)重的問題。
  5. Critical 嚴(yán)重:嚴(yán)重錯(cuò)誤后程序無法自行運(yùn)行。

這兒作者推薦大家一個(gè)簡單的日志記錄工具:loguru。

十、上下文管理器

上下文管理器是 Python 中的一個(gè)很好的工具,可以幫助進(jìn)行資源管理。它們允許您在需要時(shí)分配和釋放資源。上下文管理器最常用和最受認(rèn)可的例子是 with 語句。with 主要用于打開和關(guān)閉文件。

with open('./test.txt', 'w') as f:
    f.write('Hello World!')

小節(jié)

上面分享的10個(gè)提供python水平的高級知識點(diǎn),希望在你工作或面試中有所幫助。

在編程的路上,挑戰(zhàn)與精進(jìn)同在,嘗試學(xué)習(xí)使用裝飾器 、yield、itertool 之類的高級功能,可以讓你的編程生活變得更加有趣!

責(zé)任編輯:華軒 來源: 哈希編程
相關(guān)推薦

2010-03-09 17:30:08

Linux新手知識點(diǎn)

2025-04-01 08:25:00

OSPF網(wǎng)絡(luò)IT

2010-03-18 13:48:14

Linux新手

2009-06-24 10:45:42

Linux

2024-12-27 08:59:01

2021-10-18 08:01:44

TS語言TypeScript

2011-08-16 13:15:15

MongoDB

2018-11-16 16:13:33

5G通信技術(shù)網(wǎng)絡(luò)

2024-11-01 08:00:00

2009-07-03 17:09:01

學(xué)習(xí)Tapestry

2022-04-20 07:42:08

Python腳本代碼

2022-08-20 19:12:22

編程竅門

2022-08-29 14:56:56

Python腳本代碼

2023-07-02 14:21:06

PythonMatplotlib數(shù)據(jù)可視化庫

2024-09-19 16:00:01

網(wǎng)絡(luò)編程網(wǎng)絡(luò)Python

2024-10-15 09:59:52

2024-10-28 19:36:05

2021-05-12 09:00:00

WebReactJavaScript

2022-11-07 16:06:15

TypeScript開發(fā)技巧

2021-03-11 09:02:37

SQL數(shù)據(jù)庫數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號