>>> import wukong
>>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]],
"The Life of Brain",1979,"Terry Jones",94,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]]
>>> wukong.print_lol(movies)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
The Life of Brain
1979
Terry Jones
94
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
>>>
如上,我们可以看到,所有的输出结果都没有进行缩进,而我们有的时候是需要对嵌套的列表进行缩进的,所以此时我们就遇到了一些问题,我们可以重新编写一个print方法,专门用来处理缩进问题,但这样毕竟增加了代码量,另一个方法就是我们在已有的代码上进行修改,这样我们就不需要做重复性的工作了。
但是我们如何来控制当前的print_lol方法来进行列表的嵌套缩进呢?一个方法就是使用额外的参数来控制print的行为,但是添加一个什么样的参数呢?在Python中给我们提供了一个内置函数:range()
使用range()迭代固定次数
>>> for num in range(4):
print(num)
0
1
2
3
>>>
好的,下面我们就修改print_lol方法,可以让其进行缩进,修改后如下:
"""这里是wukong模块,print_lol函数专门用来输出一个列表"""
"""增加一个level参数,表示在遇到嵌套输出时控制制表符的输出"""
def print_lol(movies,level):
for item_1 in movies:
if isinstance(item_1,list):
print_lol(item_1)
else:
for tab_stop in range(level):
print("\t",end='')
print(item_1)
>>> ================================ RESTART ================================
>>>
>>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]],
"The Life of Brain",1979,"Terry Jones",94,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]]
>>> print_lol(movies,0)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
print_lol(movies,0)
File "D:\python\wukong\wukong.py", line 6, in print_lol
print_lol(item_1)
TypeError: print_lol() missing 1 required positional argument: 'level'
>>>
这里运行一半就出现了一个TypeError错误,估计是我们的print_lol函数写错了,我们回头审视下我们的函数,发现在递归调用时没有改用新的print_lol函数,而是使用之前的:print_lol(item_1),这里进行修改为print_lol(item_1,level),但是此时我们再考虑一下,只是简单的传入level是否正确呢?每当嵌套深一层,我们的缩进就应该有所增加,所以这里改为print_lol(item_1,level+1),修改后的代码如下:
"""这里是wukong模块,print_lol函数专门用来输出一个列表"""
"""增加一个level参数,表示在遇到嵌套输出时控制制表符的输出"""
def print_lol(movies,level):
for item_1 in movies:
if isinstance(item_1,list):
print_lol(item_1,level+1)
else:
for tab_stop in range(level):
print("\t",end='')
print(item_1)
再次运行,结果如下:
>>> ================================ RESTART ================================
>>>
>>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]],
"The Life of Brain",1979,"Terry Jones",94,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]]
>>> print_lol(movies,0)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
The Life of Brain
1979
Terry Jones
94
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
>>>
我们可以看到,所有的嵌套都进行了缩进处理。现在我们可以更新PyPI上的代码了。
更新PyPI上的代码
好了,我们在本地修改完成代码以后,接着就要更新PyPI上的代码了,在更新之前,我们首先要修改setup.py,把其中的版本号改为1.1.0(以前是1.0.0),如下:
"""从python发布工具导入setup函数"""
from distutils.core import setup
"""设置setup函数的参数,其中py_modules为我们将要发布的模块,这里为wukong.py,所以值为wukong"""
setup(
name = 'wukong',
version = '1.1.0',
py_modules = ['wukong'],
author = 'wukongcode',
author_email = 'bjwangzhen@pku.edu.cn',
url = '',
description = 'A simple printer of nested lists',
)
完成之后我们再次执行python setup.py sdist upload进行更新PyPI上的代码:
使用可变参数
当我们更新完成PyPI上的代码以后,别人看到了,紧跟着也下载更新了自己本地的代码,但是此时造成了一个问题:之前使用print_lol打印列表的地方都不能用了,因为在新的模块中print_lol需要两个参数,而之前的版本中只需要一个参数。好了,我知道自己闯祸了,怎么办呢?我们可以使用可变参数来控制第二个参数,即用户可以不传入第二个参数,可以按照之前的版本一样只传入一个参数,听起来是不是很酷?
"""这里是wukong模块,print_lol函数专门用来输出一个列表"""
"""增加一个level参数,表示在遇到嵌套输出时控制制表符的输出"""
def print_lol(movies,level=0):
for item_1 in movies:
if isinstance(item_1,list):
print_lol(item_1,level+1)
else:
for tab_stop in range(level):
print("\t",end='')
print(item_1)
然后我们再试一下:
>>> ================================ RESTART ================================
>>>
>>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]],
"The Life of Brain",1979,"Terry Jones",94,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]]
>>> print_lol(movies,0)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
The Life of Brain
1979
Terry Jones
94
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
>>> print_lol(movies)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
The Life of Brain
1979
Terry Jones
94
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
>>>
可以看到使用print_lol(movies,0)和使用print_lol(movies)效果是一样的,这就解决了刚才的那个问题。
在此更新PyPI上的代码
好了,现在已经迫不及待的把现在这个功能分享个小伙伴了,那我们继续修改setup.py文件,把版本改为:1.2.0,如下:
"""从python发布工具导入setup函数"""
from distutils.core import setup
"""设置setup函数的参数,其中py_modules为我们将要发布的模块,这里为wukong.py,所以值为wukong"""
setup(
name = 'wukong',
version = '1.2.0',
py_modules = ['wukong'],
author = 'wukongcode',
author_email = 'bjwangzhen@pku.edu.cn',
url = '',
description = 'A simple printer of nested lists',
)
然后进行上传:
控制是否缩进
"""这里是wukong模块,print_lol函数专门用来输出一个列表"""
"""增加一个level参数,表示在遇到嵌套输出时控制制表符的输出"""
def print_lol(movies,indent=False,level=0):
for item_1 in movies:
if isinstance(item_1,list):
print_lol(item_1,indent,level+1)
else:
if indent:
for tab_stop in range(level):
print("\t",end='')
print(item_1)
现在先进行下测试,如下:
>>> ================================ RESTART ================================
>>>
>>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]],
"The Life of Brain",1979,"Terry Jones",94,
["Graham chapman",["Michael Palin","John cleese","Terry Gilliam","Eric Idle & Terry Jones"]]]
>>> print_lol(movies)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
The Life of Brain
1979
Terry Jones
94
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
>>> print_lol(movies,True)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
The Life of Brain
1979
Terry Jones
94
Graham chapman
Michael Palin
John cleese
Terry Gilliam
Eric Idle & Terry Jones
>>>
完美的实现了我们想要的,好了再次上传到PyPI上吧。
最后一次上传代码到PyPI
"""从python发布工具导入setup函数"""
from distutils.core import setup
"""设置setup函数的参数,其中py_modules为我们将要发布的模块,这里为wukong.py,所以值为wukong"""
setup(
name = 'wukong',
version = '1.3.0',
py_modules = ['wukong'],
author = 'wukongcode',
author_email = 'bjwangzhen@pku.edu.cn',
url = '',
description = 'A simple printer of nested lists',
)
然后进行上传:
这样,我们就完美的编写了一个模块并上传到了PyPI上了。