如今,請跟着捨得的腳步,打開《HeadFirst Python》第二章。python
一章的內容其實沒有多少,多練習幾回就能掌握一個大概了!算法
《HeadFirst Python》的第二章設計得頗有意思。它直接從製做一個模塊入手,順帶講了模塊的導入,傳統的書可不會這麼搞。編輯器
不過書中關於編輯器的觀點略顯陳舊。ide
最好的編輯器是什麼? 別用書中推薦的Python自帶IDLE,在現階段,請使用Jupyter Notebook來進行各項練習。函數
等學完這本書後,你能夠選擇PyCharm/Eric6/WingIDE進行Python的開發,捨得將會帶你開啓那個新的篇章。工具
Jupyter Notebook是個堪稱神器級別的工具,捨得如今開發的過程當中,還常常用它來驗證一些構思中的代碼,尤爲在學習一些新模塊的時候更是如此。學習
上課。
[in]:測試
# 註釋代碼
# 第2章 p37
# 單行註釋推薦使用註釋內容前面加"# "號的方式;
# 多行註釋請使用一組三重引號,如:
"""
你要對當前代碼進行註釋/說明的內容
"""ui
[in]:編碼
# 打開記事本類程序(推薦使用emeditor), 將下面的內容複製進去;
# 而後另存爲nester.py, 文件編碼請使用utf-8;
# 新建一個nester文件夾,將nester.py放進該文件夾;
"""
這是"nester.py"模塊,提供了一個名爲print_lol()的函數.
此函數的做用是打印列表.
"""
def print_lol(the_list):
"""
此函數取一個位置參數,名爲the_list,它能夠是任何形式的列表.
所指定的列表中的每一個數據項會(遞歸地)輸出到屏幕上,每一個數據項各佔一行.
"""
for i in the_list:
if isinstance(i, list):
print_lol(i) # 若是是列表, 那麼調用"本身"再次處理這個列表
else:
print(i)
[in]:
# 準備發佈
# 第2章 p40
# 將下面的代碼複製到emeditor中;
# 文件另存爲setup.py, 文件編碼請使用utf-8;
# 將該文件存放到nester文件夾下
# 單引號內的內容能夠隨意發揮, 注意觀察文件的格式,尤爲是=/,/()/[]和單引號的使用
# 注意下面的代碼不要在Jupyter中運行
from distutils.core import setup
setup(
name = 'nester',
version = '1.0.0',
py_modules = ['nester'],
author = 'hfpython',
author_email = 'xxx@xxx.com',
url = 'http://www.emagic.org.cn',
description = 'A simple printer of nested lists',
)
[in]:
# 構建發佈/導入模塊
# 第2章 p41
# 在nester文件夾下打開Dos命令提示符
# 不知道如何操做的童鞋, 能夠參考我寫的《Python起步》,或自行百度
# 在Dos命令提示符下輸入: python setup.py sdist
# 生成dist文件夾後, 繼續在Dos命令提示符下輸入: python setup.py install
# 若是你電腦中裝有everything的話,能夠快速搜索一下nester.py,
# 即可以發現c:\python34\site-packages有了這個文件,這表示模塊已經安裝成功了
# 用import命令來導入它:
import nester
[in]:
# 使用模塊/命名空間
# 第2章 p45
# 導入後,要在print_lol前加上"nester.",才能使用模塊中的這一函數
# 所謂命名空間就是用來告訴程序,你所使用的這個函數是從哪來的
cast = ['Palin', 'Cleese', 'Idle', 'Jones', 'Gilliam', 'Chapman']
nester.print_lol(cast) # 若是導入時用"from nester import print_lol",
# 前面就不用(也不能)加"nester."
[out]:
Palin
Cleese
Idle
Jones
Gilliam
Chapman
[in]:
# 內置函數
# 第2章 p54
# range: 生成從0直到(但不包含某個數)的數字列表.開發過程當中會常常用到.看實例來體會吧
# 你能夠本身腦洞一下range的用法, 好比,把4換成"len(cast)"
for num in range(4):
print(num)
[out]:
0
1
2
3
[in]:
# 改進nester模塊
# 第2章 p56
# 修改print_lol函數,記得按Alt+Enter運行
"""
這是"nester.py"模塊,提供了一個名爲print_lol()的函數.
此函數的做用是打印列表.
"""
def print_lol(the_list, level):
"""
此函數取一個位置參數,名爲the_list,它能夠是任何形式的列表.
所指定的列表中的每一個數據項會(遞歸地)輸出到屏幕上,每一個數據項各佔一行.
第2個參數用來在遇到嵌套列表時插入製表符.
"""
for i in the_list:
if isinstance(i, list):
print_lol(i) # 若是是列表, 那麼調用"本身"再次處理這個列表
else:
for tab_stop in range(level):
print("\t", end='')
print(i)
[in]:
# 用新的print_lol來打開movies列表
# 要傳入一個新的參數,咱們用0試試
movies = ["The Holy Grail", 1975, "Terry Jones & Terry Gilliam", 91,
["Graham Chapman", ["Michael Palin", "John Clseese",
"Terry Gilliam", "Eric Idle", "Terry Jones"]]]
print_lol(movies, 0)
[out]:
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
::
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-22-c989b21ce795> in <module>()
3 ["Graham Chapman", ["Michael Palin", "John Clseese",
4 "Terry Gilliam", "Eric Idle", "Terry Jones"]]]
----> 5 print_lol(movies, 0)
<ipython-input-21-e6f44022d658> in print_lol(the_list, level)
14 for i in the_list:
15 if isinstance(i, list):
---> 16 print_lol(i) # 若是是列表, 那麼調用"本身"再次處理這個列表
17 else:
18 for tab_stop in range(level):
TypeError: print_lol() missing 1 required positional argument: 'level'
[in]:
# 跟蹤代碼
# 第2章 p58
# 看到上面的出錯信息,沒關係張,一行行看反饋的信息
# 注意這句:"print_lol() missing 1 required positional argument: 'level'"
# 注意它標出的第16行,問題應該出在這一句.
# 在函數內部調用本身的時候, 少傳了一個level參數
# 繼續來修改
"""
這是"nester.py"模塊,提供了一個名爲print_lol()的函數.
此函數的做用是打印列表.
"""
def print_lol(the_list, level):
"""
此函數取一個位置參數,名爲the_list,它能夠是任何形式的列表.
所指定的列表中的每一個數據項會(遞歸地)輸出到屏幕上,每一個數據項各佔一行.
第2個參數用來在遇到嵌套列表時插入製表符.
"""
for i in the_list:
if isinstance(i, list):
print_lol(i, level) # 加上level參數
else:
for tab_stop in range(level):
print("\t", end='')
print(i)
[in]:
# 再來運行一次, 這回能打印了
print_lol(movies, 0)
[out]:
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham Chapman
Michael Palin
John Clseese
Terry Gilliam
Eric Idle
Terry Jones
[in]:
# 但問題來了, 看起來level傳進去沒啥卵用!
# 咱們加這個level參數是但願它每次處理嵌套列表時,打印時行前能多縮進一個製表符的位置
# 因此須要將level值加1
# 再來修改
"""
這是"nester.py"模塊,提供了一個名爲print_lol()的函數.
此函數的做用是打印列表.
"""
def print_lol(the_list, level):
"""
此函數取一個位置參數,名爲the_list,它能夠是任何形式的列表.
所指定的列表中的每一個數據項會(遞歸地)輸出到屏幕上,每一個數據項各佔一行.
第2個參數用來在遇到嵌套列表時插入製表符.
"""
for i in the_list:
if isinstance(i, list):
print_lol(i, level + 1) # 每次讓level值加1
else:
for tab_stop in range(level):
print("\t", end='')
print(i)
[in]:
# 再運行一次,看下效果
print_lol(movies, 0)
[out]:
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham Chapman
Michael Palin
John Clseese
Terry Gilliam
Eric Idle
Terry Jones
[in]:
# 更新模塊
# 第2章 p60
# pypi的部分,看看就能夠了.興趣極其強烈的能夠按照書上提示去玩一玩
# 用新版本的print_lol函數替換掉原來nesster.py中的內容;
# 而後修改setup.py, 將version(版本)這一行改成1.1.0
# 你也能夠從新構建並安裝該模塊(參看前面的內容), 但別忙着作,先看下面的內容
from distutils.core import setup
setup(
name = 'nester',
version = '1.1.0',
py_modules = ['nester'],
author = 'hfpython',
author_email = 'xxx@xxx.com',
url = 'http://www.emagic.org.cn',
description = 'A simple printer of nested lists',
)
[in]:
# 使用可選參數
# 第2章 p63
# 給第2個參數加一個缺省值, 這樣能夠兼容1.0.0版本的調用方式
# 咱們來繼續修改nester.py文件
# 給def print_lol後的level加了個缺省值0
"""
這是"nester.py"模塊,提供了一個名爲print_lol()的函數.
此函數的做用是打印列表.
"""
def print_lol(the_list, level=0):
"""
此函數取一個位置參數,名爲the_list,它能夠是任何形式的列表.
所指定的列表中的每一個數據項會(遞歸地)輸出到屏幕上,每一個數據項各佔一行.
第2個參數用來在遇到嵌套列表時插入製表符.
"""
for i in the_list:
if isinstance(i, list):
print_lol(i, level + 1) # 每次讓level值加1
else:
for tab_stop in range(level):
print("\t", end='')
print(i)
[in]:
# 如今再去構建/安裝這個新的nester模塊
# 而後導入,測試一下不一樣的調用方式
# 先點擊Jupyter中的"Kernel"菜單, 從中選擇"Restart"命令
# 這樣前面導入的和執行過的命令全清空了,咱們來導入nester
import nester
# 從新定義movies列表
movies = ["The Holy Grail", 1975, "Terry Jones & Terry Gilliam", 91,
["Graham Chapman", ["Michael Palin", "John Clseese",
"Terry Gilliam", "Eric Idle", "Terry Jones"]]]
# 分別以不一樣的方式調用print_lol函數
nester.print_lol(movies, 0)
print('------我是一條美麗的分割線------') # 加個分割線來區分這三個調用方式
nester.print_lol(movies) # 不加level參數
print('------我是一條美麗的分割線------')
nester.print_lol(movies, 2) # level指定爲2, 你也能夠本身指定一個負數試試!
[out]:
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham Chapman
Michael Palin
John Clseese
Terry Gilliam
Eric Idle
Terry Jones
------我是一條美麗的分割線------
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham Chapman
Michael Palin
John Clseese
Terry Gilliam
Eric Idle
Terry Jones
------我是一條美麗的分割線------
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham Chapman
Michael Palin
John Clseese
Terry Gilliam
Eric Idle
Terry Jones
[in]:
# 增長第三個參數
# 第2章 p68
# 用一個indent=True或False來控制是否啓用縮進(level參數則用來控制縮進多少)
"""
這是"nester.py"模塊,提供了一個名爲print_lol()的函數.
此函數的做用是打印列表.
"""
def print_lol(the_list, indent=False, level=0):
"""
此函數取一個位置參數,名爲the_list,它能夠是任何形式的列表.
所指定的列表中的每一個數據項會(遞歸地)輸出到屏幕上,每一個數據項各佔一行.
第2個參數用來控制是否輸出製表符.
第3個參數用來在遇到嵌套列表時插入幾個製表符.
"""
for i in the_list:
if isinstance(i, list):
print_lol(i, indent, level + 1) # 此處要加上indent參數
else:
if indent: # 若是傳入的indent參數爲True,則作如下的操做
for tab_stop in range(level):
print("\t", end='')
print(i)
# 將這段代碼運行一下(用Alt+Enter快捷鍵)
[in]:
# 如今咱們換一個新的列表來測試
names = ['John', 'Eric', ['Cleese', 'Idle'], 'Michael', ['Palin']]
print_lol(names) # 不帶第二、3個參數
[out]:
John
Eric
Cleese
Idle
Michael
Palin
[in]:
# 將第2個參數指定爲True
print_lol(names, True)
[out]:
John
Eric
Cleese
Idle
Michael
Palin
[in]:
# 傳入第3個參數,好比4:
print_lol(names, True, 4)
[out]:
John
Eric
Cleese
Idle
Michael
Palin
以上就是《HeadFirst Python》第二章的內容,捨得建議在練習的同時,把書中的細節好好閱讀一下。一些須要儲存到腦子裏的內容,你能夠把它們整理好,加到SuperMemo中,用SuperMemo那超絕的複習算法來幫助你快速掌握所學的內容。
本章筆記下載地址:
連接:http://pan.baidu.com/s/1eRAo3n0 密碼:ole9