ch2-4:遇到嵌套列表进行缩进打印
1、增加一个参数来控制缩进打印:level
'''这是一个模块,可以打印列表,其中可能包含嵌套列表''' def print_list(the_list,level): """这个函数取一个位置参数the_list,他可以是任何列表,该列表中的每个数据都会递归地打印到屏幕上,各数据项各占一行; level参数用来在遇到嵌套列表时插入制表符,实现缩进打印。""" for each_item in the_list: if isinstance (each_item,list): print_list(each_item,level) else: for tab_stop in range(level): print ('\t',end='') print(each_item)
rang():返回一个迭代器,根据需要生生成一个指定范围的数字;
使用print()BIF在屏幕上打印制表符(TAB),而不是简单的换行(这是print()的默认行为),需要使用python 代码:print ('\t',end='')。
按F5运行模块,将函数导入到IDLE的命名空间,
>>> =========== RESTART: D:\workspace\eclipse\nester_xcc\nester_xcc.py =========== >>> movie=['泰囧',2014,'徐峥',91,['王宝强',['黄渤','陶虹','范冰冰']]] >>> print_list(movie,0) >>>
因Level设置为0,从没进行改变,所以level参数对显示的输出不产生任何影响。
2、每次处理一个嵌套列表时都需要将level的值增加1.
'''这是一个模块,可以打印列表,其中可能包含嵌套列表''' def print_list(the_list,level): """这个函数取一个位置参数the_list,他可以是任何列表,该列表中的每个数据都会递归地打印到屏幕上,各数据项各占一行; level参数用来在遇到嵌套列表时插入制表符,实现缩进打印。""" for each_item in the_list: if isinstance (each_item,list): print_list(each_item,level+1) #在每次递归调用函数时将level值增加1 else: for tab_stop in range(level): print ('\t',end='') print(each_item)
运行该模块:
>>> =========== RESTART: D:\workspace\eclipse\nester_xcc\nester_xcc.py =========== >>> movie=['泰囧',2014,'徐峥',91,['王宝强',['黄渤','陶虹','范冰冰']]] >>> print_list(movie,0) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie,1) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie,-9) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie) Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> print_list(movie) TypeError: print_list() missing 1 required positional argument: 'level' >>>
用新代码更新PyPI:
编辑发布的setup.py程序:修改版本号为1.1.0
from distutils. core import setup setup( name ='nester_xcc', version='1.1.0', py_modules=['nester_xcc'], author='xcc', author_email='984827641@qq.com', url='http://www.cnblogs.com/apple2016/', description='嵌套列表的打印举例', )
D:\workspace\eclipse\nester_xcc>python setup.py sdist upload
running sdist
running check
warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
warning: sdist: standard file not found: should have one of README, README.txt
writing manifest file 'MANIFEST'
creating nester_xcc-1.1.0
making hard links in nester_xcc-1.1.0...
hard linking nester_xcc.py -> nester_xcc-1.1.0
hard linking setup.py -> nester_xcc-1.1.0
creating 'dist\nester_xcc-1.1.0.zip' and adding 'nester_xcc-1.1.0' to it
adding 'nester_xcc-1.1.0\nester_xcc.py'
adding 'nester_xcc-1.1.0\PKG-INFO'
adding 'nester_xcc-1.1.0\setup.py'
removing 'nester_xcc-1.1.0' (and everything under it)
running upload
Submitting dist\nester_xcc-1.1.0.zip to https://pypi.python.org/pypi
Server response (200): OK
D:\workspace\eclipse\nester_xcc>
发布成功。
以上新版本实现了嵌套打印缩进的特性,但是并不是所有用户都喜欢。由于模块中print_list()增加了第二个参数,意为着模块中有个不同的API,使用原来API的用户会遇到问题。
理想的解决方案是同时提供这两个API,一个提供新特性,另一个不提供,如何实现呢?就是通过使用可选参数来实现,使得第二个参数成为可选参数。
通过为一个函数的必须参数提供一个缺省值,实现必填参数变成可选参数;
3、将level设置一个缺省值,变成可选参数:
'''这是一个模块,可以打印列表,其中可能包含嵌套列表''' def print_list(the_list,level=0): """这个函数取一个位置参数the_list,他可以是任何列表,该列表中的每个数据都会递归地打印到屏幕上,各数据项各占一行; level参数用来在遇到嵌套列表时插入制表符,实现缩进打印。""" for each_item in the_list: if isinstance (each_item,list): print_list(each_item,level+1) #在每次递归调用函数时将level值增加1 else: for tab_stop in range(level): print ('\t',end='') print(each_item)
现在可以采用不同的方式调用这个函数,运行该模块:
>>> =========== RESTART: D:\workspace\eclipse\nester_xcc\nester_xcc.py =========== >>> movie=['泰囧',2014,'徐峥',91,['王宝强',['黄渤','陶虹','范冰冰']]] >>> print_list(movie,0) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie,2) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie,-9) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>>
将支持两个API的模块发布到PyPI:
from distutils. core import setup setup( name ='nester_xcc', version='1.2.0', py_modules=['nester_xcc'], author='xcc', author_email='984827641@qq.com', url='http://www.cnblogs.com/apple2016/', description='嵌套列表的打印举例', )
D:\workspace\eclipse\nester_xcc>python setup.py sdist upload running sdist running check warning: sdist: manifest template 'MANIFEST.in' does not exist (using default fi le list) warning: sdist: standard file not found: should have one of README, README.txt writing manifest file 'MANIFEST' creating nester_xcc-1.2.0 making hard links in nester_xcc-1.2.0... hard linking nester_xcc.py -> nester_xcc-1.2.0 hard linking setup.py -> nester_xcc-1.2.0 creating 'dist\nester_xcc-1.2.0.zip' and adding 'nester_xcc-1.2.0' to it adding 'nester_xcc-1.2.0\nester_xcc.py' adding 'nester_xcc-1.2.0\PKG-INFO' adding 'nester_xcc-1.2.0\setup.py' removing 'nester_xcc-1.2.0' (and everything under it) running upload Submitting dist\nester_xcc-1.2.0.zip to https://pypi.python.org/pypi Server response (200): OK D:\workspace\eclipse\nester_xcc>
发布成功。
尽管这个API允许用户安装原来的方式调用函数,但是默认情况下会打开嵌套打印,但是有些人不希望如此。如何实现该嵌套打印行为是可选的呢?
解决方案之一是增加第三个参数indent,需要缩进时就设置为True,不需要缩进就设置为False,默认这个参数为False;
4、增加第三个参数indent来控制实现缩进的代码,默认为false,即不嵌套打印
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
'''这是一个模块,可以打印列表,其中可能包含嵌套列表''' def print_list(the_list,indent=False,level=0): """这个函数取一个位置参数the_list,他可以是任何列表,该列表中的每个数据都会递归地打印到屏幕上,各数据项各占一行; level参数用来在遇到嵌套列表时插入制表符,实现缩进打印。 indent参数用来控制实现缩进的代码,默认为false,即不嵌套打印""" for each_item in the_list: if isinstance (each_item,list): print_list(each_item,indent,level+1) #在每次递归调用函数时将level值增加1 else: if indent: #如果为真,则打印制表符;否则,不打印制表符 for tab_stop in range(level): print ('\t',end='') print(each_item)
运行模块:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> =========== RESTART: D:\workspace\eclipse\nester_xcc\nester_xcc.py =========== >>> movie=['泰囧',2014,'徐峥',91,['王宝强',['黄渤','陶虹','范冰冰']]] >>> print_list(movie) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie,True) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>> print_list(movie,True,4) 泰囧 2014 徐峥 91 王宝强 黄渤 陶虹 范冰冰 >>>
发布版本:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from distutils. core import setup setup( name ='nester_xcc', version='1.3.0', py_modules=['nester_xcc'], author='xcc', author_email='984827641@qq.com', url='http://www.cnblogs.com/apple2016/', description='嵌套列表的打印举例', )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 D:\workspace\eclipse\nester_xcc>python setup.py sdist upload 2 running sdist 3 running check 4 warning: sdist: manifest template 'MANIFEST.in' does not exist (using default fi 5 le list) 6 7 warning: sdist: standard file not found: should have one of README, README.txt 8 9 writing manifest file 'MANIFEST' 10 creating nester_xcc-1.3.0 11 making hard links in nester_xcc-1.3.0... 12 hard linking nester_xcc.py -> nester_xcc-1.3.0 13 hard linking setup.py -> nester_xcc-1.3.0 14 creating 'dist\nester_xcc-1.3.0.zip' and adding 'nester_xcc-1.3.0' to it 15 adding 'nester_xcc-1.3.0\nester_xcc.py' 16 adding 'nester_xcc-1.3.0\PKG-INFO' 17 adding 'nester_xcc-1.3.0\setup.py' 18 removing 'nester_xcc-1.3.0' (and everything under it) 19 running upload 20 Submitting dist\nester_xcc-1.3.0.zip to https://pypi.python.org/pypi 21 Server response (200): OK 22 23 D:\workspace\eclipse\nester_xcc>
5、查看三次修改的版本发布情况: