Python語言程式設計之學習問題集合

2021-09-02 19:21:52 字數 2365 閱讀 6550

1.為什麼c語言較python等指令碼語言編寫計算密集型任務效率更高,而python等指令碼語言編寫io密集型任務較c語言效率更高?

答:可能的解釋a:io密集型任務比如web服務,這類服務的開發**可能會經常性的更改、更新,所以需要開發效率較高的**,即**量少,碼起來較快。

2.在進行tcp程式設計,呼叫socket進行通訊時,客戶端傳送資料出去,一定會等到伺服器傳送資料回,才會接著執行後面的**嗎?

答:這是同步io模型。非同步io模型便能有效解決這個問題,使得主線程在等待乙個io操作返回結果的過程中,能繼續執行下面的**。

3.在非同步io模型下,乙個執行緒就可以同時處理多個io請求,並且沒有切換執行緒的操作。對於大多數io密集型的應用程式,使用非同步io將大大提公升系統的多工處理能力。為什麼乙個執行緒處理多個io請求時並沒有切換執行緒的操作,那它又是如何進行多個io請求的處理呢?

答:利用協程,使用yield關鍵字將協程標記為generator,在執行多協程(共享乙個執行緒)時,便能利用yield的中斷及返回值實現協程之間的切換操作,從而實現非同步io。

4.yield表示式如何理解其執行機制?

答:執行如下**: 

def consumer():

r = ''

while true:

print(r)

n = yield r

if not n:

return

print('[consumer] consuming %s...' % n)

r = '200 ok'

def produce(c):

c.send(none)

n = 0

while n < 5:

n = n + 1

print('[producer] producing %s...' % n)

r = c.send(n)

print('[producer] consumer return: %s' % r)

c.close()

c = consumer()

produce(c)

結果為:

#空行

[producer] producing 1...

[consumer] consuming 1...

200 ok

[producer] consumer return: 200 ok

[producer] producing 2...

[consumer] consuming 2...

200 ok

[producer] consumer return: 200 ok

[producer] producing 3...

[consumer] consuming 3...

200 ok

[producer] consumer return: 200 ok

[producer] producing 4...

[consumer] consuming 4...

200 ok

[producer] consumer return: 200 ok

[producer] producing 5...

[consumer] consuming 5...

200 ok

[producer] consumer return: 200 ok

分析可發現:凡send(mesg)方法即執行相應generator函式並把mesg賦給當前yield表示式,然後直至遇到下乙個yield關鍵字(如後面無yield,則需.close(),否則會丟擲stopiteration異常),並返回下乙個yield的引數(此例中為r)。

c.send(none)初始化即從函式開始執行,傳入none是因為最開始沒有yield表示式接收賦值,然後直到遇到yield(1號),並返回yield的引數r(為' '),亦跳出consumer函式,回到produce函式中繼續執行下面的**;

遇到c.send(n)又開始切換到consumer中執行,從上次中斷處執行即yield處,將n賦值給本次yield(1號)表示式,然後繼續執行consumer中下面的**,直至遇到下一次yield(2號),返回yield(2號)的引數r,中斷consumer,切換produce函式,接著send(n)繼續執行;如此迴圈,直至produce結束。

總結:有yield表示式的執行方式即是利用c.send(mesg)切換到c函式中執行,

遇到yield表示式,將mesg賦值給yield表示式,繼續執行c函式,

並在下一次yield中斷c函式的執行,並將此時yield的引數r作為c.send(mesg)的返回值,回到c.send(mesg)所在的**處執行下面的**,

再下一次c.send(mesg)從中斷的yield處執行c函式。

python之學習之旅

python簡介及環境搭建 python 英國發音 pa n 美國發音 pa n 是一種物件導向的解釋型 計算機程式語言,由荷蘭人 guido van rossum於1989年發明,第乙個公開發行版發行於1991年。python是純粹的 自由軟體,源 和 直譯器cpython遵循 gpl gnu g...

核心程式設計 驅動之學習筆記

最近學習了核心程式設計,雖然說學的比較淺,但是也不能有一絲絲的懈怠,生怕自己聽不懂,又被班同學落 la 下 就如我的qq個性簽名一樣,有的時候,我們不停地跑啊跑,只是為了能追上那個被寄予厚望的自己 作業系統的核心是非常強大的,強大到令你吃驚,記憶體管理,程序管理,中斷機制,保護機制 核心中沒有程序,...

程式設計 英語 數學之學習方法

程式設計 摘至知乎 零基礎應當如何開始學習 python 注 其他人的回答也同樣精彩,程式語言的學習方法都是通用的 雖然我不是python高手,但我是零基礎,之前會的都是軟體ps,ppt之類。如果目的是想成為程式設計師,參考教學大綱。1,找到合適的入門書籍,大致讀一次,迴圈啊判斷啊,常用類啊,搞懂 ...