python函数默认参数
『壹』 python中定义函数默认参数值的使用注意事项
4.7.1. 默认参数值
最常用的一种形式是为一个或多个参数指定默认值。这会创建一个可以使用比定义是允许的参数更少的参数调用的函数,例如:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise OSError('uncooperative user')
print(complaint)
这个函数可以通过几种不同的方式调用:
只给出必要的参数:
ask_ok('Do you really want to quit?')
给出一个可选的参数:
ask_ok('OK to overwrite the file?', 2)
或者给出所有的参数:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
这个例子还介绍了 in 关键字。它测定序列中是否包含某个确定的值。
默认值在函数 定义 作用域被解析,如下所示:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
将会输出 5。
重要警告: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
这将输出:
[1]
[1, 2]
[1, 2, 3]
如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
『贰』 python 默认参数在函数定义的时候已经求值了
#有默认参数
#定义默认参数 age = 1, gender = 'M'
def person( name, age = 1, gender='M'):
print 'name: %s age: %d gender: %s' % (name, age, gender)
#这里只传一个值给第一个参数which is name, age 和 gender已经有默认值,
#就算不传新值给 age or gender也没问题
person('Jacky')
#output --> name: Jacky age: 1 gender: M
#没有默认参数
def person(name, age, gender):
print 'name: %s age: %d gender: %s' % (name, age, gender)
# person('Jacky') <-- error, 3个参数只传了一个值
#没有默认参数,就一定要传 N(total 参数) 个值给 function.
person('Jacky', 19, 'M')
******************************************************
#关键字参数
#用上面第一个例子 person( name, age=1, gender='M')
#用关键字给function传值时,不虽要跟著顺序来也没问题
#就算 age 和 name 顺序不同, 但因为是用关键字来传值,所以没问题
person( age=18, name='Jacky')
#output --> name: Jacky age: 18 gender: 'M'
person( gender='F', age=17, name='Ashley')
#output --> name: Ashley age: 17 gender: 'F'
# Error, 没用关键字去传值
# person( 20, 'M', 'Jacky') <-- 没用关键字时,一定要按顺序去传值
i tried to explain as clear as i can.xP
『叁』 关于python函数的默认参数,是只被设置一次,还是每次调用都被设置
如果是可变对象,只被设置一次
如果是不可变对象,每次都分配一个新的对象
『肆』 python 如何查看自带函数的默认参数
按住 control 键,点击 linspace ,走你,就可以看到函数具体都需要哪些参数了
『伍』 python 为什么默认参数不能放在必选参数前面
简单来讲就是会产生歧义。
不妨想一想,如果确实如你所说,有默认值的参数位于无默认值之前,则调用函数时就必须使用key=Value的形式,而不能使用直接送入Value的形式了。为了调用函数时可以更便捷地使用后者,而同时又不产生歧义,在定义函数时,无默认值参数就必须位于前面了。考虑到定义函数只要一次,调用函数可能是很多地方、很多人使用,定义函数时稍微注意点是可以理解的了。
『陆』 Python函数里的默认参数和关键字参数有什么区别
#有默认参数
#定义默认参数
age
=
1,
gender
=
'm'
def
person(
name,
age
=
1,
gender='m'):
print
'name:
%s
age:
%d
gender:
%s'
%
(name,
age,
gender)
#这里只传一个值给第一个参数which
is
name,
age
和
gender已经有默认值,
#就算不传新值给
age
or
gender也没问题
person('jacky')
#output
-->
name:
jacky
age:
1
gender:
m
#没有默认参数
def
person(name,
age,
gender):
print
'name:
%s
age:
%d
gender:
%s'
%
(name,
age,
gender)
#
person('jacky')
<--
error,
3个参数只传了一个值
#没有默认参数,就一定要传
n(total
参数)
个值给
function.
person('jacky',
19,
'm')
******************************************************
#关键字参数
#用上面第一个例子
person(
name,
age=1,
gender='m')
#用关键字给function传值时,不虽要跟著顺序来也没问题
#就算
age
和
name
顺序不同,
但因为是用关键字来传值,所以没问题
person(
age=18,
name='jacky')
#output
-->
name:
jacky
age:
18
gender:
'm'
person(
gender='f',
age=17,
name='ashley')
#output
-->
name:
ashley
age:
17
gender:
'f'
#
error,
没用关键字去传值
#
person(
20,
'm',
'jacky')
<--
没用关键字时,一定要按顺序去传值
i
tried
to
explain
as
clear
as
i
can....xp
『柒』 PYthon关于使用函数默认参数的问题
你先要把默认值用变量接收。
然后再判断input的内容是不是空字符“”,如果是,就使用前面接收的默认值。
『捌』 在PYTHON中,如果一个函数的参数已经有默认值,如何才能知道调用该函数时是否传
有默认值的参数,在调用时,如果该参数的实参与默认值相同,可以不传。
『玖』 关于python带默认值的参数只能放在后面的问题
第一个那个*x是*args的意思,就是任意个参数,C++里的 va_arg,...符号这种,python函数里可以有*args和**kwargs。
*args之后可专以随便放有默认值的和没有默认值的。
因为这之后的任何东西都得用”y=1“”z=1“这种来赋值。
比如说第一个函数,def fun(*x, y=4, z),我写fun(1,2,3,4,5),这五个数全跑到*x里了。我想给y和z赋值必须要写fun(1,2,3,4,5,y=6,z=7)。相当于z跟有默认值的那种也差不多了。所以规定可以把z放在*x后面的任何位置,包括y=4后面,它们的位置关系已经没有用了。
规定def fun(x=4, y) y必须放在x前,就是要保留这种位置关系,要不我写fun(1),你说这个1是给x的还是y的?就有了歧义。所以必须要有正确的位置关系。但是*x后面所有东西都是用参数名赋值的,属位置关系不起作用了,所以可以任意顺序了。
要理解规定背后的原因。同理,**kwargs放在最后,也是这个原因。消除歧义性。
『拾』 python 函数参数没有默认值怎么表示
没有默认值,你不设置就是了,如:
def GetLibraryGroup(name, groupKey='month', orderBy = ’name’):
上面的函数定义中,name没有给默认值,其余的都给了,调用时,相应的参数如果你不给值,那么函数会以默认值来运行,比如
GetLibraryGroup('filetable'),这个调用没有给groupKey,orderBy 两个参数,但是函数定义时,给了默认的值,就相当于GetLibraryGroup('filetable','month',,’name’)了,当然如果你调用时给默认的参数赋了其他值,那么以你的调用为准,如
GetLibraryGroup('filetable','year',,’createTime’),这个调用groupKey,orderBy两个参数就会是你调用时给的'year',,’createTime’。