Python學習之函式

stonezhu發表於2018-06-16

Python學習目錄

  1. 在Mac下使用Python3
  2. Python學習之資料型別
  3. Python學習之函式
  4. Python學習之高階特性
  5. Python學習之函數語言程式設計
  6. Python學習之模組
  7. Python學習之物件導向程式設計
  8. Python學習之物件導向高階程式設計
  9. Python學習之錯誤除錯和測試
  10. Python學習之IO程式設計
  11. Python學習之程式和執行緒
  12. Python學習之正則
  13. Python學習之常用模組
  14. Python學習之網路程式設計

練習程式碼

我們知道圓的面積計算公式為:S = πr2,當我們知道半徑r的值時,就可以根據公式計算出面積。假設我們需要計算3個不同大小的圓的面積:

r1 = 12.34r2 = 9.08r3 = 73.1s1 = 3.14 * r1 * r1s2 = 3.14 * r2 * r2s3 = 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不但能非常靈活地定義函式,而且本身內建了很多有用的函式,可以直接呼叫。

定義函式

  • 使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。
def my_abs(x):    if x >
= 0: return x else: return -x複製程式碼
  • 可返回多個值(返回值是一個tuple!但是,在語法上,返回一個tuple可以省略括號,而多個變數可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函式返回多值其實就是返回一個tuple)。
import mathdef move(x, y, step, angle=0):    nx = x + step * math.cos(angle)    ny = y - step * math.sin(angle)    return nx, nyx, y = move(100, 100, 60, math.pi / 6)複製程式碼

函式的引數

位置引數

def power(x, n):    s = 1    while n >
0: n = n - 1 s = s * x return s複製程式碼

power(x, n)函式有兩個引數:xn,這兩個引數都是位置引數,呼叫函式時,傳入的兩個值按照位置順序依次賦給引數xn

預設引數

def enroll(name, gender, age=6, city='Beijing'):    print('name:', name)    print('gender:', gender)    print('age:', age)    print('city:', city)enroll('Bob', 'M', 7)enroll('Adam', 'M', city='Tianjin')複製程式碼

從上面的例子可以看出,預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意:一是必選引數在前,預設引數在後,否則Python的直譯器會報錯;二是當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。三是預設引數必須指向不變物件(str、None等)!

可變引數

def calc(*numbers):    sum = 0    for n in numbers:        sum = sum + n * n    return sumcalc(1, 2)nums = [1, 2, 3]calc(*nums)複製程式碼

可以看出,可變引數就是傳入的引數個數是可變的,可以是1個、2個到任意個,還可以是0個。

關鍵字引數

可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為一個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict。

def person(name, age, **kw):    print('name:', name, 'age:', age, 'other:', kw)extra = {'city': 'Beijing', 'job': 'Engineer'
}person('Jack', 24, **extra)>
>
>
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'
}複製程式碼

命名關鍵字引數

def person(name, age, *, city, job):    print(name, age, city, job)person('Jack', 24, city='Beijing', job='Engineer')>
>
>
Jack 24 Beijing Engineerdef person(name, age, *args, city='Beijing', job): print(name, age, args, city, job)person('Jack', 24, job='Engineer')>
>
>
Jack 24 Beijing Engineer複製程式碼

和關鍵字引數**kw不同,命名關鍵字引數需要一個特殊分隔符*,*後面的引數被視為命名關鍵字引數。如果函式定義中已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符*了

下一篇:Python學習之高階特性

來源:https://juejin.im/post/5b2463f5518825748a57a057

相關文章