Python學習目錄
- 在Mac下使用Python3
- Python學習之資料型別
- Python學習之函式
- Python學習之高階特性
- Python學習之函數語言程式設計
- Python學習之模組
- Python學習之物件導向程式設計
- Python學習之物件導向高階程式設計
- Python學習之錯誤除錯和測試
- Python學習之IO程式設計
- Python學習之程式和執行緒
- Python學習之正則
- Python學習之常用模組
- 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)
函式有兩個引數:x
和n
,這兩個引數都是位置引數,呼叫函式時,傳入的兩個值按照位置順序依次賦給引數x
和n
。
預設引數
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不同,命名關鍵字引數需要一個特殊分隔符*,*後面的引數被視為命名關鍵字引數。如果函式定義中已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符*了