溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3函數

發(fā)布時間:2020-07-28 20:58:07 來源:網絡 閱讀:452 作者:yhyang 欄目:編程語言

Python3 函數

  • 函數文字定義:函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段;函數能提高應用的模塊性,和代碼的重復利用率。

定義函數

函數的定義有以下規(guī)則:

  • 函數代碼塊以 def 關鍵詞開頭,后接函數標識符名稱和圓括號 ()。
  • 任何傳入參數和自變量必須放在圓括號之中,圓括號之中可以用于定義參數。
  • 函數內容以冒號起始,并且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當于返回 None。

定義語法

def 函數名(參數):
    函數體

示例

# 輸出hello world函數

def HelloWorld():
    print('Hello  world')

# 函數調用
HelloWorld()

幾種參數的用法

1、默認參數

在函數調用時,可以不傳送值的參數;或者說,有默認值的參數

  • 默認參數的值可以被覆蓋
  • 默認參數必須在參數列表的最后
  • 默認參數在函數里只分配一次
    -示例:
# 例1:

#!/usr/bin/python3

import random

def choose_num(s,e=10):
    num = random.randint(s,e)
    return num

choose_num(3)  # 調用時只傳了s,未傳e,e用的默認值
輸出 5

choose_num(1,50)  # 默認值被覆蓋
輸出 28

# 示例2,默認值必須在最后

#!/usr/bin/python3

def choose_num(s=10,e):  # 默認值放前邊,報錯了。
    num = random.randint(s,e)
    return num

choose_num(3)

報錯
File "<ipython-input-18-16c067f4bcb8>", line 1
    def choose_num(s=10,e):
                  ^
SyntaxError: non-default argument follows default argument

def choose_num(s, e=10, n=5): 
    numbers = []
    for x in range(n):
        num = random.randint(s,e)
        numbers.append(num)
    return numbers

choose_num(3)
輸出
[6, 7, 4, 3, 8]

# 示例3,默認值只分配一次

#!/usr/bin/python3

def f(a,L=[]):       # 由于默認值只在內存里分配一次,所以當此列表做默認值時,       
    L.append(a)  # 結果不管調用多少次,都是往已經分配好的列表中追加的
    return L        # 就是結果中的樣子。
                        # 而不是第一次返回 [1]  第二次返回[2]  第三次返回[3]
print(f(1))
print(f(2))
print(f(3))

輸出
[1]
[1, 2]
[1, 2, 3]
2、關鍵參數(k=v 方式給參數傳值)

示例代碼:

#!/usr/bin/python3

def car(color,price='10',user='yhyang'):
    print(f'{user}有一輛{color}色的車,價值{price}塊')

car('藍') # 其它的使用默認參數
car('紅','30','hmm') # 對應位置覆蓋
car(color='blue',price='100',) # k=v的方式給參數傳值,

輸出
yhyang有一輛藍色的車,價值10塊
hmm有一輛紅色的車,價值30塊
yhyang有一輛blue色的車,價值100塊
3、任意參數

*args , **kwargs 作參數,args->tuple,kwargs->dict
示例代碼:

#!/usr/bin/python3
def car(*args):     # 一個*號跟args,即 *args 可以成為一個元組
    print(args)     # 兩個*號跟kwargs 即 **kwargs  可以成為一個字典
    for k in args:  # 重點在于*號有幾個,不在于args kwargs的名稱
        print(k)

car("red",10,"yhyang")

輸出
('red', 10, 'yhyang')
red
10
yhyang

#!/usr/bin/python3
def car(**kw):  # 這種參數,在傳遞的時候需要傳遞 key=value的方式,才能按字典的方式存儲并打印
    for k,v in kw.items():
        print(f'{k}::{v}')

car(color='red',price=20,user='yhyang')
輸出
color::red
price::20
user::yhyang

#!/usr/bin/python3
def car(*args,**kw):  # 可以識別單個參數和key value參數
    print('args:',args)
    print('kw:',kw)
    for k in args:
        print(k)
    for k,v in kw.items():
        print(f'{k}::{v}')
car('adfsdf','t',color='red',price=20,user='yhyang') # 可以識別單個參數和key value參數
輸出
args: ('adfsdf', 't')
kw: {'color': 'red', 'price': 20, 'user': 'yhyang'}
adfsdf
t
color::red
price::20
user::yhyang
4、注意:直接傳字典名字的時候要加兩個*號

示例代碼:

#!/usr/bin/python3
kwargs = {'color':'red','price':30,}
def car(**kw):
    print(kw)
car(**kwargs)  #這里注意,傳字典名字的時候前面要加兩個*
輸出
{'color': 'red', 'price': 30}
5、下面這種寫法,* 參數可傳可不傳,但是price一定要傳,而且是以key value的方式來傳

示例代碼:

#!/usr/bin/python3
def car(color='blue',*,price): 
    print(color,price)

car(price=30)
輸出
blue 30

函數注釋與文檔說明(annotations,doc)

示例代碼:

#!/usr/bin/python3
def add(x,y):
    """Add x and y together."""  # 函數文檔說明,寫在函數定義的第一行,就可以用 
    return x+y                  # 函數名.__doc__來查看函數說明文檔
add.__doc__
輸出
'Add x and y together.'
  • 下邊例子中,x:int y:'這個參數隨便' 是對x 和y的說明 ;-> int 是對函數返回值的說明,在執(zhí)行過程中,會將這個說明忽略
  • doc 來獲取函數說明文檔,annotations來獲取函數參數及返回值
    示例代碼:
#!/usr/bin/python3
def add(x:int, y:'這個參數隨便')-> int:  
    """Add x and y together."""
    return x+y

add.__doc__
add.__annotations__   
輸出
'Add x and y together.'
{'x': int, 'y': '這個參數隨便', 'return': int}

函數變量的作用域

變量作用域,在自己屋干自己的事兒

  • 本地(局部)
  • 封閉
  • 全局
  • 內置
    示例代碼:
# 以下代碼會報錯

#!/usr/bin/python3
x = 1     # 全局
def add():
    x += 1  # 局部變量賦值錯誤,此處x沒有被聲明,所以不能被賦值,此處x不是全局的x
    print(x) 
add()

error_list = [2,3,5]
def big_list():
    error_list += [99]   # 此處是error_list = error_list + [99],需要先在函數內部聲明error_list,才不會報錯
    print(error_list)
big_list()

示例代碼:

#!/usr/bin/python3
error_list = [2,3,5]
def big_list():
    error_list.append(88) # 此處是在全局變量的基礎上追加,所以可以。
    print(error_list)
big_list()
輸出
[2, 3, 5, 88]

error_list = [2,3,5]
def big_list():
    error_list = []   # 事先聲明才能做下邊的 += 操作
    error_list += [99]   
    print(error_list)
big_list()
輸出
[99]

函數嵌套

函數是python里面的一級對象,可以用在任何地方,函數里的作用域屬于封閉作用域

  • 一級對象
  • 在運行時創(chuàng)建
  • 能賦值給變量或數據結構
  • 作為參數傳遞給函數
  • 能作為函數的返回結果
    示例代碼:
# 函數嵌套

#!/usr/bin/python3
def calc(x,y):
    def add(x,y):
        print('x+y:',x+y)
    def sub(x,y):
        print('x-y:',x-y)
    def mul(x,y):
        print('x*y:',x*y)

    add(x,y)  # 在函數內部直接執(zhí)行嵌套的函數
    sub(x,y)
calc(2,5)
輸出
x+y: 7
x-y: -3

# 返回值為函數本身

#!/usr/bin/python3
def calc(x,y):
    def add(x,y):
        print('x+y:',x+y)
    def sub(x,y):
        print('x-y:',x-y)
    def mul(x,y):
        print('x*y:',x*y)

    add(x,y)  # 在函數內部直接執(zhí)行嵌套的函數
    sub(x,y)

    return mul # 返回 mul函數本身,可以賦給變量
calc(3,5)
輸出
x+y: 8
x-y: -2
<function __main__.calc.<locals>.mul(x, y)>

c = calc(3,5)  # c 被賦值為mul函數
輸出
x+y: 8
x-y: -2

閉包

函數返回值為內部函數的名字,內部函數又處理外層函數變量;這個整體叫閉包
示例代碼:

# 閉包
#!/usr/bin//python3
def hello():
    s = 'yhyang'   # s變量在函數中是自由變量
    def say():
        print(s)
    return say    # 返回內部函數名,內部函數綁定了外層函數的變量
hello()
h = hello()
h()    # h 得到的值為say()函數,再次執(zhí)行,則會用到外層函數的變量s
輸出
<function __main__.hello.<locals>.say()>
yhyang

函數閉包,或者閉包函數,本質是一種函數,可以在函數運行以后,依然存在自由變量(或者說可用變量),可以對閉包的數據進行隱藏,避免使用全局變量
如上邊 hello中的變量 s一樣,在第一次執(zhí)行h = hello的時候,隱藏了s,此時s為自由變量,依然存在,可以繼續(xù)使用。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI