-
2020-04-12 22:06:34
目录
Python函数的参数非常灵活:
- 形参(函数定义时):普通参数(位置参数)、默认参数、可变参数(可变位置参数,可变关键字参数)、命名关键字参数;
- 实参(调用函数时):位置参数,关键字参数;
不同类型的参数,定义时顺序很重要(必须按以下顺序给出不同类型参数):
def func(positional_args, keyword_args, *tuple_grp_args, **dict_kw_args): # ...
可变参数
可变位置参数
定义参数时前面加一个星号
*
,表示这个参数是可变的,可以接受任意多个参数,这些参数构成一个元组(只能通过位置参数传递)。传递参数时,可迭代对象(元组、列表)可通过在前面加一个星号
*
,解构成位置参数(依次把元素传递给函数)。def calcSum(*numbers): sum = 0 for n in numbers: sum += n return sum print(calcSum()) print(calcSum(1,2,3)) print(calcSum(*(1,2,3))) print(calcSum(*[1,2,3]))
可变关键字参数
定义参数时前面加两个星号
**
,表示这个参数为可变关键字参数,可以接受任意多个参数,这些参数构成一个字典,只能通过关键字参数传递。传递参数时,字典对象(Key必须为str类型)可通过在前面加两个星号
**
,解构为关键字参数。def add(a,b): return a+b data = {'a':3,'b':4} print(add(**data)) #关键字参数解构
混合使用
当可变位置参数和可变关键字参数一起使用时候,可变位置参数必须在前。
def fn(x,y,*args,**kwargs): print(x) # 1 print(y) # 2 print(args) # (3,4,5) print(kwargs) # {'a':6, 'b':7} fn(1,2,3,4,5,a=6,b=7)
强制关键字参数
关键字参数能够使函数调用意图更加明确;对于容易混淆参数的函数,可以声明只能以关键字形式给出的参数(特殊参数
*
以后的参数,都是强制关键字参数)。# key与value参数只能以关键字参数方式给出 def keyParam(one, *, key, value='v'): print(one, key, value) if __name__=="__main__": keyParam(1, key='one') keyParam(1, key='one', value='one-1')
默认参数
参数的默认值,会在每个模块加载时(很多模块会在程序启动时加载)求出;模块一旦加载,参数的默认值就固定不变了;而且所有使用默认参数的函数都共享此默认值,若默认值为动态值(如字典、列表等),会产生奇怪的行为(任何一个函数对其的修改,都会影响其他函数)。
def logMsg(msg:str, when=datetime.datetime.now()): print(when, msg) def logMsg2(msg:str, when=None): when = when if when else datetime.datetime.now() print(when, msg) if __name__=="__main__": logMsg('one-befor') logMsg2('two-befor') print('wait one second') time.sleep(1) logMsg('one-after') logMsg2('two-after') # one-befor与one-after的时间是相同的,都是模块加载时的时间
注意:若参数默认类型是可变类型,一定用None作为默认值,然后在代码中设定所需的默认值。如下所示,getCode调用会不断累加默认值(作为默认值的列表,会不断的追加内容):
def getCode(msg:str, code:list=[]): code.append(msg) print(code) def getCode2(msg:str, code:list=None): if code is None: code = [] code.append(msg) print(code if __name__=="__main__": getCode('one') # ['one'] getCode2('one') # ['one'] getCode('two') # ['one', 'two'] getCode2('two') # ['two']
更多相关内容 -
Python函数默认参数常见问题及解决方案
2020-12-20 10:10:45python为了简化函数的调用,提供了默认参数机制: 这样在调用pow函数时,就可以省略最后一个参数不写: 在定义有默认参数的函数时,需要注意以下: 必选参数必须在前面,默认参数在后; 设置何种参数为默认参数?... -
python 函数中的参数类型
2021-01-20 01:58:37初学者遇到这个多少都有点懵逼,今天我们来把Python中的函数参数进行分析和总结。 2.Python 中的函数参数 在Python中定义函数参数有5种类型,我们来一一演示它们。 2.1必选参数 必须参数是最基本的参数类型,当你在... -
Python函数参数操作详解
2020-12-25 00:16:30本文实例讲述了Python函数参数操作。分享给大家供大家参考,具体如下: 简述 在 Python 中,函数的定义非常简单,满足对应的语法格式要求即可。对于调用者来说,只需关注如何传递正确的参数,以及获取相应的返回值就... -
python函数教程:python 默认参数问题的陷阱
2020-12-22 05:21:36python 里面一个常见的陷阱就是函数的默认参数问题。如下: def func(mylist = []): mylist.append(1) return mylist 以下的执行结果如下: print func() print func() print func() print func(['a']) print func... -
python 函数参数(必选参数、默认参数、可选参数、关键字参数)
2018-07-11 13:25:06http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738449338c8a122a7f2e047899fc162f4a7205ea3000########################################################函数参数:...参考:
########################################################
函数参数:必选参数、默认参数、可选参数、关键字参数
########################################################
默认参数:放在必选参数之后
计算x平方的函数:
-
def power(x):
-
return x*x
power(5)
计算x的立方
-
def power(x):
-
return x*x*x
这样的话每次计算不同幂函数都要重写函数,非常麻烦,可使用以下代码计算:
-
def power(x, n):
-
s= 1
-
while n> 0:
-
n=n -1
-
s=s*x
-
return s
使用修改后的power函数,可以计算任意n次方
不过每次调用函数必须输入两个参数,使用默认参数可以进一步简化函数:
-
def power(x, n=2):
-
s= 1
-
while n> 0
-
n=n -1
-
s=s*x
-
return s
设置默认参数时注意事项:必选参数在前,默认参数在后
默认参数最大好处:降低调用函数的难度
学生注册,需要传入name和gender:
-
def enroll(name, gender):
-
print 'name :',name
-
print 'gender :',gender
如果继续传入年龄、城市等信息咋么办,这会使得调用函数的复杂度大大增加:把年龄、城市设为默认参数可以简化函数:
-
def enroll(name, gender, age=6, city='Beijing'):
-
print 'name :',name
-
print 'gender :',gender
-
print 'age :',age
-
print 'city :',city
有多个默认参数化时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('zj', 'M', 8);也可以不按顺序提供部分默认参数,如enroll('Ad', 'a', city='dad')
默认参数也有缺陷的地方:
-
def add_end(L=[]):
-
L.append( 'END')
-
return L
原因:函数在定义时,默认参数L所制定的地址已经确定,而L是一个list,所以每次调用该函数时,如果改变了L的内容,则下次调用时,默认参数的内容就会改变
note: 默认参数必须指向不变对象!!!
如上代码可使用None实现:
-
def add_end(L=None):
-
if L is None:
-
L=[]
-
L.append( 'END')
-
return L
##################################################################
可变参数:就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个
在参数前面加上*就是可变参数。在函数内部,参数numbers接收得到的是一个tuple,调用该函数时,可以传入任意个参数,包括0个参数:
-
def calc(*numbers):
-
sum= 0
-
for n in numbers:
-
sum= sum+n*n
-
return sum
如何调用一个list或者tuple,可以如上所示,在list或tuple前面加上一个*号,把list或tuple的元素变成可变参数传进去
####################################################################
关键字参数
允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict
使用**表示关键字参数
函数person不仅可以只传入必选参数,也可以传入任意个数的关键字参数
也可以类似可变参数,先组装一个dict,然后,把该dict转换为关键字参数传进去:
-
kw={ 'city': 'Beijing', 'job': 'Engineer'}
-
person( 'Jack', 24, city=kw[ 'city'], job=kw[ 'job'])
-
person( 'Jack' , 24, **kw)
#############################################################
参数组合
参数定义的顺序:必选参数、默认参数、可变参数和关键字参数
#######################################################
in summary:
默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict
-
-
Python函数默认参数设置(超级详细)
2022-03-25 12:05:40Python函数默认参数设置(超级详细) 我们知道,在调用函数时如果不指定某个参数,Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。这样...Python函数默认参数设置(超级详细)
我们知道,在调用函数时如果不指定某个参数,Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。这样的话,即便调用函数时没有给拥有默认值的形参传递参数,该参数可以直接使用定义函数时设置的默认值。
Python 定义带有默认值参数的函数,其语法格式如下:
def 函数名(...,形参名,形参名=默认值): 代码块
注意,在使用此格式定义函数时,指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
下面程序演示了如何定义和调用有默认参数的函数:
#str1没有默认参数,str2有默认参数 def dis_str(str1,str2 = "http://www.456.com/"): print("str1:",str1) print("str2:",str2) dis_str("http://www.123.com/") dis_str("http://www.123.com/","http://www.789.com/")
运行结果为:
str1: http://www.123.com/ str2: http://www.456.com/ str1: http://www.123.com/ str2: http://www.789.com/
上面程序中,dis_str() 函数有 2 个参数,其中第 2 个设有默认参数。这意味着,在调用 dis_str() 函数时,我们可以仅传入 1 个参数,此时该参数会传给 str1 参数,而 str2 会使用默认的参数,如程序中第 6 行代码所示。
当然在调用 dis_str() 函数时,也可以给所有的参数传值(如第 7 行代码所示),这时即便 str2 有默认值,它也会优先使用传递给它的新值。
同时,结合关键字参数,以下 3 种调用 dis_str() 函数的方式也是可以的:
dis_str(str1 = "http://www.123.com/") dis_str("http://www.123.com/",str2 = "http://www.123.com/") dis_str(str1 = "http://www.123.com/",str2 = "http://www.123.com/")
再次强调,当定义一个有默认值参数的函数时,有默认值的参数必须位于所有没默认值参数的后面。因此,下面例子中定义的函数是不正确的:
#语法错误 def dis_str(str1="http://www.123.com/",str2,str3): pass
显然,str1 设有默认值,而 str2 和 str3 没有默认值,因此 str1 必须位于 str2 和 str3 之后。
有读者可能会问,对于自己自定义的函数,可以轻易知道哪个参数有默认值,但如果使用 Python 提供的内置函数,又或者其它第三方提供的函数,怎么知道哪些参数有默认值呢?
Pyhton 中,可以使用“函数名.defaults”查看函数的默认值参数的当前值,其返回值是一个元组。以本节中的 dis_str() 函数为例,在其基础上,执行如下代码:
print(dis_str.__defaults__)
程序执行结果为:
('http://www.123.com/',)
-
python函数参数之必选参数,默认参数,可变参数,关键字参数
2018-05-22 20:33:32Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数, 1 默认参数 定义形式:def calc(para1,para2=None):其中para2是默认参数。 意义:可变...Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,
1 默认参数
- 定义形式:
def calc(para1,para2=None):
其中para2是默认参数。 - 意义:可变参数就是传入的参数个数是可变的。可以是1个、2个到任意个,还可以是0个。
设置默认参数需要注意的点:
- 必选参数在前,默认参数在后;否则不知道你传进的值是给谁,引起歧义,Python的解释器会报错。
- 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
- 默认参数的好处:降低调用函数的难度
- 定义默认参数要牢记一点:默认参数必须指向不变对象!,因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。例如,做如下定义:
#功能:对输入的列表的最后加一个‘'END'’ #这里默认参数L指向的可变对象[]; def add_end(L=[]): #正确的做法应该是L= None L.append('END') return L add_end([1,2])#使用普通调用,不会出错 add_end() add_end()#连续使用两次默认参数调用时,结果出错 Out[9]: ['END', 'END']
2 可变参数
- 定义形式:
def calc(*numbers):
- 意义:可变参数就是传入的参数个数是可变的。并用numbers元组接收。在调用calc函数时,括号里的参数任意个,还可以是0个。
例子:
1. 给定一组数字a,b,c,……(个数任意)
写calc()函数,计算 a + b + c + …
def calc(*numbers): print(type(numbers)) #numbers为tuple类型 return sum(numbers) calc(1,2) #calc内参数可以设置任意个 #实质:numbers接收这任意个实值并变成tuple <class 'tuple'> Out[3]: 3
3 关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
- 定义形式:可以传入0或任意个数的关键字参数
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) person('Adam', 45, gender='M', job='Engineer') OUTPUT: name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'} 另一种调用方法: extra = {'city': 'Beijing', 'job': 'Engineer'} person('Jack', 24, **extra)#注意是**extra **extra表示把extra这个dict的所有key-value 用关键字参数传入到函数的**kw参数,kw将获得 extra的一份拷贝,对kw的改动不会影响到函数外的extra
4 命名关键字参数
定义一个函数后,在调用时如果需要对关键字参数的名字进行限制,可以使用以下定义。
def person(name, age, *, city, job): print(name, age, city, job)
和关键字参数*kw不同,命名关键字参数需要一个特殊分隔符,*后面的参数被视为命名关键字参数
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def person(name, age, *args, city, job): print(name, age, args, city, job) 由于位置参数只能定义在可变参数前面,所以,city,job视为命名 关键字参数,这说明在调用的时候应该采用city,job对对传入对对象 进行限定,否则会报错 >>> person('Jack', 24, 'Beijing', 'Engineer') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: person() takes 2 positional arguments but 4 were given
5 参数组合
在Python中,请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。(越来越复杂的顺序)
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) >>> args = (1, 2, 3, 4) >>> kw = {'d': 99, 'x': '#'} >>> f1(*args, **kw) # 注意,定义一个tuple和一个dict,可以使用以上对f1函数
- 定义形式:
-
Python函数参数中的None与默认值
2019-05-10 11:02:31def foo1(x, item=[]): item.append(x) return item def foo2(x, item=None): if item is None: item = [] item.append(x) return item print(foo1(1)) print(foo2(2)) item = [] p... -
深入讲解Python函数中参数的使用及默认参数的陷阱
2020-09-21 17:45:31主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数、默认参数、可变参数和关键字参数来讲,要的朋友可以参考下 -
python函数参数的默认参数、元组参数和字典参数例解
2019-01-30 10:54:33python函数除了不带参数,带固定参数之外,还有另外三类函数参数有重要使用价值,是提升python水平需要强化的内容。它们是默认参数、元组参数和字典参数。下面举例子说明。 1.默认参数 即在函数定义时赋值的参数。... -
Python函数参数的几种类型
2020-06-07 15:51:11函数调用时,实参默认按照位置顺序传递,需要个数的和形参匹配,按位置传递 的参数,称为:“位置参数”。 例子: def one(a,b,c): print(a,b,c) one(1,2,3) one(1,2) #这里报错,位置参数不匹配 返回值: &... -
[python]函数默认参数顺序问题
2020-11-20 22:01:311、python2、python3 三者顺序是:位置参数、默认参数、*argsdef foo(x,y=1,*args):passfoo (1,2,3,4,5) // 其中的x为1,y=1的值被2替换,3,4,5都给args,即args=(3,4,5)2、python3 三者顺序是:位置参数、*args、默认... -
python函数参数中单独的*
2019-09-27 20:00:48python函数参数中单独的* python的可变参数*args和**kwargs是很常见的,但在别人的代码中看到 函数参数中有个单独的*,没明白这个写法有啥用,搜'函数参数 单独的*' 之类的也找不到想要的结果。试也没试出名堂来。... -
Python 函数参数引用(传值传址)
2022-04-27 20:55:00Python 函数参数引用(传值/传址) 传值/传址 传值:函数传入参数被改变后不会改变主函数中变量的值 传址:函数传入参数被改变后会改变主函数中变量的值 Python中的传值/传址 Python是不允许程序员选择采用传值还是... -
Python中的默认参数详解
2020-12-23 13:32:51不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug。 基本原理 在 ... -
Python函数默认参数为空列表
2018-11-19 18:03:40函数的默认参数应该为不可变对象,测试中的函数add()和add_3()传递列表参数不可取,正确姿势如下: def add_end(foo=None): if foo is None: # 执行时会重新创建一个新的空列表对象 foo = [] foo.append('... -
Python函数的定义方式与函数参数问题实例分析
2021-01-20 04:09:56本文实例讲述了Python函数的定义方式与函数参数问题。分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义方式:... -
Python 函数参数
2021-01-14 07:12:53参数我们用函数封装了一个功能,但是希望这个功能可以在不同要求的作用下面得到不同的结果,就需要用到参数。def f(color):if color == 'green':print('They’re green.')elif color == 'yellow':print('It\'s ... -
Python函数参数之必须参数和关键字参数
2020-06-02 12:26:42(3)默认参数。 (4)可变参数。 (5)组合参数。 一、必须参数 即函数调用时必须要传的参数。 特点: ☞ 以正确顺序传入函数。 ☞ 调用时的数量必须与声明时的数量一致。 例如: 二、关键字参数 一些函数,同时... -
Python 函数参数为空 空函数参数 None 怎么定义空函数参数 -YDOOK
2020-04-08 11:02:39将函数参数设置为 None,在python中,可变函数参数不输入为空的时候,应该用None代替不输入的真空。 示例代码: def Kong(None): pass -
python函数参数以及顺序
2019-02-25 16:25:08必选参数(位置参数) 默认参数 可变参数 关键字参数 参数组合 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都...函数参数 函数的参数-廖雪峰python3 ... -
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2020-09-18 11:54:08主要介绍了python函数装饰器之带参数的函数和带参数的装饰器用法,结合实例形式分析了Python函数装饰器中函数带多个参数以及装饰器带有多个参数的具体原理与实现方法,需要的朋友可以参考下 -
详解Python传入参数的几种方法
2020-12-31 00:15:54Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合 写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用... -
【Python - 函数参数】必传参数、默认参数、可变参数、关键字参数的详细使用
2021-11-23 11:51:47Python函数参数列表 必传参数:平时最常用的,必传确定数量的参数 默认参数:在调用函数时可以传也可以不传,如果不传将使用默认值 可变参数:可变长度参数 关键字参数:长度可变,但是需要以 key-value 形式... -
python 函数参数类型检查
2019-05-22 09:38:52在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里。 我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了。而且一旦参数有改动,这部分也需要改动。 下面我们用... -
Python中参数具有默认值的函数
2022-02-24 21:33:11在《Python中自定义函数的方法》中提到,自定义的函数在函数名之后的圆括号内包含有参数,如图1所示。 图1 自定义函数func 在图1中,自定义了一个名为func()的函数,该函数包含一个参数i。接下来定义了一个值为0... -
python函数参数*args
2019-03-03 13:41:01由于python中函数允许函数用变量作为函数参数(感觉是个高级语言都有啊)所以我们可以用*args作为函数参数。 在函数中参数可以按照tuple来进行访问 下面看一个典型的函数 def function1(name_arg,*args): print...