04-Python函數

Python函數

Python函數思維導圖

1、函數介紹

我們知道圓的面積計算公式爲:S = πr2

當我們知道半徑r的值時,就可以根據公式計算出面積。假設我們需要計算3個不同大小的圓的面積:
r1 = 12.34 r2 = 9.08 r3 = 73.1
s1 = 3.14 * r1 * r1
s2 = 3.14 * r2 * r2
s3 = 3.14 * r3 * r3
當代碼出現有規律的重複的時候,你就需要當心了,每次寫3.14 * x * x不僅很麻煩,而且,如果要把3.14改成3.14159265359的時候,得全部替換。
有了函數,我們就不再每次寫s = 3.14 * x * x,而是寫成更有意義的函數調用s = area_of_circle(x),而函數area_of_circle本身只需要寫一次,就可以多次調用。
基本上所有的高級語言都支持函數,Python也不例外。Python不但能非常靈活地定義函數,而且本身內置了很多有用的函數,可以直接調用。

2、函數的定義與調用

1、定義函數

  • def 函數名(參數列表):
    函數體

2、調用函數

  • 定義了函數之後,就相當於有了一個具有某些功能的代碼,想要讓這些代碼能夠執行,需要調用它。調用函數很簡單的,通過 函數名() 即可完成調用

注意:

  • 1、函數的定義必須要以def開頭
  • 2、函數名稱 (參數列表)
  • 3、函數的參數列表不需要定義類型
  • 4、Python的函數沒有重載,重名的函數、後面會覆蓋前面

3、函數參數(一)

<1> 定義帶有參數的函數:

  • def add2num(a, b):
    c = a+b
    print c

<2> 調用帶有參數的函數:

  • def add2num(a, b):
    c = a+b
    print c
    add2num(11, 22) #調用帶有參數的函數時,需要在小括號中,傳遞數據

<3>小總結:

  • 定義時小括號中的參數,用來接收參數用的,稱爲 “形參”
  • 調用時小括號中的參數,用來傳遞給函數用的,稱爲 “實參”

注意:

  • 1、函數的參數可以帶默認值,當調用時,不指定參數則使用默認值,指定參數時覆蓋默認值

4、函數參數(二)

1. 缺省參數

  • 調用函數時,缺省參數的值如果沒有傳入,則被認爲是默認值(可傳可不傳)

    • def printinfo( name, age = 35 ):# 打印任何傳入的字符串
      print"Name: ", name
      print"Age ", age # 調用printinfo函數
      printinfo(name=“miki” )
      printinfo( age=9,name=“miki” )

2.不定長參數

  • 有時可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,聲明時不會命名

    • Def functionname([formal_args,] *args, **kwargs):“函數_文檔字符串”
      function_suite
      return [expression]

      • *args:表示一組值的集合,普通數據
      • **kwargs:表示k-v格式的數據

3. 引用傳參

  • Python中函數參數是引用傳遞(注意不是值傳遞)。對於不可變類型,因變量不能修改,所以運算不會影響到變量自身;而對於可變類型來說,函數體中的運算有可能會更改傳入的參數變量。

    • def selfAdd(a):… “”“自增”""… a += a

a_int = 1
a_int 1
selfAdd(a_int)
a_int 1
a_list = [1, 2]
a_list [1, 2]
selfAdd(a_list)
a_list [1, 2, 1, 2]

5、函數返回值(一)

<1>帶有返回值的函數

  • 想要在函數中把結果返回給調用者,需要在函數中使用return

    • def add2num(a, b):
      c = a+b
      return c

<2>保存函數的返回值

  • #定義函數
    def add2num(a, b):
    return a+b #調用函數,順便保存函數的返回值
    result = add2num(100,98) #因爲result已經保存了add2num的返回值,所以接下來就可以使用了
    print result

6、函數的返回值(二)

返回多個值(本質是利用了元組)

  • def divid(a, b):
    … shang = a//b
    … yushu = a%b
    … return shang, yushu

sh, yu = divid(5, 2)
sh 5
yu 1

7、局部變量和全局變量

1、局部變量

  • 局部變量(Local variables)指在程序中只在特定過程或函數中可以訪問的變量

  • 總結:

    • 1、局部變量,就是在函數內部定義的變量
    • 2、不同的函數,可以定義相同的名字的局部變量,但是各用個的不會產生影響
    • 3、局部變量的作用,爲了臨時保存數據需要在函數中定義變量來進行存儲,這就是它的作用

2、全局變量

  • <1>什麼是全局變量

    • 如果一個變量,既能在一個函數中使用,也能在其他的函數中使用,這樣的變量就是全局變量
  • <2>全局變量和局部變量名字相同問題

    • 在方法中不可以改變全局變量的值(加上global可以改變值)
    • 不能在global前定義同名的局部變量
  • <3>修改全局變量

    • 既然全局變量,就是能夠在所以的函數中進行使用,那麼可否進行修改呢?:global
  • <4>可變類型的全局變量

    • a = 1

deff():
… a += 1
… print a

f()
Traceback (most recent call last): File “”, line 1, in File “”, line 2, in f UnboundLocalError: local variable ‘a’ referenced before assignment

li = [1,]
deff2():
… li.append(1)
… print li

f2() [1, 1]
li [1, 1]

  • <5>總結1:

    • 在函數外邊定義的變量叫做全局變量
    • 全局變量能夠在所有的函數中進行訪問
    • 如果在函數中修改全局變量,那麼就需要使用global進行聲明,否則出錯
    • 如果全局變量的名字和局部變量的名字相同,那麼使用的是局部變量的,小技巧:強龍不壓地頭蛇
  • <5>總結2:

    • 在函數中不使用global聲明全局變量時不能修改全局變量的本質是不能修改全局變量的指向,即不能將全局變量指向新的數據

    • 對於不可變類型的全局變量來說,因其指向的數據不能修改,所以不使用global時無法修改全局變量

    • 對於可變類型的全局變量來說,因其指向的數據可以修改,所以不使用global時也可修改全局變量

    • 可變類型:值可以修改(內存地址不變但是所保存的值變化了),引用可以修改(變量的內存地址變化了)

    • 不可變類型:值不可以修改,可以修改變量的引用(=賦值號)

    • 在函數裏面修改全局變量:

      •  1、如果全局變量是可變類型:所以在函數裏面任意修改(值,引用)
        
      •  2、如果全局變量是不可變類型:在函數裏面不能修改值,也不能修改引用,除非加上global才能修改引用
        

8、遞歸函數

<1>什麼是遞歸函數

  • 在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數

<2>遞歸函數的作用

  • 舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * … * n
  • 解決辦法2

9、匿名函數

1、匿名函數

  • 用lambda關鍵詞能創建小型匿名函數。這種函數得名於省略了用def聲明函數的標準步驟

  • 語法:

    • lambda [arg1 [,arg2,…argn]]:
      expression
  • Lambda函數能接收任何數量的參數但只能返回一個表達式的值

  • 匿名函數不能直接調用print,因爲lambda需要一個表達式

2、應用場合(函數作爲參數傳遞)

  • 1、自己定義函數

    • def fun(a, b, opt):
      … print"a =", a
      … print"b =", b
      … print"result =", opt(a, b)

fun(1, 2, lambda x,y:x+y)
a = 1
b = 2
result = 3

  • 2、作爲內置函數的參數

    • 需求:想一想,下面的數據如何指定按age或name排序?

    • 數據:stus = [ {“name”:“zhangsan”, “age”:18}, {“name”:“lisi”, “age”:19}, {“name”:“wangwu”, “age”:17} ]

    • 按name排序:

      • stus.sort(key = lambda x:x[‘name’])

stus [{‘age’: 19, ‘name’: ‘lisi’}, {‘age’: 17, ‘name’: ‘wangwu’}, {‘age’: 18, ‘name’: ‘zhangsan’}]

- 按age排序:

	- >>> stus.sort(key = lambda x:x['age']) 

stus [{‘age’: 17, ‘name’: ‘wangwu’}, {‘age’: 18, ‘name’: ‘zhangsan’}, {‘age’: 19, ‘name’: ‘lisi’}]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章