編輯點評:Python代碼生成器
您是否在學習Python的路程中感覺路程漫漫?是否曾經半途而廢?是否感覺該學的內容眾多?因為先前編過《信手拈來按鍵幫你來》所以這里秉承了它的理念。以Delphi語言開發的,內置百款實例代碼,從速借鑒、高效開發,歡迎下載
PYTHON自動生成代碼工具介紹
項目中有一個需求,對一個基類而言,擁有一個比較方法和拷貝方法,某些地方需要頻繁地對這兩個方法進行調用。對于所有子類而言,需要重寫這兩個方法,并在其中維護類內一些成員變量。
例如有一個變量m_iMyVal,在Copy方法中需要維護this.m_iMyVal = data.m_iMyVal;在IsEqual方法中需要維護if(this.m_iMyVal != data.m_iMyVal) return false;...等等。當子類中的變量一旦多了,
譬如一個類中擁有十余個甚至更多這樣的變量,并且日后有可能刪除或添加,維護起來就有點痛苦了,因為需要在兩處都補充對應的方法,而且每一個都不能寫漏寫錯。
這些子類一般都是數據類,在編寫代碼的時候往往是一口氣寫相當多的變量,如果寫一個然后到兩個地方編寫對應的代碼,這樣可能的確出錯率比較低,但是很容易打斷思路;
但是把所有變量寫完后再去補充代碼,就會有寫漏寫錯之嫌,一旦寫漏當時可能沒有bug,后期查錯起來非常痛苦,從而導致開發效率下降。另外麻煩的一點在于,不同類型的變量,
比較方法和拷貝方法可能不盡相同(如浮點數需要eps,list需要循環比較等等)。
那么有沒有寫一個變量然后告訴系統這個變量是需要在比較和拷貝方法中補充代碼的,然后有“人”幫我自動補充上去呢?由于筆者使用的是C#語言開發,
自然而然想到了添加標簽的方法,之后通過反射找到所有帶有這種標簽的成員變量,在比較和拷貝方法中直接進行操作即可。
但是擔心這種做法由于反射有性能較低之嫌,因此暫時不作考慮,轉而使用下面這種利用Python自動生成代碼的方法。
利用Python讀取文件,正則查詢帶有某些標簽或者注釋的變量,把這些變量收集起來,然后替換原文件的比較和拷貝方法即可。
那么工作流就變成了:
1.寫需要的成員變量
2.如果需要自動為其生成代碼,則添加對應的標簽(不采用注釋的方法是因為標簽可以被自動補全,防止正則找錯)。
3.執行批處理文件,自動把需要的文件生成代碼(如果之前有這部分代碼,則是替換)。
整個過程幾乎不耽誤什么時間,但是自動生成代碼使得開發效率大大提升。
軟件使用方法
1.積木式編程理念,快速拼出您想要的工具,彌補某些軟件自身的不足
2.帶給不懂編程人員也能享受快速插入代碼編程的快感
3.快速插入重復性很高的架構(譬如賦值、判斷、流程控制、算法等)
4.搜集網上的實例代碼,每周更新。使編程的實現更傻瓜化,同時界面
中安插大量實例鏈接和視頻演示
5.極大減少編程難度(點點、看看、改改)立可得設計
6.將編程中的GUI(界面)設計變得點上去,抄過來,改一改,瞬間完成
7.讓創建爬蟲程序變得傻瓜化,節約開發成本
8.頂部工具欄使用歌訣提示性菜單輔助編程
9.左側利用網絡資源提取營養
10.中間底部可搜索、翻譯。即使得到外部支援
11.右側使用Python高亮代碼,右下角調試運行
生成器函數
這個函數改用生成器(generator)來寫會更好。生成器是使用yield表達式的函數。調用生成器函數時,它并不會真的運行,而是會返回迭代器。每次在這個迭代器上面調用內置的next函數時,
迭代器會把生成器推進到下一個yield表達式那里。生成器傳給yield的每一個值,都會由迭代器返回給調用者。
1 2 3 4 5 6 | defindex_words_iter(text): iftext: yield0 forindex, letterinenumerate(text): ifletter==' ': yieldindex+1 |
1 | result=list(index_words_iter(address)) |
注意:生成器函數返回的迭代器是有狀態的,調用者不應該反復使用。
由于迭代器只能產生一輪結果。在拋出過StopIteration異常的迭代器或生成器上面繼續迭代第二輪,是不會有結果的。為解決此問題,我們可以明確地使用該迭代器制作一份列表,
將它的全部內容都遍歷一次,并賦值到這份列表里,然后就可以在復制出來的數據列表上面多次迭代了。
熱門評論
最新評論