>>> 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上的代码:


键能修改python_键能修改python



使用可变参数



当我们更新完成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',
    )

然后进行上传:




键能修改python_键能修改python_02




控制是否缩进


"""这里是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',
    )

然后进行上传:



键能修改python_缩进_03




这样,我们就完美的编写了一个模块并上传到了PyPI上了。