摘要:關(guān)于函數(shù)的事情,總是說不完的,下面就羅列一些編寫函數(shù)的注意事項(xiàng)。函數(shù)具有獨(dú)立性。也就是常說的不要有太強(qiáng)的耦合性。要讓函數(shù)能夠獨(dú)立于外部的東西。函數(shù)實(shí)現(xiàn)的功能和目標(biāo)要單一化。這跟前面的道理是一樣的,目的是降低耦合性。
關(guān)于函數(shù)的事情,總是說不完的,下面就羅列一些編寫函數(shù)的注意事項(xiàng)。特別聲明,這些事項(xiàng)不是我總結(jié)的,我是從一本名字為《Learning Python》的書里面抄過來的,順便寫成了漢語,當(dāng)然,是按照自己的視角翻譯的,里面也夾雜了一些自己的觀點(diǎn)。看官也可以理解為源于《Learning Python》但又有點(diǎn)兒不同。
函數(shù)具有獨(dú)立性。也就是常說的不要有太強(qiáng)的耦合性。要讓函數(shù)能夠獨(dú)立于外部的東西。參數(shù)和return語句就是實(shí)現(xiàn)這種獨(dú)立性的最好方法。
盡量不要使用全局變量,這也是讓函數(shù)具有低耦合度的方法。全局變量雖然進(jìn)行了函數(shù)內(nèi)外通信,但是它強(qiáng)化了函數(shù)對外部的依賴,常常讓函數(shù)的修改和程序調(diào)試比較麻煩。
如果參數(shù)的對象是可變類型的數(shù)據(jù),在函數(shù)中,不要做對它的修改操作。當(dāng)然,更多時(shí)候,參數(shù)傳入的最好是不可變的。
函數(shù)實(shí)現(xiàn)的功能和目標(biāo)要單一化。每個(gè)函數(shù)的開頭,都要有簡短的一句話來說明本函數(shù)的功能和目標(biāo)。
函數(shù)不要太大,能小則小,根據(jù)前一條的原則,功能目標(biāo)單一,則代碼條數(shù)就小了。如果感覺有點(diǎn)大,看看能不能拆解開,分別為幾個(gè)函數(shù)。
不要修改另外一個(gè)模塊文件中的變量。這跟前面的道理是一樣的,目的是降低耦合性。
小試一下遞歸對于在python中使用遞歸,我一項(xiàng)持謹(jǐn)慎態(tài)度,能不用就不用,為什么呢?一方面深恐自己學(xué)藝不精,另外,遞歸不僅消耗資源,而且很多時(shí)候速度也不如for循環(huán)快。
不過,做為程序員,遞歸還是需要了解的。這里就列舉一個(gè)簡單的例子。
>>> def newsum(lst): ... if not lst: ... return 0 ... else: ... return lst[0] + newsum(lst[1:]) ... >>> newsum([1,2,3]) 6
這是一個(gè)對list進(jìn)行求和的函數(shù)(看官可能想到了,不是在python中有一個(gè)sum內(nèi)置函數(shù)來求和么?為什么要自己寫呢?是的,在實(shí)際的編程中,沒有必要自己寫,用sum就可以了。這里用這個(gè)例子,純粹是為了說明遞歸,沒有編程實(shí)踐的意義),當(dāng)然,我沒有判斷傳給函數(shù)的參數(shù)是否為完全由數(shù)字組成的list,所以,如果輸入的list中字母,就會(huì)編程這樣了:
>>> newsum([1,2,3,"q"]) Traceback (most recent call last): File "", line 1, in File " ", line 5, in newsum File " ", line 5, in newsum File " ", line 5, in newsum File " ", line 5, in newsum TypeError: cannot concatenate "str" and "int" objects
這就是本函數(shù)的缺憾了。但是,為了說明遞歸,我們就顧不了這么多了。暫且忽略這個(gè)缺憾。看官注意上面的函數(shù)中,有一句:return lst(0)+newsum(lst[1:]),在這句話中,又調(diào)用了一邊函數(shù)本身。對了,這就遞歸,在函數(shù)中調(diào)用本函數(shù)自己。當(dāng)然,區(qū)別在于傳入的參數(shù)有變化了。為了清除函數(shù)的調(diào)用流程,我們可以將每次傳入的參數(shù)打印出來:
>>> def newsum(lst): ... print lst ... if not lst: ... return 0 ... else: ... return lst[0] + newsum(lst[1:]) ... >>> newsum([1,2,3]) [1, 2, 3] [2, 3] [3] [] 6
這就是遞歸了。
其實(shí),看官或許已經(jīng)想到了,即使不用sum,也可以用for來事項(xiàng)上述操作。
>>> lst = [1,2,3] >>> sum_result = 0 >>> for x in lst: sum_result += x ... >>> sum_result 6銘記:函數(shù)是對象
還記得,在第一部分學(xué)習(xí)的時(shí)候,不斷強(qiáng)調(diào)的:變量無類型,數(shù)據(jù)有類型,那時(shí)候遇到的數(shù)據(jù)包括字符串、數(shù)值、列表、元組、字典、文件,這些東西,都被視為對象。函數(shù)跟它們類似,也是對象。因此就可以像以前的對象一樣進(jìn)行賦值、傳遞給其它函數(shù)、嵌入到數(shù)據(jù)結(jié)構(gòu)、從一個(gè)函數(shù)返回給另一個(gè)函數(shù)等等面向?qū)ο蟮牟僮鳌.?dāng)然,函數(shù)這個(gè)對象也有特殊性,就是它可以由一個(gè)函數(shù)表達(dá)式后面的括號(hào)中的列表參數(shù)調(diào)用。
>>> def newsum(lst): #依然以這個(gè)遞歸的函數(shù)為例 ... print lst ... if not lst: ... return 0 ... else: ... return lst[0] + newsum(lst[1:]) ... >>> lst = [1,2,3] >>> newsum(lst) #這是前面已經(jīng)常用的方法 [1, 2, 3] [2, 3] [3] [] 6 >>> recusion_fun = newsum #通過賦值語句,讓變量recusion_fun也引用了函數(shù)newsum(lst)對象 >>> recusion_fun(lst) #從而變量能夠?qū)崿F(xiàn)等同函數(shù)調(diào)用的操作 [1, 2, 3] [2, 3] [3] [] 6
再看一個(gè)例子,在這個(gè)例子中,一定要謹(jǐn)記函數(shù)是對象。看官曾記否?在list中,可以容納任何對象,那么,是否能夠容納一個(gè)函數(shù)中呢?
>>> fun_list = [(newsum,[1,2,3]),(newsum,[1,2,3,4,5])] >>> for fun,arg in fun_list: ... fun(arg) ... [1, 2, 3] [2, 3] [3] [] 6 [1, 2, 3, 4, 5] [2, 3, 4, 5] [3, 4, 5] [4, 5] [5] [] 15
函數(shù),真的就是對象啊。
既然是對象,就可以用dir(object)方式查看有關(guān)信息嘍:
>>> dir(newsum) ["__call__", "__class__", "__closure__", "__code__", "__defaults__", "__delattr__", "__dict__", "__doc__", "__format__", "__get__", "__getattribute__", "__globals__", "__hash__", "__init__", "__module__", "__name__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "func_closure", "func_code", "func_defaults", "func_dict", "func_doc", "func_globals", "func_name"] >>> dir(newsum.__code__) ["__class__", "__cmp__", "__delattr__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__gt__", "__hash__", "__init__", "__le__", "__lt__", "__ne__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "co_argcount", "co_cellvars", "co_code", "co_consts", "co_filename", "co_firstlineno", "co_flags", "co_freevars", "co_lnotab", "co_name", "co_names", "co_nlocals", "co_stacksize", "co_varnames"] >>> newsum.__code__.__doc__ "code(argcount, nlocals, stacksize, flags, codestring, constants, names, varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]]) Create a code object. Not for the faint of heart." >>> newsum.__code__.co_varnames ("lst",) >>> newsum.__code__.co_argcount 1
所以,各位看官,在使用函數(shù)的時(shí)候,首先要把它放在對象的層面考量,它不是什么特殊的東西,盡管我們使用了不少篇幅講述它,但它終歸還是一個(gè)對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45298.html
摘要:補(bǔ)充一個(gè)資料,供有興趣的朋友閱讀浮點(diǎn)數(shù)算法爭議和限制說明以上除法規(guī)則,是針對,在中,將和等同起來了。比如下面的例子不啰嗦了,實(shí)驗(yàn)一個(gè)注意了,引用了一個(gè)模塊之后,再做除法,就不管什么情況,都是得到浮點(diǎn)數(shù)的結(jié)果了。 除法啰嗦的,不僅是python。 整數(shù)除以整數(shù) 看官請?jiān)趩?dòng)idle之后,練習(xí)下面的運(yùn)算: >>> 2/5 0 >>> 2.0/5 0.4 >>> 2/5.0 0.4 >...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...
摘要:是一個(gè)具體的數(shù)據(jù),通過構(gòu)造函數(shù)中的參數(shù),傳給實(shí)例的屬性,在類中的另外一個(gè)方法的參數(shù)列表中第一個(gè)就是,表示要承接對象,,就是在類內(nèi)部通過對象,把它的屬性的數(shù)據(jù)傳導(dǎo)如。 上一講中創(chuàng)建了類,并且重點(diǎn)講述了構(gòu)造函數(shù)以及類實(shí)例,特別是對那個(gè)self,描述了不少。在講述構(gòu)造函數(shù)的時(shí)候特別提到,init()是一個(gè)函數(shù),只不過在類中有一點(diǎn)特殊的作用罷了,每個(gè)類,首先要運(yùn)行它,它規(guī)定了類的基本結(jié)構(gòu)。 ...
摘要:函數(shù)的基本結(jié)構(gòu)中的函數(shù)基本結(jié)構(gòu)函數(shù)名參數(shù)列表語句幾點(diǎn)說明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴關(guān)系,稱之為多態(tài)。不要期待在原處修改的函數(shù)會(huì)返回結(jié)果比如一定要之用括號(hào)調(diào)用函數(shù)不要在導(dǎo)入和重載中使用擴(kuò)展名或路徑。 在本教程的開始部分,就已經(jīng)引入了函數(shù)的概念:《永遠(yuǎn)強(qiáng)大的函數(shù)》,之所以那時(shí)候就提到函數(shù),是因?yàn)槲矣X得函數(shù)之重要,遠(yuǎn)遠(yuǎn)超過一般。這里,重回函數(shù),一是復(fù)習(xí),二是要在已經(jīng)...
摘要:上一講,主要介紹了用表達(dá)的一種輸出格式化表達(dá)式。現(xiàn)在我們就格式化方法做一個(gè)詳細(xì)一點(diǎn)的交代。關(guān)于格式化表達(dá)式和格式化方法,有的人進(jìn)行了不少比較,有的人說用這個(gè),有的人傾向用那個(gè)。不過,有人傳說格式化表達(dá)式可能在將來某個(gè)版本中廢除。 上一講,主要介紹了用%表達(dá)的一種輸出格式化表達(dá)式。在那一講最后又拓展了一點(diǎn)東西,拓展的那點(diǎn),名曰:格式化方法。因?yàn)樗R(shí)上是使用了str的format方法。 ...
閱讀 2609·2021-09-28 09:35
閱讀 3262·2021-09-03 10:28
閱讀 2905·2019-08-30 15:43
閱讀 1477·2019-08-30 14:04
閱讀 1801·2019-08-29 17:02
閱讀 1812·2019-08-26 13:59
閱讀 691·2019-08-26 11:51
閱讀 3251·2019-08-23 17:16