Python學習目錄python
練習代碼git
咱們知道圓的面積計算公式爲:S = πr2,當咱們知道半徑r
的值時,就能夠根據公式計算出面積。假設咱們須要計算3個不一樣大小的圓的面積:github
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不但能很是靈活地定義函數,並且自己內置了不少有用的函數,能夠直接調用。函數式編程
def my_abs(x):
if x >= 0:
return x
else:
return -x
複製代碼
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
x, 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等)!post
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
calc(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 Engineer
def person(name, age, *args, city='Beijing', job):
print(name, age, args, city, job)
person('Jack', 24, job='Engineer')
>>> Jack 24 Beijing Engineer
複製代碼
和關鍵字參數**kw不一樣,命名關鍵字參數須要一個特殊分隔符*,*後面的參數被視爲命名關鍵字參數。若是函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就再也不須要一個特殊分隔符*了