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,即不嵌套打印

'''这是一个模块,可以打印列表,其中可能包含嵌套列表'''
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)
    
View Code

运行模块:

>>> 
=========== 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
                    王宝强
                        黄渤
                        陶虹
                        范冰冰
>>> 
View Code

发布版本:

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='嵌套列表的打印举例',
    )
修改发布程序setup.py
 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>
发布新版本1.3.0

5、查看三次修改的版本发布情况:

posted @ 2016-03-12 23:10  垄上行  阅读(289)  评论(0编辑  收藏  举报