真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python類(lèi)函數(shù)重構(gòu) python 子類(lèi)重寫(xiě)

python程序怎么重構(gòu)

其實(shí)不只是python,各種語(yǔ)言都是這樣。唯一的辦法就是多寫(xiě),然后不停的回頭去看自己寫(xiě)的代碼,不停的去重構(gòu)。同時(shí)也要多讀,現(xiàn)在網(wǎng)上太多開(kāi)源的代碼,去觀摩,一點(diǎn)一點(diǎn)的積累。

在曹縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷(xiāo)推廣,外貿(mào)網(wǎng)站制作,曹縣網(wǎng)站建設(shè)費(fèi)用合理。

python主函數(shù)怎么寫(xiě)

一般來(lái)說(shuō),Python程序員可能是這樣寫(xiě)main()函數(shù)的:

"""Module docstring.

This serves as a long usage message.

"""import sysimport getoptdef main():

# parse command line options

try:

opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) except getopt.error, msg: print msg print "for help use --help"

sys.exit(2) # process options

for o, a in opts: if o in ("-h", "--help"): print __doc__

sys.exit(0) # process arguments

for arg in args:

process(arg) # process() is defined elsewhereif __name__ == "__main__":

main()1234567891011121314151617181920212223242526

Guido也承認(rèn)之前自己寫(xiě)的main()函數(shù)也是類(lèi)似的結(jié)構(gòu),但是這樣寫(xiě)的靈活性還不夠高,尤其是需要解析復(fù)雜的命令行選項(xiàng)時(shí)。為此,他向大家提出了幾點(diǎn)建議。

添加可選的 argv 參數(shù)

首先,修改main()函數(shù),使其接受一個(gè)可選參數(shù) argv,支持在交互式shell中調(diào)用該函數(shù):

def main(argv=None):

if argv is None:

argv = sys.argv # etc., replacing sys.argv with argv in the getopt() call.1234

這樣做,我們就可以動(dòng)態(tài)地提供 argv 的值,這比下面這樣寫(xiě)更加的靈活:

def main(argv=sys.argv):

# etc.12

這是因?yàn)樵谡{(diào)用函數(shù)時(shí),sys.argv 的值可能會(huì)發(fā)生變化;可選參數(shù)的默認(rèn)值都是在定義main()函數(shù)時(shí),就已經(jīng)計(jì)算好的。

但是現(xiàn)在sys.exit()函數(shù)調(diào)用會(huì)產(chǎn)生問(wèn)題:當(dāng)main()函數(shù)調(diào)用sys.exit()時(shí),交互式解釋器就會(huì)推出!解決辦法是讓main()函數(shù)的返回值指示退出狀態(tài)(exit status)。因此,最后面的那行代碼就變成了這樣:

if __name__ == "__main__":

sys.exit(main())12

并且,main()函數(shù)中的sys.exit(n)調(diào)用全部變成return n。

定義一個(gè)Usage()異常

另一個(gè)改進(jìn)之處,就是定義一個(gè)Usage()異常,可以在main()函數(shù)最后的except子句捕捉該異常:

import sysimport getoptclass Usage(Exception):

def __init__(self, msg):

self.msg = msgdef main(argv=None):

if argv is None:

argv = sys.argv try: try:

opts, args = getopt.getopt(argv[1:], "h", ["help"]) except getopt.error, msg: raise Usage(msg) # more code, unchanged

except Usage, err: print sys.stderr, err.msg print sys.stderr, "for help use --help"

return 2if __name__ == "__main__":

sys.exit(main())123456789101112131415161718192021222324

這樣main()函數(shù)就只有一個(gè)退出點(diǎn)(exit)了,這比之前兩個(gè)退出點(diǎn)的做法要好。而且,參數(shù)解析重構(gòu)起來(lái)也更容易:在輔助函數(shù)中引發(fā)Usage的問(wèn)題不大,但是使用return 2卻要求仔細(xì)處理返回值傳遞的問(wèn)題。

8 Metaheuristics

下圖介紹了兩種不同種類(lèi)的Metaheuristics,我們主要用左邊的,尤其是Iterated Greedy。

I 和D 的過(guò)程用圖像表示如下:

我在這里只用Iterated Greedy算法。原因如下:

其他算法諸如蟻群算法等,可能能提供非常接近最優(yōu)解的方案,有些算法的運(yùn)行速度也很快,可以彌補(bǔ)python運(yùn)行慢的缺陷。但是這些算法通常存在諸多不足,例如算法太復(fù)雜,適用面很窄,需要設(shè)置過(guò)多參數(shù)導(dǎo)致很難實(shí)現(xiàn)。

Iterated Greedy的優(yōu)勢(shì)在于,它由兩個(gè)簡(jiǎn)單的階段構(gòu)成:

D和I

更好的解決方案總會(huì)被接受

更壞的方案以特定的可能性接受,接受的概率如下圖

類(lèi)似 模擬退火法 :

從當(dāng)前解決方案中隨機(jī)刪除 numberJobsToRemove 個(gè)訂單。這里 numberJobsToRemove 是Iterated Greedy的一個(gè)參數(shù)。

輸出的結(jié)果是被移除的訂單集合 removedJobs 和一個(gè)不完整的解決方案 partialPermutation 。

* 注意:solver.RNG.choice的結(jié)果每次都一樣,是因?yàn)槲覀冊(cè)O(shè)置了隨機(jī)數(shù)種子,目的就是只要是用同一個(gè)種子作為參數(shù)構(gòu)造出的solver的屬性RNG都是同一個(gè)。

將 removedJobs 重新加回 partialPermutation ,并插入到最佳位置(NEH)的順序,并返回新的完整解決方案。這個(gè)插入過(guò)程是通過(guò)排列Permutation實(shí)現(xiàn)的,看一下Construction函數(shù)的參數(shù)表可知,需要兩個(gè)列表。

* 注:前面講算法的時(shí)候說(shuō)過(guò),重構(gòu)函數(shù)執(zhí)行之后會(huì)生成一個(gè)新的方案newSolution,新方案就是通過(guò)把removedJobs插入到最佳位置得到的。最優(yōu)位置的選擇需要在Construction函數(shù)中借助 solver.EvaluationLogic.DetermineBestInsertion(completeSolution, i)來(lái)實(shí)現(xiàn)

我們通過(guò)簡(jiǎn)單的解構(gòu)和重構(gòu),必然會(huì)得出一個(gè)新方案newSolution,那么我們接受新方案newSolution為當(dāng)前方案currentSolution的前提是,如果

- 新的解決方案( newSolution ),

- 當(dāng)前解決方案( currentSolution )。

* 公式中,T叫做baseTemperature,是Iterated Greedy的第二個(gè)參數(shù),T越大,則接受更壞方案的概率也越大。新的最優(yōu)方案存儲(chǔ)在SolutionPool中(numberJobsToRemove是第一個(gè)參數(shù))

下面開(kāi)始對(duì)newSolution進(jìn)行評(píng)估和比較:

* 注意:判斷一個(gè)新方案是否可接受取決于兩方面:1. 如果新方案更好,那么無(wú)論如何都會(huì)接受新方案;2. 如果新方案并沒(méi)有優(yōu)化,則視作WorseSolution,即使是worseSolution也是要按照公式計(jì)算出的概率來(lái)衡量是否要接受這個(gè)不好的方案

為了看起來(lái)更加直觀,我把接受差方案的過(guò)程寫(xiě)成了函數(shù)AcceptWorseSolution。注意看參數(shù)表,以便于確定何時(shí)調(diào)用這個(gè)函數(shù)。

局部搜索可以被用于優(yōu)化currentSOlution,但不是必須的。通常會(huì)使用IterativeImprovement結(jié)合Insertion鄰域一起使用。

Iterated Greedy是一個(gè)迭代的解構(gòu)D和構(gòu)建C組成的序列。

在一個(gè)循環(huán)中被反復(fù)執(zhí)行,直到達(dá)到 停止標(biāo)準(zhǔn) 。

在這里的例子中, 停止標(biāo)準(zhǔn) 是迭代次數(shù) maxIterations ,但時(shí)間限制或沒(méi)有優(yōu)化的迭代次數(shù)也是可以的。

后面可能還會(huì)講到怎么設(shè)計(jì)一個(gè)沒(méi)有優(yōu)化的迭代次數(shù),這里可以先思考一下。

現(xiàn)在嘗試運(yùn)行一下:

與 IterativeImprovement 算法類(lèi)似,現(xiàn)在要為 IteratedGreedy 創(chuàng)建一個(gè)單獨(dú)的類(lèi),以便該類(lèi)的一個(gè)實(shí)例可以傳遞給求解器Solver。

像 IterativeImprovement 一樣, Iterated Greedy 應(yīng)該繼承自 ImprovementAlgorithm 。

必要的 參數(shù) 是以下屬性:

EvaluationLogic, SolutionPool以及隨機(jī)數(shù)生成器RNG都由求解器solver傳遞給算法。

添加 IteratedGreedy 類(lèi),以便它可以作為一種算法傳遞給求解器。

成員函數(shù):Konstruktor, Initialize, Destruction, Construction, AcceptWorseSolution, Run

python重命名無(wú)法執(zhí)行重構(gòu)是為什么

語(yǔ)法錯(cuò)誤。

這可能是由于Python腳本本身不在C:/test/temp中造成的。Python將在運(yùn)行它的目錄中查找文件名,這意味著它將嘗試重命名不存在的文件。您必須在文件名中添加目標(biāo)前綴。

重命名是指給文件或文件夾等重新起一個(gè)名稱(chēng)。


文章名稱(chēng):python類(lèi)函數(shù)重構(gòu) python 子類(lèi)重寫(xiě)
標(biāo)題URL:http://weahome.cn/article/hjhjhc.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部