- 位置参数
必选参数,必须按照位置次序,依次传入参数。
def power(x, n): s = 1 while n > 0: n -= 1 s = s * x return s
- 默认参数
给参数赋予值时,就是默认参数
1、是必选参数在前,默认参数在后,否则Python的解释器会报错
def power(x, n=2): s = 1 while n > 0: n -= 1 s = s * x return s
2、传入默认参数的必须是不可变参数,不然会影响后续调用
def func(x=[], y=[6, 7]): # 默认参数一定要用不可变对象 # Python 中,函数的默认参数在函数定义时被创建,并且在每次函数调用时都会重用相同的对象。 # 因此,当对默认参数进行修改时,这些修改会影响到下一次对该函数的调用。 print("此时默认值:", x, y) x.append(8) y.append(8) return x + y a, b = [1, 2], [3, 4] t = func(x=a) # 运行结束时,默认参数x=[],y=[6,7,8],x被赋值,没有改变其默认值,y没有赋值,y.append语句改变的是y默认值的值。 func() # 执行完该语句,默认参数x=[8],y=[6,7,8,8] t = func(y=b) # 默认参数x=[8,8],y=[6,7,8,8] func()
func被定义时,列表[],[6, 7]在内存中被创建,当调用该func没有传入参数时,并且在func中改变了默认参数变量x,y值时,实际上改变的时内存地址中的列表的值,所以会影响下次默认参数的调用。若传入了参数,则进行操作的时传入的参数,原默认参数变量值不会改变。
- 可变参数
1、可变,指的是传入参数是不确定个数的,0个或任意个,并且传入的参数被自动封装为一个tuple,并传入函数内的变量,定义时参数前加*
2、对于list 或tuple数据,传入函数时,可以变量前加*
def calc(*numbers): sum1 = 0 for n in numbers: # 允许传入0个或任意个参数,*number被自动封装一个元组 sum1 += n * n return sum1 nums = [1, 2, 3, 4, 5, 6, 7, 8] print(calc(*nums)) # list or tuple前加一个*表示其中元素变成可变参数传进去
- 关键字参数
1、 允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
2、传入参数为字典时,可以变量前面加**,此时函数中kw接受到一个该变量拷贝的字典
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)、
person('Michael', 30)
person('Bob', 12, city='Beijing')
person('Jack', 14, gender='M', job='Engineer')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 14, **extra) # **extra 表示把extra字典中的key-value用作关键字传入函数**kw,kw获得一个extra拷贝的字典
- 命名关键字参数
当只想传入某几个关键字参数时,可以该参数对传入的参数进行限制
1、定义时采用 * 间隔的方式,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数
当函数中有可变参数是,不需要分隔符*了,后面的参数默认是命名关键字参数
def person1(name, age, *, city, job): # 表示只接受,关键字为city and job的参数 print('name:', name, 'age:', age, 'city:', city, 'job:', job)
def person2(name, age, *args, city, job): print(name, age, args, city, job)
2、命名关键字参数必须传入参数名,不然会将传入的参数认为是*args。并且必须传入city和job值,不然也会报错
person1('Jack', 24, job='Engineer')
TypeError: person1() missing 1 required keyword-only argument: 'city'
3、当定义时,命名关键字参数有默认值时,则调用时可以缺省该变量
def person(name, age, *, city='Beijing', job): print(name, age, city, job)
person('Jack', 24, job='Engineer')
- 参数组合
1、参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
args = (1, 2, 3, 4) kw = {'d': 99, 'x': '#'} f1(*args, **kw) a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'} args = (1, 2, 3) kw = {'d': 88, 'x': '#'} f2(*args, **kw) a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
2、对传入的*tuple 和 *kw 进行类似于“解包” 的操作,并依次将其中每一个元素,赋予位置参数、默认参数、可变参数、命名关键字参数、关键字参数
但此时命名关键字参数不能缺省,一定要在kw中以 dict 形式存在,不然会报错
f2(1, 2, d=99, ext=None) args = (1, 2, 3) kw = {'f': 88, 'x': '#'} f2(*args, **kw) TypeError: f2() missing 1 required keyword-only argument: 'd'
标签:city,关键字,args,问题,函数参数,job,参数,kw From: https://www.cnblogs.com/serendipity-prayer/p/18522659