qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          python學習之函數

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

           

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

          復制代碼
          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已經有兩個數了(01),所以循環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 語句被用來生命是全局,因此在執行完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)

          posted on 2014-02-11 11:53 順其自然EVO 閱讀(223) 評論(0)  編輯  收藏 所屬分類: python

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 张家口市| 广宁县| 泰宁县| 桦川县| 衡水市| 奉新县| 云安县| 囊谦县| 新平| 安远县| 屏南县| 永城市| 余庆县| 潼南县| 南江县| 贡嘎县| 噶尔县| 彭泽县| 澄迈县| 睢宁县| 宁晋县| 台东市| 叙永县| 葫芦岛市| 英吉沙县| 淮滨县| 浦北县| 馆陶县| 福泉市| 垣曲县| 新丰县| 平定县| 茶陵县| 阿克苏市| 莲花县| 卫辉市| 达孜县| 碌曲县| 任丘市| 时尚| 台东市|