python基礎學習筆記(七)
2013-04-24 00:16 ?蟲師 閱讀( ... ) 評論( ... ) 編輯 收藏?
本章介紹如何將語句組織成函數,這樣,可以告訴計算機如何做事。
?
下面編寫一小段代碼計算婓波那契數列(前兩個數的和是第三個數)
fibs = [0,1] # 定義一個列表,初始內容是0,1 for i in range(8): # 循環8次 fibs.append(fibs[-2]+fibs[-1]) # append在末尾追加一個數,這個是它前面兩個數的和 # 輸入 >>> fibs # 輸出 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
因為賦完值 fibs 已經有兩個數了( 0 , 1 ),所以循環 8 次之后,列表有 10 個數,兩個數相加等于第 3 個數。
是不是覺得應該由我們輸入來控制打印多少個數?只用把程序小變一下就行了。
fibs = [0,1 ] num = input( ' How many fibonacci numbers do you want? ' ) for i in range(num-2 ): fibs.append(fibs[ -2]+fibs[-1 ]) print fibs # 輸入 >>> How many fibonacci numbers do you want? 12 # 輸出 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
?
?
抽象
抽象有可以節省很多工作,它使得計算機程序可以讓人讀懂的關鍵。計算機喜歡處理精確和具體的指令,但人不同,我們更喜歡丟進去一個東西,計算機就能反饋給我們想要的結果,而不是由我們一步一步的告訴它怎么做。因此,上面的代碼抽象一點,應該是這樣的:
?
num = input( ' How many fibonacci numbers do you want? ' ) print fibs
?
那計算機怎么知道要怎么做?我們可以把處理的過程封裝成函數,在我們每次用到時只用調用這個函數就可以了。
?
?
創建函數
函數是可以調用的,它執行某種行為并且返回一個值。內建的 callable 函數可以用來判斷函數是否可調用:
>>> import math >>> x = 1 >>> y = math.sqrt >>> callable(x) False >>> callable(y) True
備注: callable? 在 python3.0 中不再可用。
?
那如何定義一個函數呢?使用 def 語句即可:
>>> def hello(name): return ' hello. ' +name+ ' ! ' # 我們定義了一個hello函數,它會將輸入的內容前面加“hello.”后面加“!”,并返回給用 # 戶 >>> print hello( ' world ' ) hello.world! >>> print hello( ' zhangsan ' ) hello.zhangsan!
?
不錯吧!再回過頭去想想怎樣把返回婓波那契數列定義成一個函數。如下:
# 定義fibs函數,用于婓波那契數列 >>> def fibs(num): result = [0,1 ] for i in range(num-2 ): result.append(result[ -2]+result[-1 ]) return result # 直接調用fibs函數 >>> fibs(10 ) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ] >>> fibs(15 ) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
?
?
局部變量
當函數定義生命變量的時候,函數內所生命的變理只在其函數內有效,與函數外具有相同名稱的其他變量沒有任何關系
# 局部變量 def func(x): print ' x is ' ,x x =2 # x=2只在func函數內其作用 print ' Changed local x to ' ,x x = 50 func(x) # func函數并沒有返回數據過來。 print ' x is still ' ,x # 輸出 >>> x is 50 Changed local x to 2 x is still 50
?
?
global? 語句
如果想把一個變量聲名為?全局的,則可以使用 global 語句。
def func(): global x print ' x is ' ,x x = 2 print ' Changed local x to ' ,x x =50 func() print ' Value of x is ' ,x # 輸出 x is 50 Changed local x to 2 Value of x is 2
global? 語句被用來生命 x? 是全局,因此在執行完 func 函數后, x 的值已經發生了改變,并且作用于整個程序,因此最后的輸入結果為 2
?
?
默認參數
對于一些參數,我們希望它的一些參數是可選的,如果用戶不想要為這些參數提供值的話,這些參數就使用默認值。
def say(message,times=1 ): print message* times say( ' Hello ' ) say( ' World ' ,5 ) # 輸出 >>> Hello WorldWorldWorldWorldWorld
?
定義的 say 函數的第兩個參數就是可選的,默認為 times=1 ;也就是將兩個參數相乘輸出。
?
注意:只有在形參表末尾的那些參數可以有默認參數,如 def?func(a=5,b)? 是無效的。
?
?
?
關鍵參數
如果某個函數有許多參數,而我們只想指定其中的一部分,那么可以使用名字(關鍵字)而不是位置來給函數指定實參。 ---- 這被稱作?關鍵參數
def func(a,b=5,c=10 ): print ' a is ' ,a, ' and b is ' ,b, ' and c is ' ,c func( 3,7 ) func( 24,c=32 ) func(c =23,a=14 )
# 輸出 >>> a is 3 and b is 7 and c is 10 a is 24 and b is 5 and c is 32 a is 14 and b is 5 and c is 23
這樣做,我就不必擔心參數的順序,使用函數變得更加簡單。假設其它函數都有默認值,我們可以只給自己想要的參數賦值。
?
?
遞歸:
有用的遞歸函數 ...? 等等,什么是無用的遞歸?先來看一個函數的定義:
def recursion() return recursion()
?
顯然,它什么也干不了,程序的執行不斷申請內存,直接內存耗盡,程序崩潰。
接著,有用的遞歸函數包含以下幾個部分:
- 當函數直接返回值時有基本實例(最小可能性問題)
- 遞歸實例,包括一個或者多個問題最小部分的遞歸調用。
?
下面通過遞歸函數來計算一個 n 的階, n*(n-1)*(n-2)*....*1
def f(n): if n == 1 : return 1 else : return n*f(n-1)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
