導航:首頁 > 編程語言 > python中popleft

python中popleft

發布時間:2022-09-04 05:36:35

㈠ 詳解python中的協程,為什麼說它的底層是生成器

協程又稱為是微線程,英文名是Coroutine。它和線程一樣可以調度,但是不同的是線程的啟動和調度需要通過操作系統來處理。並且線程的啟動和銷毀需要涉及一些操作系統的變數申請和銷毀處理,需要的時間比較長。而協程呢,它的調度和銷毀都是程序自己來控制的,因此它更加輕量級也更加靈活。

協程有這么多優點,自然也會有一些缺點,其中最大的缺點就是需要編程語言自己支持,否則的話需要開發者自己通過一些方法來實現協程。對於大部分語言來說,都不支持這一機制。go語言由於天然支持協程,並且支持得非常好,使得它廣受好評,短短幾年時間就迅速流行起來。

對於Python來說,本身就有著一個GIL這個巨大的先天問題。GIL是Python的全局鎖,在它的限制下一個Python進程同一時間只能同時執行一個線程,即使是在多核心的機器當中。這就大大影響了Python的性能,尤其是在CPU密集型的工作上。所以為了提升Python的性能,很多開發者想出了使用多進程+協程的方式。一開始是開發者自行實現的,後來在Python3.4的版本當中,官方也收入了這個功能,因此目前可以光明正大地說,Python是支持協程的語言了。

生成器(generator)

生成器我們也在之前的文章當中介紹過,為什麼我們介紹協程需要用到生成器呢,是因為Python的協程底層就是通過生成器來實現的。

通過生成器來實現協程的原因也很簡單,我們都知道協程需要切換掛起,而生成器當中有一個yield關鍵字,剛好可以實現這個功能。所以當初那些自己在Python當中開發協程功能的程序員都是通過生成器來實現的,我們想要理解Python當中協程的運用,就必須從最原始的生成器開始。

生成器我們很熟悉了,本質上就是帶有yield這個關鍵詞的函數。

async,await和future

從Python3.5版本開始,引入了async,await和future。我們來簡單說說它們各自的用途,其中async其實就是@asyncio.coroutine,用途是完全一樣的。同樣await代替的是yield from,意為等待另外一個協程結束。

我們用這兩個一改,上面的代碼就成了:

async def test(k):

n = 0

while n < k:

await asyncio.sleep(0.5)

print('n = {}'.format(n))

n += 1

由於我們加上了await,所以每次在列印之前都會等待0.5秒。我們把await換成yield from也是一樣的,只不過用await更加直觀也更加貼合協程的含義。

Future其實可以看成是一個信號量,我們創建一個全局的future,當一個協程執行完成之後,將結果存入這個future當中。其他的協程可以await future來實現阻塞。我們來看一個例子就明白了:

future = asyncio.Future()

async def test(k):

n = 0

while n < k:

await asyncio.sleep(0.5)

print('n = {}'.format(n))

n += 1

future.set_result('success')

async def log():

result = await future

print(result)

loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.wait([

log(),

test(5)

]))

loop.close()

在這個例子當中我們創建了兩個協程,第一個協程是每隔0.5秒print一個數字,在print完成之後把success寫入到future當中。第二個協程就是等待future當中的數據,之後print出來。

在loop當中我們要調度執行的不再是一個協程對象了而是兩個,所以我們用asyncio當中的wait將這兩個對象包起來。只有當wait當中的兩個對象執行結束,wait才會結束。loop等待的是wait的結束,而wait等待的是傳入其中的協程的結束,這就形成了一個依賴循環,等價於這兩個協程對象結束,loop才會結束。

總結

async並不只是可以用在函數上,事實上還有很多其他的用法,比如用在with語句上,用在for循環上等等。這些用法比較小眾,細節也很多,就不一一展開了,大家感興趣的可以自行去了解一下。

不知道大家在讀這篇文章的過程當中有沒有覺得有些費勁,如果有的話,其實是很正常的。原因也很簡單,因為Python原生是不支持協程這個概念的,所以在一開始設計的時候也沒有做這方面的准備,是後來覺得有必要才加入的。那麼作為後面加入的內容,必然會對原先的很多內容產生影響,尤其是協程藉助了之前生成器的概念來實現的,那麼必然會有很多耦合不清楚的情況。這也是這一塊的語法很亂,對初學者不友好的原因。

㈡ python約瑟夫環怎麼判

importcollections

defjoseph(lst,k):
t=collections.deque(lst)
whilelen(t)>1:
t.rotate(-k)
t.popleft()
returnt

㈢ python多線程中每個線程如果不加休眠時間就會只泡在一個線程上,這該如何處理謝謝

這是三個線程都在跑啊,只是並發的而已

㈣ python注釋符號是什麼

Python中的注釋有單行注釋和多行注釋,Python中單行注釋以#符號開頭,多行注釋用三個單引號'''符號或者三個雙引號"""符號將注釋括起來。

一、python單行注釋符號(#):井號(#)常被用作單行注釋符號,在代碼中使用#時,它右邊的任何數據都會被忽略,當做是注釋。print 1 #輸出1,#號右邊的內容在執行的時候是不會被輸出的。

二、批量、多行注釋符號:在python中也會有注釋有很多行的時候,這種情況下就需要批量多行注釋符了。多行注釋是用三引號''' '''包含的。

python正則表達式的注釋方法:學過正則都知道,那簡直是天書,為了提高正則的可讀性,正則表達式中提供了X(VERBOSE): 詳細模式。這個模式下正則表達式可以是多行,忽略空白字元,並可以加入注釋。

基本語法

Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。

Python開發者有意讓違反了縮進規則的程序不能通過編譯,以此來強製程序員養成良好的編程習慣。並且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括弧或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出。

㈤ 新人,求大神幫助:用python 寫兩個程序 1,有30枚硬幣,其中一枚是假幣,假幣較輕,現有一

NO.1
#encoding:UTF-8
'''
只想到用二分法查找
'''

importrandom

defFindMoney(aList):
iflen(aList)==2:
ifaList[0]>aList[1]:
printaList[1]
else:
printaList[0]
else:
ifsum(aList[len(aList)/2:])>sum(aList[:len(aList)/2]):
FindMoney(aList[:len(aList)/2])
else:
FindMoney(aList[len(aList)/2:])

a=[1]*29+[0]
a.sort(lambdaa,b:random.randint(-1,1))#亂序
printa
FindMoney(a)


NO.2,詳細解釋請參照http://blog.csdn.net/handsomekang/article/details/10089221

#encoding:UTF-8

fromcollectionsimportdeque
importrandom

defMatchschele(team):
c=team[1:]
c=deque(c)
foriinrange(len(team)-1):
c.appendleft(team[0])
forjinrange(len(team)/2):
printc[j],"<----->",c[-1-j]
c.popleft()
c.append(c.popleft())


if__name__=="__main__":
a=[iforiinrange(1,33)]
Matchschele(a)

㈥ python 把列表當作隊列使用方法

5.1.2. 把列表當作隊列使用
你也可以把列表當作隊列使用,隊列作為特定的數據結構,最先進入的元素最先釋放(先進先出)。不過,列表這樣用效率不高。相對來說從列表末尾添加和彈出很快;在頭部插入和彈出很慢(因為,為了一個元素,要移動整個列表中的所有元素)。
要實現隊列,使用 collections.deque,它為在首尾兩端快速插入和刪除而設計。例如:
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

㈦ python基本結構有哪三種

程序的基本結構
程序由三種基本結構組成:順序結構、分支結構和循環結構。任何程序都由這三種基本結構組合而成。
這些基本結構都有一個入口和一個出口。任何程序都由這三種基本結構組合而成。
順序結構
順序結構是程序按照線性順序依次執行的一種運行方式,其中語句塊1S1和語句塊S2表示一個或一組順序執行的語句。
分支結構
分支結構是程序根據條件判斷結果而選擇不同向前執行路徑的一種運行方式,基礎的分支結構是二分支結構。由二分支結構會組合形成多分支結構。

循環結構
循環結構是程序根據條件判斷結果向後反復執行的一種運行方式,根據循環體觸發條件不同,包括條件循環和遍歷循環結構。

㈧ python一般怎樣縮進

python要求同一個作用域中的代碼縮進量一致,具體縮進量沒有硬性規定,但一般都是4個空格。

㈨ 如何入門 Python 爬蟲

#-*-coding:utf-8-*-
importre
importurllib2

fromcollectionsimportdeque

queue=deque()
visited=set()
url='入口頁面,可以換成別的
req_header={'User-Agent':'Mozilla/5.0(WindowsNT6.3;WOW64;Trident/7.0;rv:11.0)likeGecko'}
req_timeout=20
queue.append(url)
cnt=0
whilequeue:
url=queue.popleft()#隊首元素出隊
visited|={url}#標記為已訪問
print(u'已經抓取:'+str(cnt)+u'正在抓取<---'+url)
cnt+=1
req=urllib2.Request(url,None,req_header)
urlop=urllib2.urlopen(req,None,req_timeout)
try:
data=urlop.read().decode('utf-8')
except:
continue
#正則表達式提取頁面中所有隊列,並判斷是否已經訪問過,然後加入待爬隊列
linkre=re.compile('href="(.+?)"')
forxinlinkre.findall(data):
print(x)
if'http'inxandxnotinvisited:
queue.append(x)
print(u'加入隊列--->'+x)

閱讀全文

與python中popleft相關的資料

熱點內容
unix網路編程卷4 瀏覽:805
找靚機app下單什麼時候發貨 瀏覽:411
android一個應用兩個進程 瀏覽:801
linux硬碟復制 瀏覽:806
php圖片伺服器搭建 瀏覽:798
下載壓縮文件怎麼打開 瀏覽:192
新建文件夾叫什麼名字 瀏覽:565
windows20的開機命令 瀏覽:332
微信一般在電腦的那個文件夾 瀏覽:509
go在win7下編譯特別慢 瀏覽:256
光遇ios耳機安卓為什麼沒有 瀏覽:904
小米手機桌面文件夾經常自動散開 瀏覽:607
小米電話手錶用什麼app進行設置 瀏覽:265
虛擬列印機pdf下載 瀏覽:671
jdk編譯運行方法 瀏覽:459
android執行shell命令 瀏覽:349
程序員頭像女 瀏覽:57
有什麼可以變頭發顏色的app 瀏覽:935
玩具解壓屋游戲下載 瀏覽:849
我的世界拔刀劍伺服器地址id 瀏覽:891