摘要:函數(shù)建立函數(shù)在中,規(guī)定了一種定義函數(shù)的格式,下面的舉例就是一個函數(shù),以這個函數(shù)為例來說明定義函數(shù)的格式和調(diào)用函數(shù)的方法。返回值所謂返回值,就是函數(shù)向調(diào)用函數(shù)的地方返回的數(shù)據(jù)。
函數(shù) 建立函數(shù)
在Python中,規(guī)定了一種定義函數(shù)的格式,下面的舉例就是一個函數(shù),以這個函數(shù)為例來說明定義函數(shù)的格式和調(diào)用函數(shù)的方法。
def add_function(a, b): #冒號必須 c = a + b #縮進必須 return c if __name__ == "__main__": result = add_function(2, 3) print result #python3: print(result)
定義函數(shù)的格式為:
def 函數(shù)名(參數(shù)1,參數(shù)2,...,參數(shù)n): 函數(shù)體(語句塊)
幾點說明:
函數(shù)名的命名規(guī)則要符合Python中的命名要求。一般用小寫字母和單下劃線、數(shù)字等組合,有人習慣用aaBb的樣式,但我不推薦
def是定義函數(shù)的關鍵詞,這個簡寫來自英文單詞define
函數(shù)名后面是圓括號,括號里面,可以有參數(shù)列表,也可以沒有參數(shù)
千萬不要忘記了括號后面的冒號
函數(shù)體(語句塊),相對于def縮進,按照python習慣,縮進四個空格
函數(shù)命名Python對命名的一般要求:
文件名:全小寫,可使用下劃線
函數(shù)名:小寫,可以用下劃線風格單詞以增加可讀性。如:myfunction,my_example_function。注意:混合大小寫僅被允許用于這種風格已經(jīng)占據(jù)優(yōu)勢的時候,以便保持向后兼容。有的人,喜歡用這樣的命名風格:myFunction,除了第一個單詞首字母外,后面的單詞首字母大寫。這也是可以的,因為在某些語言中就習慣如此。但我不提倡,這是我非常鮮明的觀點。
函數(shù)的參數(shù):命名方式同變量(本質(zhì)上就是變量)。如果一個參數(shù)名稱和Python保留的關鍵字沖突,通常使用一個后綴下劃線會好于使用縮寫或奇怪的拼寫。
變量:變量名全部小寫,由下劃線連接各個單詞。如color = WHITE,this_is_a_variable = 1。
調(diào)用函數(shù)定義函數(shù)
>>> def add(x,y): #為了能夠更明了顯示參數(shù)賦值特點,重寫此函數(shù) ... print "x=",x #分別打印參數(shù)賦值結果 ... print "y=",y ... return x+y ...
普通調(diào)用
>>> add(10, 3) #x=10,y=3 x= 10 y= 3 13
還可以直接把賦值語句寫到里面,就明確了參數(shù)和對象的關系。當然,這時候順序就不重要了
>>> add(x=10, y=3) x= 10 y= 3 13 >>> add(y=10, x=3) x= 3 y= 10 13
多態(tài)調(diào)用
>>> def times(x, y=2): #y的默認值為2 ... print "x=",x #Python 3: print("x={}".format(x)),以下類似,從略。 ... print "y=",y ... return x*y ... >>> times(3) #x=3,y=2 x= 3 y= 2 6 >>> times(x=3) #同上 x= 3 y= 2 6 >>> times(3, 4) #x=3,y=4,y的值不再是2 x= 3 y= 4 12 >>> times("qiwsir") #再次體現(xiàn)了多態(tài)特點 x= qiwsir y= 2 "qiwsirqiwsir"注意事項
下面的若干條,是常見編寫代碼的注意事項:
別忘了冒號。一定要記住復合語句首行末尾輸入“:”(if,while,for等的第一行)
從第一行開始。要確定頂層(無嵌套)程序代碼從第一行開始。
空白行在交互模式提示符下很重要。模塊文件中符合語句內(nèi)的空白行常被忽視。但是,當你在交互模式提示符下輸入代碼時,空白行則是會結束語句。
縮進要一致。避免在塊縮進中混合制表符和空格。
使用簡潔的for循環(huán),而不是while or range.相比,for循環(huán)更易寫,運行起來也更快
要注意賦值語句中的可變對象。
不要期待在原處修改的函數(shù)會返回結果,比如list.append(),這在可修改的對象中特別注意
調(diào)用函數(shù)是,函數(shù)名后面一定要跟隨著括號,有時候括號里面就是空空的,有時候里面放參數(shù)。
不要在導入和重載中使用擴展名或路徑。
返回值所謂返回值,就是函數(shù)向調(diào)用函數(shù)的地方返回的數(shù)據(jù)。
編寫一個斐波那契數(shù)列函數(shù):
#!/usr/bin/env python # coding=utf-8 def fibs(n): result = [0,1] for i in range(n-2): result.append(result[-2] + result[-1]) return result if __name__ == "__main__": lst = fibs(10) print lst返回多個值元組
>>> def my_fun(): ... return 1, 2, 3 ... >>> a = my_fun() >>> a (1, 2, 3)
對這個函數(shù),我們還可以用這樣的方式來接收函數(shù)的返回值。
>>> x, y, z = my_fun() >>> x 1 >>> y 2 >>> z 3函數(shù)文檔
#!/usr/bin/env python # coding=utf-8 def fibs(n): """ This is a Fibonacci sequence. #函數(shù)文檔 """ result = [0,1] for i in range(n-2): result.append(result[-2] + result[-1]) return result if __name__ == "__main__": lst = fibs(10) print lst
>>> def my_fun(): ... """ ... This is my function. ... """ ... print "I am a craft." ... >>> my_fun.__doc__ #調(diào)用打印函數(shù)文檔 " This is my function. "參數(shù)收集
函數(shù)參數(shù)的個數(shù)也有不確定的時候,怎么解決這個問題呢?Python用這樣的方式解決參數(shù)個數(shù)的不確定性。
元組形式def func(x, *arg): print x #Python 3請自動修改為print()的格式,下同,從略。 result = x print arg #輸出通過*arg方式得到的值 for i in arg: result +=i return result print func(1, 2, 3, 4, 5, 6, 7, 8, 9) #賦給函數(shù)的參數(shù)個數(shù)不僅僅是2個字典形式
>>> def foo(**kargs): ... print kargs #Python 3: print(kargs) ... >>> foo(a=1,b=2,c=3) #注意觀察這次賦值的方式和打印的結果 {"a": 1, "c": 3, "b": 2}一種優(yōu)雅的方式
>>> def add(x, y): ... return x + y ... >>> add(2, 3) 5 >>> bars = (2, 3) >>> add(*bars) 5 >>> bars = (2, 3, 4) #元組中元素的個數(shù),要跟函數(shù)所要求的變量個數(shù)一致,不然如下報錯 >>> add(*bars) Traceback (most recent call last): File "綜合 def foo(p1, p2, p3, ...)", line 1, in TypeError: add() takes exactly 2 arguments (3 given)
>>> def foo(p1, p2, p3): ... print "p1==>",p1 #Python 3用戶修改為print()格式,下同 ... print "p2==>",p2 ... print "p3==>",p3 ... >>> foo("python", 1, ["qiwsir","github","io"]) p1==> python p2==> 1 p3==> ["qiwsir", "github", "io"]def foo(p1=value1, p2=value2, ...)
>>> foo(p3=3, p1=10, p2=222) p1==> 10 p2==> 222 p3==> 3 >>> def foo(p1, p2=22, p3=33): #設置了兩個參數(shù)p2, p3的默認值 ... print "p1==>",p1 ... print "p2==>",p2 ... print "p3==>",p3 ... >>> foo(11) #p1=11,其它的參數(shù)為默認賦值 p1==> 11 p2==> 22 p3==> 33 >>> foo(11, 222) #按照順序,p2=222, p3依舊維持原默認值 p1==> 11 p2==> 222 p3==> 33 >>> foo(11, 222, 333) #按順序賦值 p1==> 11 p2==> 222 p3==> 333 >>> foo(11, p2=122) p1==> 11 p2==> 122 p3==> 33 >>> foo(p2=122) #p1沒有默認值,必須要賦值的,否則報錯 Traceback (most recent call last): File "def foo(*args)", line 1, in TypeError: foo() takes at least 1 argument (1 given)
這種方式適合于不確定參數(shù)個數(shù)的時候,在參數(shù)args前面加一個*
>>> def foo(*args): ... print args ... >>> foo("qiwsir.github.io") ("qiwsir.github.io",) >>> foo("qiwsir.github.io","python") ("qiwsir.github.io", "python")def foo(**args)
這種方式跟上面的區(qū)別在于,必須接收類似arg=val形式的。
>>> def foo(**args): ... print args ... >>> foo(1,2,3) Traceback (most recent call last): File "特殊函數(shù) lambda", line 1, in TypeError: foo() takes exactly 0 arguments (3 given) >>> foo(a=1,b=2,c=3) {"a": 1, "c": 3, "b": 2}
# !/usr/bin/env python #coding=utf-8 def add(x,y = 3): return x + y ret = add(5) print ret lam = lambda x : x + 3 ret = lam(5) print ret lam = lambda x,y : x + y ret = lam(5,5) print ret 8 8 10
lambda函數(shù)的使用方法:
lambda后面直接跟變量;
變量后面是冒號;
冒號后面是表達式,表達式計算結果就是本函數(shù)的返回值;
maplambda函數(shù)不能包含太多的命令,包含的表達式不能超過一個,不要試圖向lambda函數(shù)中塞入太多的東西,如果需要更復雜的東西,應該定義一個普通的函數(shù)。
# !/usr/bin/env python #coding=utf-8 def add(x,y = 3): return x + y numbers = range(9) print numbers ret = map(add, numbers) #只引用函數(shù)名即可 print ret ret = map(lambda x : x + 4, numbers) # print ret ret = [x + 4 for x in numbers] #列表解析的方式實現(xiàn) print ret
map()是Python的一個內(nèi)置函數(shù),它的基本樣式是:
map(fun,seq)
func是一個函數(shù),seq是一個序列對象。在執(zhí)行的時候,序列對象中的每個對象,按照從左到右的順序依次被取出來,塞入到func函數(shù)里面,并將func的返回值依次存到一個列表中。
reducereduce()是橫著逐個元素進行運算
# !/usr/bin/env python #coding=utf-8 def add(x,y): #連續(xù)相加 return x + y def mul(x,y): #連續(xù)相乘 return x * y numbers = range(9) print numbers ret = reduce(add, numbers) print ret ret = reduce(mul, numbers) print ret [0, 1, 2, 3, 4, 5, 6, 7, 8] 36 0filter
# !/usr/bin/env python #coding=utf-8 numbers = range(-5,5) print numbers ret = filter(lambda x : x > 0, numbers) #過濾掉x < 0的數(shù) print ret ret = [x for x in numbers if x > 0] print ret ret = filter(lambda c : c != "i", "liuguoquan") #過濾掉字符i print ret練習 求解一元二次方程
# !/usr/bin/env python #coding=utf-8 """ 求解一元二次方程 """ from __future__ import division import math def quadratic_equation(a,b,c): delta = b * b - 4 * a * c if delta < 0: return False elif delta == 0: return -(b / (2 * a)) else: sqrt_delat = math.sqrt(delta) x1 = (-b + sqrt_delat) / (2 * a) x2 = (-b - sqrt_delat) / (2 * a) return x1,x2 if __name__ == "__main__": print "a quadratic equation: x^2 + 2x + 1 = 0" coefficients = (1,2,1) roots = quadratic_equation(*coefficients) if roots: print "the result is: ",roots else: print "this equation has no solution" a quadratic equation: x^2 + 2x + 1 = 0 the result is: -1.0統(tǒng)計考試成績
# !/usr/bin/env python #coding=utf-8 """ 統(tǒng)計考試成績 """ from __future__ import division import math def average_score(scores): """ 統(tǒng)計平均分 """ score_values = scores.values() sum_scores = sum(score_values) average = sum_scores / len(score_values) return average def sorted_score(scores): """ 對成績從高到低排序呢 """ score_list = [(scores[k],k) for k in scores] #將鍵-值互換位置 score_list是列表,里面的元素是一個元組 sort_lst = sorted(score_list,reverse = True) return [(i[1],i[0]) for i in sort_lst] #將鍵-值互換位置 def max_score(scores): """ 成績最高的姓名和分數(shù) """ lst = sorted_score(scores) max_score = lst[0][1] return [(i[0],i[1]) for i in lst if i[1] == max_score] def min_scroe(scores): """ 成績最低的姓名和分數(shù) """ lst = sorted_score(scores) min_score = lst[len(lst) - 1][1] return [(i[0],i[1]) for i in lst if i[1] == min_score] if __name__ == "__main__": scores = {"google":98,"facebook":99,"baidu":52,"alibab":80,"yahoo":49,"android":76,"apple":99,"amazon":99} ret = average_score(scores) #平均分 print "average is: ",ret ret = sorted_score(scores) #成績表 print "list of scores is: ",ret ret = max_score(scores) #學霸們 print "學霸是: ",ret ret = min_scroe(scores) #學渣 print "學渣是: ",ret average is: 81.5 list of scores is: [("facebook", 99), ("apple", 99), ("amazon", 99), ("google", 98), ("alibab", 80), ("android", 76), ("baidu", 52), ("yahoo", 49)] 學霸是: [("facebook", 99), ("apple", 99), ("amazon", 99)] 學渣是: [("yahoo", 49)]找質(zhì)數(shù)
質(zhì)數(shù)又稱素數(shù),指在大于1的自然數(shù)中,除了1和此整數(shù)自身外,無法被其他自然整數(shù)整除的數(shù)(也可定義為只有1和本身兩個因數(shù)的數(shù))
# !/usr/bin/env python #coding=utf-8 """ 尋找質(zhì)數(shù) """ import math def is_prime(n): """ 判斷一個數(shù)是否是質(zhì)數(shù) """ if n <=1: return False for i in range(2,int(math.sqrt(n) + 1)): if n % i == 0: return False return True if __name__ == "__main__": primes = [i for i in range(2,100) if is_prime(i)] print primes [5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]編寫函數(shù)的注意事項
盡量不要使用全局變量
如果參數(shù)是可變數(shù)據(jù)類型,則在函數(shù)內(nèi)不要修改它
每個函數(shù)的功能和目的要單一,不要一個函數(shù)試圖做很多事情
函數(shù)的代碼行數(shù)盡量少
函數(shù)的獨立性越強越好,不要跟其他的外部東西產(chǎn)生關聯(lián)
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/38204.html
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優(yōu)秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結構、語法...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術服務,現(xiàn)整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務,服務范圍涵蓋社交網(wǎng)絡電子商務分類信息學術研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術服務,現(xiàn)整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:它需要一個函數(shù)默認工廠作為其參數(shù)。默認情況下設置為,即如果鍵不存在則為,并返回并顯示默認值。因此,它是一個無序集合,其中元素及其各自的計數(shù)存儲為字典。這相當于其他語言的或。使用,我們不必使用整數(shù)索引來訪問元組的成員。 神奇的collections 大家好,今天想和大家分享一個Python里面非常棒的??欤篊ollections 該模塊實現(xiàn)了專門的容器數(shù)據(jù)類型,為Python的通用內(nèi)置容...
摘要:全棧數(shù)據(jù)之門暫定書名是末學近年來工作技能的積累,從個月前開通公眾號寫的第一篇起,中間也不知度過了多少個寂寞的夜晚。如果此書能叫全棧數(shù)據(jù)之門具體書名還得再與出版社編輯討論才定,那么也許下一本就叫全棧數(shù)據(jù)之路。 《全棧數(shù)據(jù)之門》(暫定書名)是末學近5年來工作技能的積累,從8個月前開通公眾號寫的第一篇起,中間也不知度過了多少個寂寞的夜晚。 寫文章本來就是一個很費力的活,況且寫書要求還得高些。...
閱讀 1258·2021-09-27 13:34
閱讀 1072·2021-09-13 10:25
閱讀 571·2019-08-30 15:52
閱讀 3513·2019-08-30 13:48
閱讀 741·2019-08-30 11:07
閱讀 2230·2019-08-29 16:23
閱讀 2057·2019-08-29 13:51
閱讀 2391·2019-08-26 17:42