python基礎學習筆記(七)

來源:互聯網
上載者:User

 

本章介紹如何將語句組織成函數,這樣,可以告訴電腦如何做事。

 

下面編寫一小段代碼計算婓波那契數列(前兩個數的和是第三個數)

fibs = [0,1]   # 定義一個列表,初始內容是0,1for 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 = 50func(x)   #func函數並沒有返回資料過來。print 'x is still',x#輸出>>> x is 50Changed local x to 2x is still 50

 

 

global 語句

  如果想把一個變數聲名為 全域的,則可以使用global語句。

def func():    global x    print 'x is',x    x = 2    print 'Changed local x to',xx =50func()print 'Value of x is ',x#輸出x is 50Changed local x to 2Value of x is  2

global 語句被用來生命x 是全域,因此在執行完func函數後,x的值已經發生了改變,並且作用於整個程式,因此最後的輸入結果為2

 

 

預設參數

  對於一些參數,我們希望它的一些參數是可選的,如果使用者不想要為這些參數提供值的話,這些參數就使用預設值。

def say(message,times=1):    print message*timessay('Hello')say('World',5)#輸出>>> HelloWorldWorldWorldWorldWorld

 

定義的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',cfunc(3,7)func(24,c=32)func(c=23,a=14)
#輸出>>> a is 3 and b is 7 and c is 10a is 24 and b is 5 and c is 32a 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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.