1. 程式人生 > >Python-可變引數和關鍵字引數(*args **kw)

Python-可變引數和關鍵字引數(*args **kw)

前言:

Python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。

可變引數和關鍵字引數的語法:

*args是可變引數,args接收的是一個tuple;

**kw是關鍵字引數,kw接收的是一個dict。

使用*args和**kw是Python的習慣寫法,當然也可以用其他引數名,但最好使用習慣用法。

一、可變引數*args

定義:可變引數就是傳入的引數個數是可變的,可以是0個,1個,2個,……很多個。
作用:就是可以一次給函式傳很多的引數
特徵:*args

我們以數學題為例子,給定一組數字a,b…z,請計算sum = a * a + b * b + .....+z * z

要定義出這個函式,我們必須確定輸入的引數。由於引數個數不確定,我們首先想到可以把a,b,…,z作為一個list或tuple傳進來,這樣,函式可以定義如下:

def cout(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

但是呼叫的時候,需要先組裝出一個list或tuple:
>>> cout([1, 2, 3])
14
>>> cout((1, 3, 5, 7))
84

如果利用可變引數,呼叫函式的方式可以簡化成這樣:
>>> cout(1, 2, 3)


14
>>> cout(1, 3, 5, 7)
84
所以,我們把函式的引數改為可變引數:

def cout(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

定義可變引數和定義一個list或tuple引數相比,僅僅在引數前面加了一個*號。在函式內部,引數numbers接收到的是一個tuple,因此,函式程式碼完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數:

>>> cout(1, 2)
5
>>> cout()


0
如果已經有一個list或者tuple,要呼叫一個可變引數怎麼辦?可以這樣做:
>>> nums = [1, 2, 3]
>>> cout(nums[0], nums[1], nums[2])
14
這種寫法當然是可行的,問題是太繁瑣,所以Python允許你在list或tuple前面加一個*號,把list或tuple的元素變成可變引數傳進去:

>>> nums = [1, 2, 3]
>>> calc(*nums)
14
*nums表示把nums這個list的所有元素作為可變引數傳進去。這種寫法相當有用,而且很常見。
----

二、關鍵字引數**kw

定義:關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict。在呼叫函式時,可以只傳入必選引數。
作用:擴充套件函式的功能
特徵:**kw

請看示例:

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

函式person除了必選引數name和age外,還接受關鍵字引數kw。在呼叫該函式時,可以只傳入必選引數:
>>> person('Michael', 30)
name: Michael age: 30 other: {}

也可以傳入任意個數的關鍵字引數:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}

>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

關鍵字引數有什麼用?它可以擴充套件函式的功能。比如,在person函式裡,我們保證能接收到name和age這兩個引數,但是,如果呼叫者願意提供更多的引數,我們也能收到。試想你正在做一個使用者註冊的功能,除了使用者名稱和年齡是必填項外,其他都是可選項,利用關鍵字引數來定義這個函式就能滿足註冊的需求。

和可變引數類似,也可以先組裝出一個dict,然後,把該dict轉換為關鍵字引數傳進去:

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

當然,上面複雜的呼叫可以用簡化的寫法:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

**extra表示把extra這個dict的所有key-value用關鍵字引數傳入到函式的**kw引數,kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函式外的extra。

以上,概念清晰了吧~~點贊吧❤️~~

相關推薦

Python-可變引數關鍵字引數(*args **kw)

前言: Python的函式具有非常靈活的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。 可變引數和關鍵字引數的語法: *args是可變引數,args接收的是一個tuple; **kw是關鍵字引數,kw接收的是一個dict。 使用*args和**kw是Python的習慣寫法,當然也可以用其他

python 可變引數關鍵字引數*args **kwargs

在Python函式中,還可以定義可變引數。顧名思義,可變引數就是傳入的引數個數是可變的,可以是1個、2個到任意個,還可以是0個。 *args可變引數 *args表示把args這個list或者tuple的所有元素作為可變引數傳進去。兩種傳遞方式如下: >&g

Python3 系列之 可變引數關鍵字引數

剛開始接觸 python 的時候,對 python 中的 *wargs (可變引數) 和 **kwargs (關鍵字引數)的理解不是很透徹,看了一下 《Explore Python》一書,裡面對這一部分的描述相對淺顯易懂, 這裡依據個人理解進行相關總結。 可變引數(*args) 對於可變引數可以

Python:函式:關鍵字引數誤區----正確答案:尋找函式申明中,可變引數(*args)後的引數(沒有可變引數*args,就沒有關鍵字引數

何為一般關鍵字引數? 在定義函式時,函式體形參列表中,可變引數(*args)後不帶預設值的引數,為呼叫函式時必須賦值的關鍵字引數,即一般的關鍵字引數。 經典誤區(例) 函式體 def getValue(position1, default1 = "預設", *

python函式的引數(預設引數可變引數關鍵字引數引數組合)

函式的引數 定義函式的時候,我們把引數的名字和位置確定下來,函式的介面定義就完成了。對於函式的呼叫者來說,只需要知道如何傳遞正確的引數,以及函式將返回什麼樣的值就夠了,函式內部的複雜邏輯被封裝起來,呼叫者無需瞭解。 Python的函式定義非常簡單,但靈活度卻

Python函式引數總結(位置引數、預設引數可變引數關鍵字引數命名關鍵字引數)

Python函式的引數多達5種,不像Java那樣引數只有一種,而是像C++那樣提供預設引數,除此之外,還提供可變引數、關鍵字引數、命名關鍵字引數,這樣就使得Python函式的引數變得十分複雜。但複雜意味著靈活便捷,Python語言之所以流行起來,與起本身巨大

Python 3.X | 一文看懂不懵圈:位置引數(必選引數)、預設引數可變引數關鍵字引數、形參、實參...

Win 10+Python 3.6.3 不管是什麼引數,它們身處環境是:函式(function)。引數讓函式如虎添翼,靈活、強大。 1、概念釋義: def func(x, y=2, *arg, *, z, **kwargs): #print(x, y) #print(len(ar

Python的位置引數、預設引數關鍵字引數可變引數

普通引數 (位置引數) 定義的時候直接定義變數名,呼叫的時候直接把變數或者值放入指定的位置 呼叫的時候,具體參考的是位置,按位置賦值 語法: def 函式名 (引數1,引數2,……)

python的位置引數、預設引數關鍵字引數可變引數區別

一、位置引數 呼叫函式時根據函式定義的引數位置來傳遞引數。 #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_dict = {1: u'先生', 2: u'女士'}

Python中位置引數、預設引數可變引數、命名關鍵字引數關鍵字引數的區別

Python中必選引數、預設引數、可變引數、命名關鍵字引數、關鍵字引數的區別: Num01–>必選引數(亦即位置引數): 定義:就是在給函式傳引數時,按照順序,依次傳值。 先寫一個下面的函式: def power(m, n): result=1

python--函式(必選引數、預設引數可變引數關鍵字引數

# -*-encoding:utf-8 -*- #name = raw_input("please input your name:") #print "Hello", name """ 小結: Python的函式具有非常靈活的引數形態,即可以實現簡單的呼叫,又可以傳入非常

[Python筆記]函式中關鍵字引數,收集引數與分配引數的使用例項

Stock類 class Stock: def __init__(self): self.itemList = [] def addItem(self, name, price): # 建立商品 return {'name': name

Python 回撥引數繫結

函式引數的繫結和呼叫方式 這裡想討論的問題是,如果把python的方法作為引數傳遞給其他物件呼叫,那麼相應的python例項是如何繫結的? class C: def callback(self): print('callback') @staticmetho

python中函式中的實參形參以及預設引數收集引數

一.實參和形參 例項:>>> def MyFirstFunction(name):                    ”函式定義過程中的hame是叫形參“ &nb

Python學習手冊之 Python 之禪、 Python 程式設計規範函式引數

在上一篇文章中,我們介紹了 Python 的的正則表示式使用示例,現在我們介紹 Python 之禪、 Python 程式設計規範和函式引數。檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/10040430.html Python 之禪讓程式能夠正確執行只是成為一個優

函式引數(預設引數可變引數關鍵字引數

原文地址:https://www.cnblogs.com/mingshengling/p/7842826.html 1、預設引數 預設引數降低了函式呼叫的難度,而一旦需要更復雜的呼叫時,又可以傳遞更多的引數來實現。無論是簡單呼叫還是複雜呼叫,函式只需要定義一個。 有多個預設引數時,呼叫的時候,

7、Python_函式引數可變引數關鍵字引數

1、可變引數: 定義-》 def fun(name,sex,*c)     pass 呼叫-》fun(jack,male,16,helloworld) 可以傳多個引數   把list或tuple傳入: list=['jackpeng','

python 函式引數(必選引數、預設引數、可選引數關鍵字引數)

參考: ######################################################## 函式引數:必選引數、預設引數、可選引數、關鍵字引數 ##############################################

python 預設引數關鍵字引數

如下函式定義 def hello(name, age=10, gender='F'):     print 'User Info:'    print 'name is %s' % name    print 'age is %d' % age    print

python進階學習筆記(三)——實現python任意個數的關鍵字引數

class Person(object): def __init__(self, name, gender, birth, **kw): self.name = name self.gender = gender self.birth = birth