Python中的默认参数
Python允许函数参数具有默认值。如果在没有参数的情况下调用函数,则参数将获得其默认值。
默认参数:
Python有不同的方式来表示函数参数的语法和默认值。默认值表示如果在函数调用期间没有传递参数值,则函数参数将采用该值。默认值是通过使用keywordname =value 形式的assignment(=)运算符来分配的。
让我们通过一个函数student来理解这一点。函数student包含 3 个参数,其中 2 个参数分配有默认值。因此,函数student接受一个必需参数( firstname ),其余两个参数是可选的。
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
# 1 positional argument
student('John')
# 3 positional arguments
student('John', 'Gates', 'Seventh')
# 2 positional arguments
student('John', 'Gates')
student('John', 'Seventh')
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
# 1 keyword argument
student(firstname ='John')
# 2 keyword arguments
student(firstname ='John', standard ='Seventh')
# 2 keyword arguments
student(lastname ='Gates', firstname ='John')
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
# required argument missing
student()
# non keyword argument after a keyword argument
student(firstname ='John', 'Seventh')
# unknown keyword argument
student(subject ='Maths')
Python3
# mutable default argument values example using python list
# itemName is the name of the item that we want to add to list
# that is being passed, or if it is not passed then appending in
# the default list
def appendItem(itemName, itemList = []):
itemList.append(itemName)
return itemList
print(appendItem('notebook'))
print(appendItem('pencil'))
print(appendItem('eraser'))
Python3
# mutable default argument values example using python dictionary
# itemName is the name of item and quantity is the number of such
# items are there
def addItemToDictionary(itemName, quantity, itemList = {}):
itemList[itemName] = quantity
return itemList
print(addItemToDictionary('notebook', 4))
print(addItemToDictionary('pencil', 1))
print(addItemToDictionary('eraser', 1))
Python3
# using None as values of the default arguments
print('#list')
def appendItem(itemName, itemList=None):
if itemList == None:
itemList = []
itemList.append(itemName)
return itemList
print(appendItem('notebook'))
print(appendItem('pencil'))
print(appendItem('eraser'))
# using None as value of default parameter
print('\n\n#dictionary')
def addItemToDictionary(itemName, quantity, itemList = None):
if itemList == None:
itemList = {}
itemList[itemName] = quantity
return itemList
print(addItemToDictionary('notebook', 4))
print(addItemToDictionary('pencil', 1))
print(addItemToDictionary('eraser', 1))
我们在调用函数时需要牢记以下几点:
- 在传递关键字参数的情况下,参数的顺序很重要。
- 一个参数应该只有一个值。
- 传递的关键字名称应与实际的关键字名称匹配。
- 在调用包含非关键字参数的函数时,顺序很重要。
示例 #1:调用没有关键字参数的函数
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
# 1 positional argument
student('John')
# 3 positional arguments
student('John', 'Gates', 'Seventh')
# 2 positional arguments
student('John', 'Gates')
student('John', 'Seventh')
输出:
John Mark studies in Fifth Standard
John Gates studies in Seventh Standard
John Gates studies in Fifth Standard
John Seventh studies in Fifth Standard
在第一次调用中,只有一个必需参数,其余参数使用默认值。在第二次调用中,姓氏和标准参数值从默认值替换为新的传递值。我们可以从函数的第 2 次、第 3 次和第 4 次调用中看到函数的顺序很重要。示例 #2:使用关键字参数调用函数
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
# 1 keyword argument
student(firstname ='John')
# 2 keyword arguments
student(firstname ='John', standard ='Seventh')
# 2 keyword arguments
student(lastname ='Gates', firstname ='John')
输出:
John Mark studies in Fifth Standard
John Mark studies in Seventh Standard
John Gates studies in Fifth Standard
在第一次调用中,只有一个必需的关键字参数。在第二个调用中,一个是必需参数,一个是可选(标准),其值从默认值替换为新的传递值。在第三次调用中,我们可以看到关键字参数中的顺序并不重要。示例 #3:一些无效的函数调用
Python3
def student(firstname, lastname ='Mark', standard ='Fifth'):
print(firstname, lastname, 'studies in', standard, 'Standard')
# required argument missing
student()
# non keyword argument after a keyword argument
student(firstname ='John', 'Seventh')
# unknown keyword argument
student(subject ='Maths')
上面的代码会抛出错误,因为:
- 在第一次调用中,没有为参数firstname传递值,这是必需的参数。
- 在第二次调用中,在关键字参数之后有一个非关键字参数。
- 在第三次调用中,传递的关键字参数与实际的关键字名称参数不匹配。
在Python中使用可变对象作为默认参数值
这必须非常小心地完成。原因是参数的默认值仅在控件到达函数时评估一次
第一次定义。之后,在后续函数调用中引用相同的值(或可变对象)。
有了这个例子,事情会更清楚
Python3
# mutable default argument values example using python list
# itemName is the name of the item that we want to add to list
# that is being passed, or if it is not passed then appending in
# the default list
def appendItem(itemName, itemList = []):
itemList.append(itemName)
return itemList
print(appendItem('notebook'))
print(appendItem('pencil'))
print(appendItem('eraser'))
['notebook']
['notebook', 'pencil']
['notebook', 'pencil', 'eraser']
如果您假设在我们不向其传递列表时在每个函数调用中创建一个新列表,您所期望的
[‘notebook’]
[‘pencil’]
[‘eraser’]
但是正如您在每次调用函数时程序的实际输出中所看到的那样,使用相同的列表,在新调用时不会创建新列表。
使用字典的示例
Python3
# mutable default argument values example using python dictionary
# itemName is the name of item and quantity is the number of such
# items are there
def addItemToDictionary(itemName, quantity, itemList = {}):
itemList[itemName] = quantity
return itemList
print(addItemToDictionary('notebook', 4))
print(addItemToDictionary('pencil', 1))
print(addItemToDictionary('eraser', 1))
{'notebook': 4}
{'notebook': 4, 'pencil': 1}
{'notebook': 4, 'pencil': 1, 'eraser': 1}
如果您假设在每个函数调用中创建一个新字典,您所期望的
{‘notebook’: 4}
{‘pencil’: 1}
{‘eraser’: 1}
但是你可以清楚地看到程序的实际输出是不同的,它表明在每个后续调用中使用了相同的字典。
这里的关键点是我们应该避免这种情况。
最佳实践
将默认值分配为 none,然后检查预期的列表或字典参数是否为 none 的函数。
如果没有,则根据您的要求为其分配列表或字典。
Python3
# using None as values of the default arguments
print('#list')
def appendItem(itemName, itemList=None):
if itemList == None:
itemList = []
itemList.append(itemName)
return itemList
print(appendItem('notebook'))
print(appendItem('pencil'))
print(appendItem('eraser'))
# using None as value of default parameter
print('\n\n#dictionary')
def addItemToDictionary(itemName, quantity, itemList = None):
if itemList == None:
itemList = {}
itemList[itemName] = quantity
return itemList
print(addItemToDictionary('notebook', 4))
print(addItemToDictionary('pencil', 1))
print(addItemToDictionary('eraser', 1))
#list
['notebook']
['pencil']
['eraser']
#dictionary
{'notebook': 4}
{'pencil': 1}
{'eraser': 1}
在这里您可以清楚地看到,每次调用函数并且列表或字典没有作为参数传递给函数时,它都会创建一个新的列表或字典。