Python提供了一组技术,可以很容易的实现共享,包括模块和一些开发工具:
模块允许你合理组织代码来实现最优共享。
发布工具允许你想全世界共享你的模块。
我们可以将上一节的函数
def print_lol(the_list):
for movie in the_list:
if isinstance(movie,list):
print_lol(movie)
else :
print(movie)
将这个写入text中,并将后缀名改为.py
Python包索引(Python Package Index, PyPI)为Internet上的第三方Python模块提供了一个集中的存储库。准备好之后,就可以使用PyPI来发布你的模块,从而使你的代码可供其他人使用。
在上传之前,这个代码还不完备,因为他少了必要的注释。
Python中,多行注释是
""" """
比如说:
""" def print_lol(the_list):
for movie in the_list:
if isinstance(movie,list):
print_lol(movie)
else :
print(movie) """
#为单行注释
#定义了movies变量
movies=["The Holy Grail",1975,"The Life of Brian",1979,["Graham Chapman",["Michael Paline","John Cleese","Terry Gilliam","Eric Idle","Terry Jones"]]]
"""
这个函数是用来循环遍历列表中的列表的。
"""
def print_lol(the_list):
for movie in the_list:
if isinstance(movie,list):
print_lol(movie)
else :
print(movie)
#调用上面的函数
print_lol(movies)
点击这个.py文件可以直接运行(一闪而逝,输出了之后就不停留了。)
准备发布
在Python中,所谓“发布”是指一个文件集合,这些文件联合在一起允许你构建、打包和发布你的模块。
1:首先为模块新建一个文件夹,并将.py文件放入到文件夹中
2:在新文件夹中创建一个名为setup.py的文件。
这个文件包含有关发布的元数据。编辑这个文件增加以下代码:
#从Python发布工具导入setup函数
from distutils.core import setup
setup(
name = 'test'
version = '1.0.0'
py_modules = ['test']
author = '紫极岚'
author_email= '[email protected]'
url = 'https://blog.csdn.net/qq_22570497'
description = '一个简单的遍历列表的函数'
)
构建发布
3:构建一个发布文件。
发布工具包含有构建一个发布所需的所有功能。在文件夹中打开一个终端窗口,
键入一行命令 python setup.py sdist
(如果你想运行此语句必须先配置python的环境变量,就是在环境变量的path后面加上 ;你的python安装路径 就可以了。)
4:将发布安装到你的Python本地副本中
python setup.py install
导入模块并使用
import test
使用python关键字 Import引入,test后面不需要加上后缀名.py
import语句告诉Python将test.py模块包含在程序中。之后我们就可以使用这个模块中的函数了
>>> import test
>>>
movies=["The Holy Grail",1975,"The Life of Brian",1979,
["Graham Chapman",
["Michael Paline","John Cleese","Terry Gilliam","Eric Idle","Terry Jones"]
]]
>>> print_lol(movies)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
print_lol(movies)
NameError: name 'print_lol' is not defined
好像结果并不是我们想的这样,这是怎么回事呢?
Python的模块实现命名空间
Python中所有代码都有一个命名空间关联。
主Python程序中(以及IDLE shell中)的代码与一个名为_main_的命名空间关联。将代码放在其单独的模块中时,Python会自动创建一个与模块同名的命名空间。所以,你的模块中的代码会与一个名为test的命名空间关联。
我们用test.print_lol(movies)调用即可
from test import print_lol 这样会把指定的函数增加到当前的命名空间来,这样的话调用就不用加前面的命名空间了。
这里需要特别注意如果你原来的代码中有print_lol函数那么引入的函数会覆盖你本来的函数。
最终版本的Python模块
#定义了movies变量
movies=["The Holy Grail",1975,"The Life of Brian",1979,["Graham Chapman",["Michael Paline","John Cleese","Terry Gilliam","Eric Idle","Terry Jones"]]]
"""
这个函数是用来循环遍历列表中的列表的。
如果def print_lol(the_list,level):直接这么写的话level参数是必须的
这样更新代码会导致API更新,不传level就不能用
写成level=0这个level参数就不是必填的了。
如果level为负数,则关闭缩进功能
"""
#这里注意False的F要大写
def print_lol(the_list,flag=False,level=0):
for movie in the_list:
if isinstance(movie,list):
print_lol(movie,flag,level+1)
else:
if flag:
for num in range(level):
#tab换行,tab的个数为level的个数
print("\t",end='')
print(movie)
else:
print(movie)
#调用上面的函数
print_lol(movies)