用 yield from 重構協(xié)程一旦套接字連接建立,我們就可以發(fā)送 HTTP GET 請求,然后讀取服務(wù)器響應。不再需要哪些分散在各處的回調函數,我們把它們放在同一個(gè)生成器函數中。以下是小編為你整理的python3編程入門(mén)經(jīng)典教程 ?
下載Activepython安裝包。 ?
ActivePython 包含了一個(gè)完整的 Python 內核,直接調用 Python 官方的開(kāi)源內核,附加了一些 Python 的 Windows擴展,同時(shí)還提供了全部的訪(fǎng)問(wèn) Windows APIs 的服務(wù),可以免費使用。提供供32位、64位的python安裝包。 ?
這里使用的是python 2.7.10版本,為什么不用python 3.X呢?因為,目前主流Linux web服務(wù)器的核心版本是2.7,方便部署web應用。 ?
如果這里你使用瀏覽器Chrome,會(huì )提示你是否選擇安裝,選擇保留下載安裝包即可。 ?
選擇點(diǎn)擊“運行”軟件即可,建議大家選擇默認安裝,方便管理環(huán)境變量。 ?
python的拓展庫一般有一致的的默認安裝路徑,選擇默認安裝,減少程序報錯。 ?
查看是否安裝成功。 ?
點(diǎn)擊windows開(kāi)始菜單。選擇“運行“,輸入”cmd“,啟動(dòng)命令行窗口。 ?
在命令行中,輸入”python“,查看是否安裝成功 ?
優(yōu)化python安裝包管理工具。Activepython自帶了pypm安裝包管理工具。所以,這里可以使用pypm來(lái)安裝pip管理工具,順利實(shí)現拓展包的安裝使用。 ?
為什么不直接使用pypm?因為,更新慢、經(jīng)常安裝失敗、下載速度慢……,除非你是付費用戶(hù)。 ?
在新開(kāi)的命令行窗口中輸入”pypm install pip“,即可。 ?
字典的實(shí)用方法
d = {"Start": "開(kāi)始", "learning": "學(xué)習", "python": "python", "version": 3} ?
# 看看d的類(lèi)型是否是字典dict ?
# ?
print(type(d)) ?
# 輸出字典 ?
# {'Start': '開(kāi)始', 'learning': '學(xué)習', 'python': 'python', 'version': 3} ?
print(d) ?
# 用d.keys()返回dict的所有鍵,結果是list ?
# dict_keys(['Start', 'learning', 'python', 'version']) ?
print(d.keys()) ?
# 用for語(yǔ)句循環(huán)返回所有鍵 ?
# Start learning python version ?
for key in d.keys(): ?
print(key, end=' ') ?
# 用d.values()返回dict的所有值 ?
# 如果里面沒(méi)有嵌套別的dict,結果是list ?
# dict_values(['開(kāi)始', '學(xué)習', 'python', 3]) ?
print(d.values()) ?
# 用for語(yǔ)句循環(huán)返回所有值 ?
# 開(kāi)始 學(xué)習 python 3 ?
for values in d.values(): ?
print(values, end=' ',) ?
# 用items()返回一組一組的鍵值對 ?
# 結果是list,只不過(guò)list里面的元素是元組 ?
# dict_items([('Start', '開(kāi)始'), ('learning', '學(xué)習'), ('python', 'python'), ('version', 3)]) ?
print(d.items()) ?
# 用for語(yǔ)句循環(huán)返回一組一組的鍵值對 ?
# ('Start', '開(kāi)始')('learning', '學(xué)習')('python', 'python')('version', 3) ?
for items in d.items(): ?
print(items, end='') ?
# 查看dict項目個(gè)數 ?
print(len(d)) ?
new_d = d.copy() ?
# 拷貝dict ?
print(new_d) ?
# 詞典中增添一個(gè)新元素 ?
d["now"] = "現在" ?
# {'Start': '開(kāi)始', 'learning': '學(xué)習', 'python': 'python', 'version': 3, 'now': '現在'} ?
print(d) ?
# del刪除詞典中的一個(gè)元素 ?
# 沒(méi)有返回值,如果刪除鍵不存在,返回錯誤 ?
del d['now'] ?
# {'Start': '開(kāi)始', 'learning': '學(xué)習', 'python': 'python', 'version': 3} ?
print(d) ?
# 根據key刪除相應的鍵值對,并返回該值 ?
d.pop('Start') ?
# {'learning': '學(xué)習', 'python': 'python', 'version': 3} ?
print(d) ?
d1 = {"now": "現在"} ?
# 把一個(gè)詞典合并到另一個(gè)詞典中 ?
# 把d1詞典合并到d詞典中 ?
d.update(d1) ?
# {'learning': '學(xué)習', 'python': 'python', 'version': 3, 'now': '現在'} ?
print(d) ?
如何有效學(xué)習
基礎知識:學(xué)習每一種新的編程語(yǔ)言都是從最基本的開(kāi)始,對于python而言也是需要先學(xué)習其基礎知識。 ?
python的基礎知識包括:變量和數據類(lèi)型,List和Tuple,條件判斷和循環(huán),Dict和Set, 函數,切片,迭代和列表生成式。 ?
注意:學(xué)習基礎知識切莫著(zhù)急,一定要打好基礎,這樣才會(huì )更好的應用python。 ?
進(jìn)階知識:學(xué)完掌握基礎知識之后,就要學(xué)習進(jìn)階知識了。 ?
python的進(jìn)階知識包括:函數式編程,模塊,面向對象編程基礎,類(lèi)的繼承和定制類(lèi)。
?
python裝飾器:裝飾器是很重要的一個(gè)知識點(diǎn)。 ?
關(guān)于裝飾器需要涉及到函數作用域.閉包的使用和裝飾器的概念及使用。 ?
高階知識: ?
文件處理,錯誤和異常和正則表達式 ?
提升階段: ?
數據庫操作,Django框架和爬蟲(chóng)技術(shù)。 ?
如何學(xué)好python
由于 Python 在工業(yè)界和科學(xué)界都非常受歡迎,因此你不難找到 Python 的學(xué)習資源。如果你是一個(gè)從未接觸過(guò) Python 的新手,你可以利用在線(xiàn)資源,比如課程、書(shū)籍和視頻來(lái)學(xué)習 Python。比如下面列舉的一些資源:
Python 學(xué)習之路
Google 開(kāi)發(fā)者 Python 課程(視頻)
Google 的 Python 課堂 ?
下一步是安裝 Anacona。有了 Anaconda ,你將可以開(kāi)始使用 Python 來(lái)探索機器學(xué)習的世界了。Anaconda 的默認安裝庫包含了進(jìn)行機器學(xué)習所需要的工具。
有了一些基本的 Python 編程技能,你就可以開(kāi)始學(xué)習一些基本的機器學(xué)習技能了。一個(gè)實(shí)用的學(xué)習方法是學(xué)到一定技能便開(kāi)始進(jìn)行練習。然而,如果你想深入學(xué)習這個(gè)領(lǐng)域,那么你需要準備投入更多的學(xué)習時(shí)間。
一個(gè)獲取技能的有效方法是在線(xiàn)課程。吳恩達的 Coursera 機器學(xué)習課程 是一個(gè)不錯的選擇。其它有用的在線(xiàn)訓練包括:
Python 機器學(xué)習: Scikit-Learn 教程python代碼例子
def fetch(self): # ... connection logic from above, then: sock.send(request.encode('ascii')) while True: f = Future() def on_readable(): f.set_result(sock.recv(4096)) selector.register(sock.fileno(), EVENT_READ, on_readable) chunk = yield f selector.unregister(sock.fileno()) if chunk: self.response += chunk else: # Done reading. break
從套接字中讀取所有信息的代碼看起來(lái)很通用。我們能不把它從 fetch 中提取成一個(gè)子過(guò)程?現在該 Python 3 熱捧的 yield from 登場(chǎng)了。它能讓一個(gè)生成器委派另一個(gè)生成器。 ?
讓我們先回到原來(lái)那個(gè)簡(jiǎn)單的生成器例子: ?
>>> def gen_fn(): ... result = yield 1 ... print('result of yield: {}'.format(result)) ... result2 = yield 2 ... print('result of 2nd yield: {}'.format(result2)) ... return 'done' ... ?
為了從其他生成器調用這個(gè)生成器,我們使用 yield from 委派它: ?
>>> # Generator function: >>> def caller_fn(): ... gen = gen_fn() ... rv = yield from gen ... print('return value of yield-from: {}' ... .format(rv)) ... >>> # Make a generator from the >>> # generator function. >>> caller = caller_fn() ?
這個(gè) caller 生成器的行為的和它委派的生成器 gen 表現的完全一致: ?
>>> caller.send(None) 1 >>> caller.gi_frame.f_lasti 15 >>> caller.send('hello') result of yield: hello 2 >>> caller.gi_frame.f_lasti # Hasn't advanced. 15 >>> caller.send('goodbye') result of 2nd yield: goodbye return value of yield-from: done Traceback (most recent call last): File "input", line 1, in StopIteration ?
當 caller 自 gen 生成(yield),caller 就不再前進(jìn)。注意到 caller 的指令指針保持15不變,就是 yield from 的地方,即使內部的生成器 gen 從一個(gè) yield 語(yǔ)句運行到下一個(gè) yield,它始終不變。(事實(shí)上,這就是“yield from”在 CPython 中工作的具體方式。函數會(huì )在執行每個(gè)語(yǔ)句之前提升其指令指針。但是在外部生成器執行“yield from”后,它會(huì )將其指令指針減一,以保持其固定在“yield form”語(yǔ)句上。然后其生成其 caller。這個(gè)循環(huán)不斷重復,直到內部生成器拋出 StopIteration,這里指向外部生成器最終允許它自己進(jìn)行到下一條指令的地方。)從 caller 外部來(lái)看,我們無(wú)法分辨 yield 出的值是來(lái)自 caller 還是它委派的生成器。而從 gen 內部來(lái)看,我們也不能分辨傳給它的值是來(lái)自 caller 還是 caller 的外面。yield from 語(yǔ)句是一個(gè)光滑的管道,值通過(guò)它進(jìn)出 gen,一直到 gen 結束。 ?
協(xié)程可以用 yield from 把工作委派給子協(xié)程,并接收子協(xié)程的返回值。注意到上面的 caller 打印出“return value of yield-from: done”。當 gen 完成后,它的返回值成為 caller 中 yield from 語(yǔ)句的值。