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