如今,请跟着舍得的脚步,打开《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