国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
開始使用Deque
有效地彈出和追加元素
訪問Deque中的任意元素
用Deque構(gòu)建高效隊列
總結(jié)
首頁 後端開發(fā) Python教學(xué) Python中的Deque: 實作高效的佇列與堆疊

Python中的Deque: 實作高效的佇列與堆疊

Apr 12, 2023 pm 09:46 PM
python 堆疊 佇列

Python 中的 deque?是一個低階的、高度最佳化的雙端佇列,對於實現(xiàn)優(yōu)雅、高效的Pythonic 佇列和堆疊很有用,它們是計算中最常見的列表式資料類型。

本文中,雲(yún)朵君將和大家一起學(xué)習(xí)如下:

  • 開始使用deque
  • 有效地彈出和追加元素
  • 訪問deque中的任意元素
  • 用deque建立高效能佇列

開始使用Deque

向Python 清單的右端追加元素和彈出元素的操作,一般非常有效率。如果用大 O 表示時間複雜性,那麼可以說它們是?O(1)。而當(dāng) Python 需要重新分配記憶體來增加底層列表以接受新的元素時,這些操作就會變慢,時間複雜度可能變成?O(n)。

此外,在 Python 清單的左端追加和彈出元素的操作,也是非常低效的,時間複雜度為O(n)。

由於清單提供了?.append()?和?.pop()?這兩個操作,它們可以作為堆疊和佇列使用。而清單的左右端追加和彈出操作的效能問題會大大影響應(yīng)用程式的整體效能。

Python 的 deque 是早在 Python 2.4 中加入到 collections 模組的第一個資料類型。這個資料型別是專門為克服 Python list 中的?.append()和?.pop()?的效率問題而設(shè)計的。

Deques是類似序列的資料類型,被設(shè)計為堆疊和佇列的一般化,它們在資料結(jié)構(gòu)的兩端支援高效的記憶體和快速的追加和彈出操作。

在 deque 物件兩端的追加和彈出操作是穩(wěn)定的,而且同樣有效,因為 deque 是作為雙連結(jié)列表實現(xiàn)。此外,deque 上的追加和彈出操作也是線程安全的和記憶體高效的。這些特性使得 deque 在Python中建立自訂堆疊和佇列時特別有用。

如果需要儲存最後看到的元素列表,也可以使用 deque,因為可以限制 deque 的最大長度。如果我們這樣做了,那麼一旦 deque 滿了,當(dāng)我們在另一端添加新的元素時,它會自動丟棄一端的元素。

以下是deque 的主要特點(diǎn)的總結(jié):

  • 儲存任何資料類型的元素
  • 是可變資料類型
  • 支援帶in運(yùn)算子的成員運(yùn)算
  • 支援索引,例如a_deque[i]
  • 不支援切片,例如a_deque[0:2]
  • 支援對序列和可迭代物件進(jìn)行操作的內(nèi)建函數(shù),如?len() ,sorted() ,reversed()?等
  • 不支援inplace?排序
  • 支援正常迭代和反向迭代
  • #支援使用pickle
  • 確保在兩端快速、記憶體高效和線程安全的彈出和追加操作

#建立deque 實例比較簡單。只需要從 collection 匯入 deque,然後用一個可選的迭代器作為參數(shù)來呼叫它。

>>> from collections import deque

>>> # 創(chuàng)建一個空的 deque
>>> deque()
deque([])

>>> # 使用不同的迭代器來創(chuàng)建 deque
>>> deque((1, 2, 3, 4))
deque([1, 2, 3, 4])

>>> deque([1, 2, 3, 4])
deque([1, 2, 3, 4])

>>> deque(range(1, 5))
deque([1, 2, 3, 4])

>>> deque("abcd")
deque(['a', 'b', 'c', 'd'])

>>> numbers = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> deque(numbers.keys())
deque(['one', 'two', 'three', 'four'])

>>> deque(numbers.values())
deque([1, 2, 3, 4])

>>> deque(numbers.items())
deque([('one', 1), ('two', 2), ('three', 3), ('four', 4)])

如果實例化 deque 時沒有提供 iterable 作為參數(shù),那麼就會得到一個空的 deque。如果提供並輸入 iterable ,那麼 deque 會用它的資料初始化新實例。初始化使用?deque.append()?由左至右進(jìn)行。

Deque?初始化器需要以下兩個可選參數(shù)。

  • iterable一個提供初始化資料的迭代器。
  • maxlen一個整數(shù),指定deque的最大長度。

如前所述,如果不提供一個 iterable ,那麼你會得到一個空的 deque。如果提供 maxlen 一個值,那麼你的 deque 只會儲存最多的 maxlen 項。

最後,也可以使用無序的可迭代對象,如 collections 來初始化 deque。在這些情況下,不會有最終 deque 中元素的預(yù)定義順序。

有效地彈出和追加元素

Deque 和 List 之間最重要的區(qū)別是,前者可以在序列的兩端進(jìn)行有效的追加和彈出操作。 Deque 類別實作了專門的?.popleft()?和?.appendleft()?方法,直接對序列的左端進(jìn)行操作。

>>> from collections import deque

>>> numbers = deque([1, 2, 3, 4])
>>> numbers.popleft()
1
>>> numbers.popleft()
2
>>> numbers
deque([3, 4])

>>> numbers.appendleft(2)
>>> numbers.appendleft(1)
>>> numbers
deque([1, 2, 3, 4])

在這裡,使用?.popleft()?和?.appendleft()?來分別彈出並增加?numbers的左端值。這些方法是針對deque的設(shè)計的,而 list 沒有這樣的方法。

Deque也提供了像list一樣的?.append()?和?.pop()?方法來操作序列的右端。然而,.pop()?的行為是不同的。

>>> from collections import deque

>>> numbers = deque([1, 2, 3, 4])
>>> numbers.pop()
4

>>> numbers.pop(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes no arguments (1 given)

在這裡,.pop()?刪除並傳回 deque 容器中的最後一個元素。此方法不接受索引作為參數(shù),因此不能使用它從 deque 中刪除任意項。只能使用它來刪除並傳回最右邊的項目。

我們認(rèn)為 deque 是一個雙鍊錶。因此,給定 deque 容器中的每一項都保存著序列中上下一項的引用(指標(biāo))。

雙鍊錶使得從兩端添加和彈出元素的操作變得簡單而高效,因為只有指針需要更新,因此,這兩個操作具有相似的性能,均為O(1)。它們在效能方面也是可預(yù)測的,因為不需要重新分配記憶體和移動現(xiàn)有項來接受新項。

從常規(guī) Python 列表的左端追加和彈出元素需要移動所有元素,這最終是一個 O(n) 操作。此外,將元素添加到列表的右端通常需要Python重新分配內(nèi)存,并將當(dāng)前項復(fù)制到新的內(nèi)存位置,之后,它可以添加新項。這個過程需要更長的時間來完成,并且追加操作從 O(1)傳遞到 O(n)。

考慮以下關(guān)于在序列左端添加項的性能測試,deque vs list。

# time_append.py

from collections import deque
from time import perf_counter

TIMES = 10_000
a_list = []
a_deque = deque()

def average_time(func, times):
total = 0.0
for i in range(times):
start = perf_counter()
func(i)
total += (perf_counter() - start) * 1e9
return total / times

list_time = average_time(lambda i: a_list.insert(0, i), TIMES)
deque_time = average_time(lambda i: a_deque.appendleft(i), TIMES)
gain = list_time / deque_time

print(f"list.insert(){list_time:.6} ns")
print(f"deque.appendleft() {deque_time:.6} ns({gain:.6}x faster)")

在這個腳本中,average_time() 計算了執(zhí)行一個給定次數(shù)的函數(shù)(func)的平均時間。如果我們在命令行中運(yùn)行該腳本,那么我們會得到以下輸出。

$ python time_append.py
list.insert()3735.08 ns
deque.appendleft() 238.889 ns(15.6352x faster)

在這個例子中,deque 上的 .appendleft() 要比 list 上的 .insert() 快幾倍。注意 deque.appendleft() 執(zhí)行時間是常量O(1)。但列表左端的 list.insert() 執(zhí)行時間取決于要處理的項的數(shù)量O(n)。

在這個例子中,如果增加 TIMES 的值,那么 list.insert() 會有更高的時間測量值,而 deque.appendleft() 會得到穩(wěn)定(常數(shù))的結(jié)果。如果對 deque 和 list 的 pop 操作進(jìn)行類似的性能測試,那么可以展開下面的練習(xí)塊。

Exercise:測試 deque.popleft() 與 list.pop(0) 的性能

可以將上面的腳本修改為時間deque.popleft()與list.pop(0)操作并估計它們的性能。

Solution:測試 deque.popleft() 與 list.pop(0) 的性能

# time_pop.py

from collections import deque
from time import perf_counter

TIMES = 10_000
a_list = [1] * TIMES
a_deque = deque(a_list)

def average_time(func, times):
total = 0.0
for _ in range(times):
start = perf_counter()
func()
total += (perf_counter() - start) * 1e9
return total / times

list_time = average_time(lambda: a_list.pop(0), TIMES)
deque_time = average_time(lambda: a_deque.popleft(), TIMES)
gain = list_time / deque_time

print(f"list.pop(0) {list_time:.6} ns")
print(f"deque.popleft() {deque_time:.6} ns({gain:.6}x faster)")
list.pop(0) 2002.08 ns
deque.popleft() 326.454 ns(6.13282x faster)

同樣,它deque比list從底層序列的左端刪除元素要快。
嘗試更改TIMES的值,看看會發(fā)生什么

Deque 數(shù)據(jù)類型的設(shè)計是為了保證在序列的兩端進(jìn)行有效的追加和彈出操作。它是處理需要在 Python 中實現(xiàn)隊列和堆棧數(shù)據(jù)結(jié)構(gòu)的問題的理想選擇。

訪問Deque中的任意元素

Python 的 deque 返回可變的序列,其工作方式與列表相當(dāng)類似。除了可以有效地從其末端追加和彈出元素外,deque 還提供了一組類似列表的方法和其他類似序列的操作,以處理任意位置的元素。下面是其中的一些。

選項

描述

.insert(i, value)

在索引為i的deque容器中插入一個名為value的元素。

.remove (value)

刪除第一個出現(xiàn)的 value ,如果 value 不存在則引發(fā)ValueError

a_deque[i]

從一個deque容器中檢索索引為 i 的項。

del a_deque[i]

#從deque容器移除索引為 i 的項目。

#

我們可以使用這些方法和技術(shù)來處理 deque 對象內(nèi)部任何位置的元素。下面是如何做到這一點(diǎn)的。

>>> from collections import deque
>>> letters = deque("abde")
>>> letters.insert(2, "c")
>>> letters
deque(['a', 'b', 'c', 'd', 'e'])

>>> letters.remove("d")
>>> letters
deque(['a', 'b', 'c', 'e'])

>>> letters[1]
'b'

>>> del letters[2]
>>> letters
deque(['a', 'b', 'e'])

在這里,首先將"c"插入到位置 2的letters中。然后使用 .remove() 從deque容器中移除"d"。Deque 還允許索引來訪問元素,在這里使用它來訪問索引1處的b。最后,你可以使用 del 關(guān)鍵字從 deque 中刪除任何存在的項。請注意, .remove() 允許按值刪除項,而del則按索引刪除項。

盡管 deque 對象支持索引,但它們不支持切片,即不能像常規(guī)列表一樣使用切片語法, [start:stop:step] 從現(xiàn)有的 deque 中提取:

>>> from collections import deque
>>> numbers = deque([1, 2, 3, 4, 5])
>>> numbers[1:3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'

Deque支持索引,卻不支持分片。通常來說在一個鏈表上執(zhí)行切片非常低效。

雖然 deque 與 list 非常相似,但 list 是基于數(shù)組的,而 deque 是基于雙鏈表的。

Deque 基于雙鏈表,在訪問、插入和刪除任意元素都是無效操作。如果需要執(zhí)行這些操作,則解釋器必須在deque中進(jìn)行迭代,直到找到想要的元素。因而他們的時間復(fù)雜度是O(n)而不是O(1)。

下面演示了在處理任意元素時 deques 和 list 的行為。

# time_random_access.py

from collections import deque
from time import perf_counter

TIMES = 10_000
a_list = [1] * TIMES
a_deque = deque(a_list)

def average_time(func, times):
total = 0.0
for _ in range(times):
start = perf_counter()
func()
total += (perf_counter() - start) * 1e6
return total / times

def time_it(sequence):
middle = len(sequence) // 2
sequence.insert(middle, "middle")
sequence[middle]
sequence.remove("middle")
del sequence[middle]

list_time = average_time(lambda: time_it(a_list), TIMES)
deque_time = average_time(lambda: time_it(a_deque), TIMES)
gain = deque_time / list_time

print(f"list{list_time:.6} μs ({gain:.6}x faster)")
print(f"deque {deque_time:.6} μs")

這個腳本對插入、刪除和訪問一個 deque 和一個 list 中間的元素進(jìn)行計時。如果運(yùn)行這個腳本,得到如下所示的輸出:

$ python time_random_access.py
list63.8658 μs (1.44517x faster)
deque 92.2968 μs

Deque并不像列表那樣是隨機(jī)訪問的數(shù)據(jù)結(jié)構(gòu)。因此,從 deque 的中間訪問元素的效率要比在列表上做同樣的事情低。這說明 deque 并不總是比列表更有效率。

Python 的 deque 對序列兩端的操作進(jìn)行了優(yōu)化,所以它們在這方面一直比 list 好。另一方面,列表更適合于隨機(jī)訪問和固定長度的操作。下面是 deque 和 list 在性能上的一些區(qū)別。

運(yùn)作

??deque??

??list??

通過索引訪問任意的元素

O(n)

O(1)

在左端彈出和追加元素

O(1)

O(n)

#在右端彈出和追加元素

##O (1)

O(1) 重新指派

############### #######O(n)############O(n)################

對于列表,當(dāng)解釋器需要擴(kuò)大列表以接受新項時,.append()的性能優(yōu)勢受到內(nèi)存重新分配的影響而被降低。此操作需要將所有當(dāng)前項復(fù)制到新的內(nèi)存位置,這將極大地影響性能。

此總結(jié)可以幫助我們?yōu)槭诸^的問題選擇適當(dāng)?shù)臄?shù)據(jù)類型。但是,在從列表切換到 deque 之前,一定要對代碼進(jìn)行剖析,它們都有各自的性能優(yōu)勢。

用Deque構(gòu)建高效隊列

Deque 是一個雙端隊列,提供了堆棧和隊列的泛化。在本節(jié)中,我們將一起學(xué)習(xí)如何使用deque以優(yōu)雅、高效和Pythonic的方式在底層實現(xiàn)我們自己的隊列抽象數(shù)據(jù)類型(ADT)。

注意: 在 Python 標(biāo)準(zhǔn)庫中,queue 模塊實現(xiàn)了多生產(chǎn)者、多消費(fèi)者的隊列,可以在多個線程之間安全地交換信息。

如果你正在處理隊列,那么最好使用那些高級抽象而不是 deque ,除非你正在實現(xiàn)自己的數(shù)據(jù)結(jié)構(gòu)。

隊列是元素的collections,可以通過在一端添加元素和從另一端刪除元素來修改隊列。

隊列 以先入先出(FIFO)的方式管理元素,像一個管道一樣工作,在管道的一端推入新元素,并從另一端彈出舊元素。向隊列的一端添加一個元素稱為 enqueue 操作;從另一端刪除一個元素稱為 dequeue。

為了更好地理解隊列,以餐廳為例,餐館里有很多人在排隊等著點(diǎn)餐。通常情況下,后來的人將排在隊列的末端。一旦有了空桌子,排在隊伍開頭的人就會離開隊伍進(jìn)去用餐。

下面演示了使用一個原始的deque對象來模擬這個過程。

>>> from collections import deque

>>> customers = deque()

>>> # People arriving
>>> customers.append("Jane")
>>> customers.append("John")
>>> customers.append("Linda")

>>> customers
deque(['Jane', 'John', 'Linda'])

>>> # People getting tables
>>> customers.popleft()
'Jane'
>>> customers.popleft()
'John'
>>> customers.popleft()
'Linda'

>>> # No people in the queue
>>> customers.popleft()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop from an empty deque

首先創(chuàng)建一個空的 deque 對象來表示到達(dá)餐廳的人的隊列。person排隊放入隊列,可以使用.append(),將單個條目添加到右端。要從隊列中取出一個person,可以使用.popleft() ,刪除并返回deque容器左側(cè)的各個條目。

用隊列模擬工作,然而,由于deque是一個泛化,它的API]不匹配常規(guī)的隊列API。例如,不是.enqueue(),而是.append()。還有.popleft() 而不是.dequeue()。此外,deque 還提供了其他一些可能不符合特定需求的操作。

我們可以創(chuàng)建具有特定功能的自定義隊列類??梢栽趦?nèi)部使用 deque 來存儲數(shù)據(jù),并在自定義隊列中提供所需的功能。我們可以把它看作是適配器設(shè)計模式的一個實現(xiàn),在這個模式中,把 deque 的接口轉(zhuǎn)換成看起來更像隊列接口的東西。

例如,需要一個自定義的隊列抽象數(shù)據(jù)類型,提供以下功能。

  • 排列元素
  • 去排隊的元素
  • 返回隊列的長度
  • 支持成員資格測試
  • 支持正常和反向迭代
  • 提供一個方便用戶的字符串表示法

此時可以寫一個Queue類。

# custom_queue.py

from collections import deque

class Queue:
def __init__(self):
self._items = deque()

def enqueue(self, item):
self._items.append(item)

def dequeue(self):
try:
return self._items.popleft()
except IndexError:
raise IndexError("dequeue from an empty queue") from None

def __len__(self):
return len(self._items)

def __contains__(self, item):
return item in self._items

def __iter__(self):
yield from self._items

def __reversed__(self):
yield from reversed(self._items)

def __repr__(self):
return f"Queue({list(self._items)})"

._items 是一個 deque 對象,可以存儲和操作隊列中的元素。Queue使用 deque.append() 實現(xiàn)了 .enqueue(),將元素添加到隊列的末端。還用 deque.popleft() 實現(xiàn)了 .dequeue(),以有效地從隊列的開頭刪除元素。

支持以下特殊方法

##常規(guī)迭代#反向迭代字串表示形式

Method

Support

??.__len__ ()??

長度的?#len()

#.__contains__( )

帶有in的成員測試

##常規(guī)迭代

.__reversed__()

# .__repr__()

############

理想情況下,.__repr__()返回一個字符串,代表一個有效的 Python 表達(dá)式??梢杂眠@個表達(dá)式以相同的值重新創(chuàng)建這個對象。

然而,在上面的例子中,目的是使用方法的返回值在 interactive shell 上優(yōu)雅地顯示對象。可以通過接受初始化可迭代對象作為.__init__() 的參數(shù)并從中構(gòu)建實例,從而從這個特定的字符串表示形式構(gòu)建 Queue 實例。

有了這些補(bǔ)充,Queue 類就完成了。要在我們的代碼中使用這個類,我們可以做如下事情。

>>> from custom_queue import Queue
>>> numbers = Queue()
>>> numbers
Queue([])

>>> # Enqueue items
>>> for number in range(1, 5):
... numbers.enqueue(number)
...
>>> numbers
Queue([1, 2, 3, 4])

>>> # Support len()
>>> len(numbers)
4

>>> # Support membership tests
>>> 2 in numbers
True
>>> 10 in numbers
False

>>> # Normal iteration
>>> for number in numbers:
... print(f"Number: {number}")
...
1
2
3
4

總結(jié)

隊列和堆棧是編程中常用的?抽象數(shù)據(jù)類型。它們通常需要在底層數(shù)據(jù)結(jié)構(gòu)的兩端進(jìn)行有效的?pop?和?append?操作。Python 的 collections 模塊提供了一種叫做 deque 的數(shù)據(jù)類型,它是專門為兩端的快速和節(jié)省內(nèi)存的追加和彈出操作而設(shè)計的。

有了deque,我們可以用優(yōu)雅、高效和Pythonic的方式在低層次上編寫我們自己的隊列和堆棧。

總結(jié)下本文所學(xué)內(nèi)容:

  • 如何在代碼中創(chuàng)建和使用Python的deque
  • 如何有效地從deque的兩端追加和彈出項目
  • 如何使用deque來構(gòu)建高效的隊列和堆棧
  • 什么時候值得使用deque而不是list

以上是Python中的Deque: 實作高效的佇列與堆疊的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何處理Python中的API身份驗證 如何處理Python中的API身份驗證 Jul 13, 2025 am 02:22 AM

處理API認(rèn)證的關(guān)鍵在於理解並正確使用認(rèn)證方式。 1.APIKey是最簡單的認(rèn)證方式,通常放在請求頭或URL參數(shù)中;2.BasicAuth使用用戶名和密碼進(jìn)行Base64編碼傳輸,適合內(nèi)部系統(tǒng);3.OAuth2需先通過client_id和client_secret獲取Token,再在請求頭中帶上BearerToken;4.為應(yīng)對Token過期,可封裝Token管理類自動刷新Token;總之,根據(jù)文檔選擇合適方式,並安全存儲密鑰信息是關(guān)鍵。

如何用Python測試API 如何用Python測試API Jul 12, 2025 am 02:47 AM

要測試API需使用Python的Requests庫,步驟為安裝庫、發(fā)送請求、驗證響應(yīng)、設(shè)置超時與重試。首先通過pipinstallrequests安裝庫;接著用requests.get()或requests.post()等方法發(fā)送GET或POST請求;然後檢查response.status_code和response.json()確保返回結(jié)果符合預(yù)期;最後可添加timeout參數(shù)設(shè)置超時時間,並結(jié)合retrying庫實現(xiàn)自動重試以增強(qiáng)穩(wěn)定性。

Python函數(shù)可變範(fàn)圍 Python函數(shù)可變範(fàn)圍 Jul 12, 2025 am 02:49 AM

在Python中,函數(shù)內(nèi)部定義的變量是局部變量,僅在函數(shù)內(nèi)有效;外部定義的是全局變量,可在任何地方讀取。 1.局部變量隨函數(shù)執(zhí)行結(jié)束被銷毀;2.函數(shù)可訪問全局變量但不能直接修改,需用global關(guān)鍵字;3.嵌套函數(shù)中若要修改外層函數(shù)變量,需使用nonlocal關(guān)鍵字;4.同名變量在不同作用域互不影響;5.修改全局變量時必須聲明global,否則會引發(fā)UnboundLocalError錯誤。理解這些規(guī)則有助於避免bug並寫出更可靠的函數(shù)。

Python Fastapi教程 Python Fastapi教程 Jul 12, 2025 am 02:42 AM

要使用Python創(chuàng)建現(xiàn)代高效的API,推薦使用FastAPI;其基於標(biāo)準(zhǔn)Python類型提示,可自動生成文檔,性能優(yōu)越。安裝FastAPI和ASGI服務(wù)器uvicorn後,即可編寫接口代碼。通過定義路由、編寫處理函數(shù)並返回數(shù)據(jù),可以快速構(gòu)建API。 FastAPI支持多種HTTP方法,並提供自動生成的SwaggerUI和ReDoc文檔系統(tǒng)。 URL參數(shù)可通過路徑定義捕獲,查詢參數(shù)則通過函數(shù)參數(shù)設(shè)置默認(rèn)值實現(xiàn)。合理使用Pydantic模型有助於提升開發(fā)效率和準(zhǔn)確性。

與超時的python循環(huán) 與超時的python循環(huán) Jul 12, 2025 am 02:17 AM

為Python的for循環(huán)添加超時控制,1.可結(jié)合time模塊記錄起始時間,在每次迭代中判斷是否超時並使用break跳出循環(huán);2.對於輪詢類任務(wù),可用while循環(huán)配合時間判斷,並加入sleep避免CPU佔滿;3.進(jìn)階方法可考慮threading或signal實現(xiàn)更精確控制,但複雜度較高,不建議初學(xué)者首選;總結(jié)關(guān)鍵點(diǎn):手動加入時間判斷是基本方案,while更適合限時等待類任務(wù),sleep不可缺失,高級方法適用於特定場景。

如何在Python中解析大型JSON文件? 如何在Python中解析大型JSON文件? Jul 13, 2025 am 01:46 AM

如何在Python中高效處理大型JSON文件? 1.使用ijson庫流式處理,通過逐項解析避免內(nèi)存溢出;2.若為JSONLines格式,可逐行讀取並用json.loads()處理;3.或先將大文件拆分為小塊再分別處理。這些方法有效解決內(nèi)存限制問題,適用於不同場景。

python循環(huán)在元組上 python循環(huán)在元組上 Jul 13, 2025 am 02:55 AM

在Python中,用for循環(huán)遍曆元組的方法包括直接迭代元素、同時獲取索引和元素、以及處理嵌套元組。 1.直接使用for循環(huán)可依次訪問每個元素,無需管理索引;2.使用enumerate()可同時獲取索引和值,默認(rèn)索引起始為0,也可指定start參數(shù);3.對嵌套元組可在循環(huán)中解包,但需確保子元組結(jié)構(gòu)一致,否則會引發(fā)解包錯誤;此外,元組不可變,循環(huán)中不能修改內(nèi)容,可用\_忽略不需要的值,且建議遍歷前檢查元組是否為空以避免錯誤。

Python默認(rèn)論點(diǎn)及其潛在問題是什麼? Python默認(rèn)論點(diǎn)及其潛在問題是什麼? Jul 12, 2025 am 02:39 AM

Python默認(rèn)參數(shù)在函數(shù)定義時評估並固定值,可能導(dǎo)致意外問題。使用可變對像如列表作為默認(rèn)參數(shù)會保留修改,建議用None代替;默認(rèn)參數(shù)作用域是定義時的環(huán)境變量,後續(xù)變量變化不影響其值;避免依賴默認(rèn)參數(shù)保存狀態(tài),應(yīng)使用類封裝狀態(tài)以確保函數(shù)一致性。

See all articles