python3.5入門筆記(8) 函式
呼叫函式和引數
1、定義函式
- def關鍵字開頭
- 所有傳入引數和自變數必須放入圓括號中,可以在括號內定義引數
- 第一行可以選擇性使用文件字串
- 函式內容以冒號開始,要縮排
- Return 表示結束函式,不帶表示式的return相當於返回none
基礎方法例項:
def test():
a=10
b=20
print(a)
print(b)
print(a+b)
test()
2、引數型別
(1)必須引數:必須以正確的順序傳入函式
def test(mm):
print('必須引數:',mm)
print('必須引數2:',mm)
test('hello,world')
>>>必須引數: hello,world
>>>必須引數2: hello,world
(2)關鍵字引數:函式呼叫時使用關鍵字引數傳入值
def test(mm,nn):
print('姓名',mm)
print('年齡',nn)
return
test('小雪',20)
test(nn=21,mm='小紅')
>>>姓名 小雪
>>>年齡 20
>>>姓名 小紅
>>>年齡 21
(3)預設引數:呼叫函式時,沒有傳遞引數,會使用預設引數
def test(name,age=21):
print('姓名:',name)
print('年齡:',age)
return
test('小萌')
>>>姓名: 小萌
>>>年齡: 21
#非預設引數要跟在預設引數之後
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll("kangkang",2)
>>>name: kangkang
>>>gender: 2
>>>age: 6
>>>city: Beijing
enroll("xiaoming",6,12,'重慶')
>>>name: xiaoming
>>>gender: 6
>>>age: 12
>>>city: 重慶
(4)可變引數:可變引數就是指傳入的引數是可以改變的,可以是1個2個...,甚至不指定
def p(*a):
print('輸出:',a)
return
p(1,2,(1,2))
>>>輸出: (1, 2, (1, 2)
-------
test=('a','b','c','d') ** 輸出字典
def mm(name,**kw):
print('姓名:',name,'其它:',kw)
mm('小雪',nn=test[0])
>>>姓名: 小雪 其它: {'nn': 'a'}
(5)組合引數
def test(p1,p2,p3=0,*vart,**kw):
print('p1=',p1,'p2=',p2,'p3=',p3,'vart=',vart,'kw=',kw)
test(1,2,3,'abc',x=3)
>>>p1= 1 p2= 2 p3= 3 vart= ('abc',) kw= {'x': 3}
變數作用域
1、區域性變數
區域性變數,變數只能在函式內部用;全域性變數,函式可以在任意處使用
(1)def func(x):
print('區域性變數x為',x)
(2)func(10) #區域性變數x為 10
2、全域性變數
(1) 例子1
num=100
print('函式外num的值為:',num)
def fun():
global num
num=200
print('函式內num的值為:',num)
fun()
print(num)
>>>>函式外num的值為: 100
>>>>函式內num的值為: 200
>>>>200
(2) global語句可以宣告一個或多個變數為全域性變數
def save_case_infos(case_urls):
global case_total_num# global宣告
for case_url in case_urls:
case_total_num += 1
print("current count: " ,case_total_num)
case_total_num = 0
urls = [r'http://cynhard.com/live/001',r'http://cynhard.com/live/002',
r'http://cynhard.com/live/003']
save_case_infos(urls)
>>>current count: 1
>>>current count: 2
>>>current count: 3
返回函式
def sum_late(*args):
def test():
ax=0
for n in args:
ax=ax+n
return ax
return test
test=sum_late(1,2,3,4)
print(test())
>>>10
閉包:內部對外部函式變數進行引用,且不是全域性作用域,內部函式稱為閉包
閉包引用迴圈
def count():
def f(j):
def g():
return j*j
return g
fs=[]
for i in range(1,4):
fs.append(f(i))
return fs
f1,f2,f3=count()
print(f1()) 1
print(f2()) 4
print(f3()) 9
遞迴函式+匿名函式+偏函式
1、遞迴函式
def fact(n):
if n==1:
return 1
return n*fact(n-1)
print('函式歸遞結果:',fact(5))
>>>函式歸遞結果: 120 (5*4*3*2*1=120)
2、匿名函式: lambda函式也叫匿名函式,即不使用def這樣的標準語句定義函式
def f(x):
return x**2
print(f(4))
>>>16
g = lambda x : x**2
print (g(4))
>>>16
def make_test(n):
return lambda x: x+n
f=make_test(2)
g=make_test(6)
print(f(42)) 44
print(g(46)) 52
3、偏函式(partial function): 偏應用函式是一個表示式,包含函式的部分引數。返回值是一個新函式
(1)例1:
from functools import partial
def mod(n,m):
return n%m
mod_by_100=partial(mod,100)
print(mod(100,7)) 2
print(mod_by_100(7)) 2
(2)例2:
from functools import partial
def test_partial(a, b, c, d):
print(a,b,c,d)
test1 = partial(test_partial,1,2)
test1(3,4)
>>>1,2,3,4
test2 =partial(test_partial,1,2,3,4)
test2(3)
>>>TypeError: test_partial() takes 4 positional arguments but 5 were given
test3 = partial(test_partial, d=4)
test3(1,2,3)
>>>1,2,3,4