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)