調(diào)用函數(shù)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 絕對值,只能接收一個參數(shù)
print(abs(-100))
# 最大值假褪,可以接收任意多個參數(shù),并返回最大的那個
print(max(1,2,3,6,9))
# 數(shù)據(jù)類型轉(zhuǎn)換
print(int('123'))
print(int(12.34))
print(float('12.34'))
print(str(1.23))
print(str(100))
print(bool(1))
print(bool(''))
# 函數(shù)名其實就是指向一個函數(shù)對象的引用,完全可以把函數(shù)名賦給一個變量嚷往,相當于給這個函數(shù)起了個別名
a = abs
print(a(-1))
定義函數(shù)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
# def語句:依次寫出函數(shù)名、括號车遂、括號中的參數(shù)和冒號:饥努,然后在縮進塊中編寫函數(shù)體,函數(shù)的返回值用return語句返回拐叉。
'''
1. 如果沒有return語句,也會返回結(jié)果扇商,結(jié)果為None凤瘦。return None可以簡寫為return
'''
# 把my_abs()的函數(shù)定義保存為abstest.py文件。在該文件的當前目錄下啟動Python解釋器
# 用from 語句導入這個函數(shù)案铺。注意:abstest是文件名
from abstest import my_abs
print(my_abs(-9))
# 空函數(shù) pass語句 pass占位符
def nop():
pass
# 參數(shù)檢查蔬芥。數(shù)據(jù)類型檢查可以用內(nèi)置函數(shù)isinstance()實現(xiàn)
def custom_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
# 返回多個值,其實就是返回一個tuple,元祖
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
print(move(100, 100, 60, math.pi / 6))
函數(shù)的參數(shù)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
1. 必選參數(shù)在前控汉,默認參數(shù)在后
2. 當函數(shù)有多個參數(shù)時笔诵,把變化大的參數(shù)放在前面,變化小的放在后面姑子。
3. 默認函數(shù)可以按順序提供參數(shù)乎婿。也可以不按順序,但是必須加上參數(shù)
4. 默認參數(shù)必須指向不可變對象
'''
# pow(x,2)的函數(shù)
def power1(x):
return x * x
# x 的 n次方函數(shù)
def power2(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
# 默認參數(shù)
def power(x, n = 2) :
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(power(2,4))
print(power(2,n=5))
# 可變參數(shù)
# 正常定義
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
print(calc([1,2,3]))
# 可變參數(shù)定義
def calc_mutable(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
print(calc_mutable(1,2,3))
nums = [4,5,6]
print(calc_mutable(*nums))
# 關(guān)鍵字函數(shù):擴展函數(shù)功能
def person(name, age, **kw):
print('name:',name, 'age:', age, 'other:', kw)
print(person('Michael',30))
extra = {'City':'Beijing', 'Job':'Coding'}
print(person('Jack', 24, **extra))
# 命名關(guān)鍵字參數(shù):函數(shù)的調(diào)用者可以傳入任意不受限制的關(guān)鍵字參數(shù)街佑。
# 要限制關(guān)鍵字參數(shù)的名字谢翎,就可以用命名關(guān)鍵字參數(shù)捍靠。例如,只接收city和job作為關(guān)鍵字.命名關(guān)鍵字無默認值時必須傳入?yún)?shù)
# 如果函數(shù)中已經(jīng)定義了一個可變參數(shù)岳服,后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔符*
# 通過*剂公,區(qū)別位置參數(shù)和命名關(guān)鍵字
def person1(name, age, *, city, job):
print(name,age,city,job)
person1('Jack',24,city='Beijing',job='Coding')
# 參數(shù)組合
'''
順序:必選參數(shù)、默認參數(shù)吊宋、可變參數(shù)纲辽、命名關(guān)鍵字參數(shù)、關(guān)鍵字參數(shù)
'''
def f1(a, b, c=0, *args, **kw)
print(a,b,c,args,kw)
def f2(a, b, c=0, *, d, **kw)
print(a, b, c, d, kw)
f1(1,2)
f1(1,2,c=3)
f1(1,2,3,'a','b')
f1(1,2,3,'A','B',X=99)
f2(1,2,d=99,ext=None)
遞歸函數(shù)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 遞歸函數(shù):一個函數(shù)在內(nèi)部調(diào)用自身本身
def fact(n):
if n == 1:
return 1
return n * fact(n-1)
print(fact(2))
'''
1. 注意防止棧溢出:函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的璃搜。每當進入一個函數(shù)調(diào)用拖吼,棧就會加一層棧幀,每當函數(shù)返回这吻,棧就會減一層棧幀吊档。
2. 解決遞歸調(diào)用棧溢出方法:尾遞歸優(yōu)化。在函數(shù)返回時唾糯,調(diào)用自身本身怠硼,并且return語句不能包含表達式。這樣編譯器或者解釋器就可以把尾遞歸做優(yōu)化移怯,
使遞歸本身無論調(diào)用多少次香璃,都占用一個棧幀,不會出現(xiàn)棧溢出的情況舟误。
'''
def face(n):
return face_iter(n,1)
def face_iter(num, product):
if num == 1:
return product
return face_iter(num-1, num * product)
print(face(10))
參考
- 廖雪峰的Python教程