《HeadFirst Python》第二章学习笔记
现在,请跟着舍得的脚步,打开《HeadFirst Python》第二章。
一章的内容其实没有多少,多练习几次就能掌握一个大概了!
《HeadFirst Python》的第二章设计得很有意思。它直接从制作一个模块入手,顺带讲了模块的导入,传统的书可不会这么搞。
不过书中关于编辑器的观点略显陈旧。
最好的编辑器是什么? 别用书中推荐的Python自带IDLE,在现阶段,请使用Jupyter Notebook来进行各项练习。
等学完这本书后,你可以选择PyCharm/Eric6/WingIDE进行Python的开发,舍得将会带你开启那个新的篇章。
Jupyter Notebook是个堪称神器级别的工具,舍得现在开发的过程中,还经常用它来验证一些构思中的代码,尤其在学习一些新模块的时候更是如此。
上课。
[in]:
# 注释代码
# 第2章 p37
# 单行注释推荐使用注释内容前面加"# "号的方式;
# 多行注释请使用一组三重引号,如:
"""
你要对当前代码进行注释/说明的内容
"""
[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) # 不带第2、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