上一章結(jié)尾我們講到用函數(shù)來封裝代碼以便于復(fù)用。但是你有沒有發(fā)現(xiàn)我們寫的代碼在IDLE里靶溜,無法保存下來匾乓,如果我們進行真正開發(fā)工作,而且肯定會和其他人合作開發(fā) 鳄厌,都將代碼寫在IDLE里是不行的荞胡。所以我們現(xiàn)在需要解決兩個問題:
- 使用真正的IDE
- 將代碼放在多個文件中
Python的編輯器選擇
用什么IDE開發(fā)Python這個真不好說,看個人喜好了嚎、公司規(guī)范都行硝训。比如Windows下的同學(xué)可以使用NotePad++,Mac可以使用Sublime Text新思。我在這里建議大家可以試試Visual Studio Code窖梁,它是微軟推出的輕量級、跨平臺IDE夹囚,這款I(lǐng)DE有很好的Python支持纵刘,智能提示、語法檢測荸哟、調(diào)試等假哎。而且有很多實用的插件供大家使用。
這里附上下載地址:http://code.visualstudio.com/Download
安裝IDE中...
將Python代碼模塊化
已經(jīng)準(zhǔn)備好了開發(fā)工具鞍历,那么就繼續(xù)開始學(xué)習(xí)了舵抹。首先我們把上一篇的代碼再寫一遍,這次使用IDE來編寫劣砍,然后文件保存為list_loop.py
惧蛹。代碼如下:
def loop(list_item):
for item in list_item:
if isinstance(item, list):
loop(item)
else:
print(item)
然后在目錄下找到這個文件,使用右鍵-打開方式用IDLE打開這個list_loop.py
。這時候你應(yīng)該會看到剛才寫的函數(shù)代碼香嗓。按F5執(zhí)行迅腔,會出現(xiàn)一個新的命令界面,這時候我們創(chuàng)建一個列表靠娱,然后調(diào)用剛才的函數(shù)沧烈。
>>> books = [['機械工業(yè)出版社',['C++入門', 50.9],['Java編程思想', 60.5]],
['人民郵電出版社',['Android開發(fā)詳解', 76.5],['HTML5技術(shù)探索', 78.9]],
['中國電力出版社' ,['iOS設(shè)計模式', 88.3]]]
>>> loop(books)
機械工業(yè)出版社
C++入門
50.9
Java編程思想
60.5
人民郵電出版社
Android開發(fā)詳解
76.5
HTML5技術(shù)探索
78.9
中國電力出版社
iOS設(shè)計模式
88.3
>>>
在使用函數(shù)的時候,你可以試試用TAB像云,IDLE會有相應(yīng)的代碼提示锌雀。這樣我們就成功的引用外部函數(shù)了。
Pyhton代碼中引用其它模塊
但是我們的列表不是在py文件中創(chuàng)建的迅诬,我們再來改造一下代碼汤锨,將列表數(shù)據(jù)也單獨寫到一個文件中。在list_loop.py
同級目錄新建一個文件test_list_loop.py
百框,內(nèi)容如下:
import list_loop
books = [['機械工業(yè)出版社',['C++入門', 50.9],['Java編程思想', 60.5]],
['人民郵電出版社',['Android開發(fā)詳解', 76.5],['HTML5技術(shù)探索', 78.9]],
['中國電力出版社' ,['iOS設(shè)計模式', 88.3]]]
print(loop(books))
可以看到首行有一句話imoprt list_loop
它的含義是將list_loop.py
模塊引入我們當(dāng)前的代碼中。現(xiàn)在我們用IDLE打開test_list_loop.py
文件牍汹,還是按F5來執(zhí)行铐维。不出意外,你應(yīng)該得到一個錯誤提示:
Traceback (most recent call last):
File "/test_list_loop.py", line 7, in <module>
print(loop(books))
NameError: name 'loop' is not defined
>>>
提示說loop沒有定義慎菲,這是為什么呢嫁蛇?其實很好理解,我們在第一行告訴IDLE導(dǎo)入了list_loop模塊露该,而list_loop是一個命名空間睬棚,命名空間就像是一個地區(qū)名稱,比如你想找小明解幼,1班有個小明抑党,2班也有個小明,你需要給出完整的地址才可以幫你找到撵摆。也就是說你想用loop這個方法底靠,你需要告訴IDEloop具體是哪個命名空間里的函數(shù)才可以,于是我們可以這么改:
print(list_loop.loop(books))
將loop函數(shù)前面加上命名空間特铝,這樣就可以成功的運行了暑中。Python的所有代碼都與一個命名空間關(guān)聯(lián)。我們使用的BIF都是在一個名字為__main__
的命名空間中鲫剿,所以我們才可以便捷的使用這些函數(shù)鳄逾。
還有一種方式也可以解決這個問題:
from list_loop import loop
#省略代碼...
print(loop(books))
使用from list_loop import loop
來指定引用的函數(shù),這樣一來就不必再使用命名空間來調(diào)用函數(shù)了灵莲。不過這樣也會帶來一個問題雕凹,如果你當(dāng)前的命名空間中已經(jīng)定義了相同的函數(shù)名稱,它將會被import進來的函數(shù)所覆蓋,所以盡量使用完成的命名空間來處理這些函數(shù)一個不錯的習(xí)慣请琳。
總結(jié)
今天我們學(xué)習(xí)了:
- 使用更加強壯的開發(fā)工具來寫Python粱挡。
- 將Python代碼放在不同文件中。
- 使用
import <modules>
導(dǎo)入其它模塊俄精。
本章總的來說內(nèi)容還是很輕松的询筏,如果大家喜歡請點贊、收藏竖慧,我會繼續(xù)更新后面的章節(jié)嫌套。
上一章結(jié)尾我們講到用函數(shù)來封裝代碼以便于復(fù)用。但是你有沒有發(fā)現(xiàn)我們寫的代碼在IDLE里圾旨,無法保存下來踱讨,如果我們進行真正開發(fā)工作,而且肯定會和其他人合作開發(fā) 砍的,都將代碼寫在IDLE里是不行的痹筛。所以我們現(xiàn)在需要解決兩個問題:
- 使用真正的IDE
- 將代碼放在多個文件中
Python的編輯器選擇
用什么IDE開發(fā)Python這個真不好說,看個人喜好廓鞠、公司規(guī)范都行帚稠。比如Windows下的同學(xué)可以使用NotePad++,Mac可以使用Sublime Text床佳。我在這里建議大家可以試試Visual Studio Code滋早,它是微軟推出的輕量級、跨平臺IDE砌们,這款I(lǐng)DE有很好的Python支持杆麸,智能提示、語法檢測浪感、調(diào)試等昔头。而且有很多實用的插件供大家使用。
這里附上下載地址:http://code.visualstudio.com/Download
安裝IDE中...
將Python代碼模塊化
已經(jīng)準(zhǔn)備好了開發(fā)工具影兽,那么就繼續(xù)開始學(xué)習(xí)了减细。首先我們把上一篇的代碼再寫一遍,這次使用IDE來編寫赢笨,然后文件保存為list_loop.py
未蝌。代碼如下:
def loop(list_item):
for item in list_item:
if isinstance(item, list):
loop(item)
else:
print(item)
然后在目錄下找到這個文件,使用右鍵-打開方式用IDLE打開這個list_loop.py
茧妒。這時候你應(yīng)該會看到剛才寫的函數(shù)代碼萧吠。按F5執(zhí)行,會出現(xiàn)一個新的命令界面桐筏,這時候我們創(chuàng)建一個列表纸型,然后調(diào)用剛才的函數(shù)。
>>> books = [['機械工業(yè)出版社',['C++入門', 50.9],['Java編程思想', 60.5]],
['人民郵電出版社',['Android開發(fā)詳解', 76.5],['HTML5技術(shù)探索', 78.9]],
['中國電力出版社' ,['iOS設(shè)計模式', 88.3]]]
>>> loop(books)
機械工業(yè)出版社
C++入門
50.9
Java編程思想
60.5
人民郵電出版社
Android開發(fā)詳解
76.5
HTML5技術(shù)探索
78.9
中國電力出版社
iOS設(shè)計模式
88.3
>>>
在使用函數(shù)的時候,你可以試試用TAB狰腌,IDLE會有相應(yīng)的代碼提示除破。這樣我們就成功的引用外部函數(shù)了。
Pyhton代碼中引用其它模塊
但是我們的列表不是在py文件中創(chuàng)建的琼腔,我們再來改造一下代碼瑰枫,將列表數(shù)據(jù)也單獨寫到一個文件中。在list_loop.py
同級目錄新建一個文件test_list_loop.py
丹莲,內(nèi)容如下:
import list_loop
books = [['機械工業(yè)出版社',['C++入門', 50.9],['Java編程思想', 60.5]],
['人民郵電出版社',['Android開發(fā)詳解', 76.5],['HTML5技術(shù)探索', 78.9]],
['中國電力出版社' ,['iOS設(shè)計模式', 88.3]]]
print(loop(books))
可以看到首行有一句話imoprt list_loop
它的含義是將list_loop.py
模塊引入我們當(dāng)前的代碼中」獍樱現(xiàn)在我們用IDLE打開test_list_loop.py
文件,還是按F5來執(zhí)行甥材。不出意外盯另,你應(yīng)該得到一個錯誤提示:
Traceback (most recent call last):
File "/test_list_loop.py", line 7, in <module>
print(loop(books))
NameError: name 'loop' is not defined
>>>
提示說loop沒有定義,這是為什么呢洲赵?其實很好理解鸳惯,我們在第一行告訴IDLE導(dǎo)入了list_loop模塊,而list_loop是一個命名空間叠萍,命名空間就像是一個地區(qū)名稱芝发,比如你想找小明,1班有個小明俭令,2班也有個小明,你需要給出完整的地址才可以幫你找到部宿。也就是說你想用loop這個方法抄腔,你需要告訴IDEloop具體是哪個命名空間里的函數(shù)才可以,于是我們可以這么改:
print(list_loop.loop(books))
將loop函數(shù)前面加上命名空間理张,這樣就可以成功的運行了赫蛇。Python的所有代碼都與一個命名空間關(guān)聯(lián)。我們使用的BIF都是在一個名字為__main__
的命名空間中雾叭,所以我們才可以便捷的使用這些函數(shù)悟耘。
還有一種方式也可以解決這個問題:
from list_loop import loop
#省略代碼...
print(loop(books))
使用from list_loop import loop
來指定引用的函數(shù),這樣一來就不必再使用命名空間來調(diào)用函數(shù)了织狐。不過這樣也會帶來一個問題暂幼,如果你當(dāng)前的命名空間中已經(jīng)定義了相同的函數(shù)名稱,它將會被import進來的函數(shù)所覆蓋移迫,所以盡量使用完成的命名空間來處理這些函數(shù)一個不錯的習(xí)慣旺嬉。
合理升級你的模塊代碼
在真正的開發(fā)中,需求變更是常有的〕瘢現(xiàn)在我們就有一個新的需求邪媳,之前的數(shù)據(jù)輸出都是一行一個排版很不好看,現(xiàn)在想做一些UI的美化,這里我們簡單設(shè)計下雨效,在出版社內(nèi)的書籍價格多加一個\t
,這是最后效果:
機械工業(yè)出版社
C++入門
50.9
Java編程思想
60.5
人民郵電出版社
Android開發(fā)詳解
76.5
HTML5技術(shù)探索
78.9
中國電力出版社
iOS設(shè)計模式
88.3
接來下開始改造loop()
這個方法,增加一個索引標(biāo)記:
def loop(list_item,item_tab):
for item in list_item:
if isinstance(item, list):
loop(item,item_tab+1)
else:
for tab in range(item_tab):
print('\t',end='')
print(item)
這里用到了新的BIFrange()
迅涮,請自行help(range)
查閱文檔。每次到if的時候item_tab+1保證內(nèi)部的列表比外部多一個tab
,然后在else內(nèi)進行循環(huán)打印print('\t',end='')
,這是print其它參數(shù)重載形式徽龟,可以很方便的控制打印規(guī)則叮姑,有不清楚的可以使用help(print)
來查看文檔。
現(xiàn)在開始嘗試運行test_list_loop.py
這個文件顿肺,還是右鍵-IDLE打開戏溺,然后F5執(zhí)行,如果你按照我說的來做的話屠尊,就會發(fā)現(xiàn)又出現(xiàn)錯誤了:
Traceback (most recent call last):
File "/test_list_loop.py", line 7, in <module>
print(loop(books))
TypeError: loop() missing 1 required positional argument: 'item_tab'
>>>
TypeError提示說缺少一個參數(shù)旷祸,原來是剛才修改loop()
函數(shù)忘記改調(diào)用的地方了,那我們就再改下調(diào)用的文件:
print(loop(books, 0))
雖然解決了問題讼昆,但是我們也是費了不少勁托享,不但要改公用的模塊,還需改調(diào)用的代碼浸赫,顯然這種牽一發(fā)動全身的編碼方式我們是不能接受的闰围。為了避免這種事情再次發(fā)生,我們要想出一種兼容方式來處理既峡,就是不在改調(diào)用方的情況下羡榴,合理的升級我們的公用模塊代碼。
腦洞開啟中...
我們重新寫一個函數(shù)运敢,讓舊函數(shù)調(diào)用新函數(shù)校仑,這樣就可以對調(diào)用方隱藏:
def loop(list_item):
loop2(list_item,1)
這是一個好辦法,對調(diào)用方來說不用修改任何地方就能完成升級代碼了传惠。但是我們模塊方會因此而增加維護開銷迄沫,如果以后有新人加入,他會很困惑究竟用哪個函數(shù)卦方。顯然這種方式只能對一部分人帶來好處羊瘩。
在一番研究下,發(fā)現(xiàn)Python有個神奇的功能盼砍,剛好可以解決我們的問題尘吗,函數(shù)的入?yún)⒖梢蕴峁┠J值,而且調(diào)用方可以不用填寫有默認值的參數(shù):
def loop(list_item,item_tab=1):
調(diào)用方:
print(loop(books))
F5執(zhí)行可以順利的打印出來了浇坐,真是喜大普奔摇予。這樣就完美解決了不管是模塊維護還是業(yè)務(wù)調(diào)用,都可以用很低的成本來完成這個重大的改變吗跋。有時候多了解一些事情侧戴,就能有意想不到的收獲宁昭。
總結(jié)
今天我們學(xué)習(xí)了:
- 使用更加強壯的開發(fā)工具來寫Python。
- 將Python代碼放在不同文件中酗宋。
- 使用
import <modules>
導(dǎo)入其它模塊积仗。 - 新學(xué)了一個BIF:
rang()
,還學(xué)習(xí)了print的其它重載方式蜕猫。 - 使用巧妙的方式來解決公用模塊的修改而不影響其他調(diào)用者寂曹。
本章總的來說內(nèi)容還是很輕松的,如果大家喜歡請點贊回右、收藏隆圆,我會繼續(xù)更新后面的章節(jié)。
恭喜你達成<Python共享者>成就翔烁。