函數知識點整理
定義函數的規則:
1.定義:def 關鍵詞開頭,空格之後接函數名稱和圓括號()。
2.參數:圓括號用來接收參數。若傳入多個參數,參數之間用逗號分割。
參數可以定義多個,也可以不定義。
參數有很多種,如果涉及到多種參數的定義,應始終遵循位置參數、*args、默認參數、**kwargs順序定義。
如上述定義過程中某參數類型缺省,其他參數依舊遵循上述排序
3.註釋:函數的第一行語句應該添加註釋。
4.函數體:函數內容以冒號起始,並且縮進。
5.返回值:return [表達式] 結束函數。不帶表達式的return相當於返回 None
def 函數名(參數1,參數2,*args,默認參數,**kwargs):
"""註釋:函數功能和參數說明"""
函數體
……
return 返回值
調用函數的規則:
1.函數名()
函數名後面+圓括號就是函數的調用。
2.參數:
圓括號用來接收參數。
若傳入多個參數:
應按先位置傳值,再按關鍵字傳值
具體的傳入順序應按照函數定義的參數情況而定
3.返回值
如果函數有返回值,還應該定義“變量”接收返回值
如果返回值有多個,也可以用多個變量來接收,變量數應和返回值數目一致
無返回值的情況:
函數名()
有返回值的情況:
變量 = 函數名()
多個變量接收多返回值:
變量1,變量2,... = 函數名()
命名空間:
一共有三種命名空間從大範圍到小範圍的順序:內置命名空間、全局命名空間、局部命名空間
作用域(包括函數的作用域鏈):
小範圍的可以用大範圍的
但是大範圍的不能用小範圍的
範圍從大到小(圖)
在小範圍內,如果要用一個變量,是當前這個小範圍有的,就用自己的
如果在小範圍內沒有,就用上一級的,上一級沒有就用上上一級的,以此類推。
如果都沒有,報錯
函數的嵌套:
嵌套調用
嵌套定義:定義在內部的函數無法直接在全局被調用
函數名的本質:
就是一個變量,保存了函數所在的內存地址
閉包:
內部函數包含對外部作用域而非全劇作用域名字的引用,該內部函數稱為閉包函數
裝飾器:
裝飾器的本質:一個閉包函數
裝飾器的功能:在不修改原函數及其調用方式的情況下對原函數功能進行擴展
語法糖: @裝飾器函數名
原則: 開放封閉原則
開放 : 對擴展是開放的
封閉 : 對修改是封閉的
裝飾器的主要功能和裝飾器的固定結構
裝飾器的主要功能:
在不改變函數調用方式的基礎上在函數的前、後添加功能。
裝飾器的固定格式:
def timer(func): def inner(*args,**kwargs): ‘‘‘執行函數之前要做的‘‘‘ re = func(*args,**kwargs) ‘‘‘執行函數之後要做的‘‘‘ return re return inner
from functools import wraps
def deco(func):
@wraps(func) #加在最內層函數正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
帶參數的裝飾器
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag: print(‘‘‘執行函數之前要做的‘‘‘)
re = func(*args,**kwargs)
if flag:
print(‘‘‘執行函數之後要做的‘‘‘)
return re
return inner
return timer
@outer(False)
def func():
print(111)
func()
多個裝飾器裝飾同一個函數
def wrapper1(func):
def inner():
print(‘wrapper1 ,before func‘)
func()
print(‘wrapper1 ,after func‘)
return inner
def wrapper2(func):
def inner():
print(‘wrapper2 ,before func‘)
func()
print(‘wrapper2 ,after func‘)
return inner
@wrapper2
@wrapper1
def f():
print(‘in f‘)
f()
函數知識點整理