1. 程式人生 > >函數知識點整理

函數知識點整理

pos 空格 並且 括號 固定 nbsp 很多 裝飾器 缺省

定義函數的規則:

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()

函數知識點整理