python函数传参

python函数传参

参考:python函数参数传递(params, *params, **params

位置参数

常见的函数参数:

def add_both(x, y):
    return x+y

默认参数

def enroll(name, gender, age=6, city='Beijing'):
    print('name:', name)
    print('gender:', gender)
    print('age:', age)
    print('city:', city)
enroll('tom','man',12,'shanghai')
# 输出
name: tom
gender: man
age: 12
city: shanghai

如果不按顺序时,需要把参数名加上:

def enroll(name, gender, age=6, city='Beijing'):
    print('name:', name)
    print('gender:', gender)
    print('age:', age)
    print('city:', city)
enroll(gender='woman',name='Pam',age=22,city='changsha')
# 输出
name: Pam
gender: woman
age: 22
city: changsha

使用默认参数的特点:

  1. 能降低调用函数的难度
  2. 必选参数在前,默认参数在后,否则会报错
  3. 当有多个参数时,把变化大的参数放前面,变化小的参数放后面,可以作为默认参数。

默认参数必须指向不变对象:

def add_end(L=[]):
    L.append('END')
    return L
add_end()
add_end()
# 输出
['END', 'END']
  • 问题:连续调用函数,默认参数是[],但函数似乎每次都记住了上次添加了‘end’后的list

  • 原因:默认参数L是一个变量,指向对象[],每次调用函数,如果改变了L的内容,则下次调用时,默认参数的内容改变了,不再是函数定义的[]

  • 解决办法:默认参数都是None

def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L
add_end()
add_end()
# 输出
['END']
  • 将参数设置为不变对象,对象内部的数据就不能修改。

可变参数

可变参数就是传入的参数个数是可变的,可以是任意的。

传统方式,可以传入list、tuple。

def cal_num(nums):
    for i in nums:
        print(i)
cal_num([1,2])
cal_num(('aaa','sss'))
cal_num('ssss')
# 输出
1
2
aaa
sss
s
s
s
s

可定义可变参数,是在参数前加一个*号,将其接收到参数值自动组装为一个tuple:

def cal_num(*nums):
    for i in nums:
        print(i)
cal_num(1,2)
cal_num([1,2])
cal_num(('aaa','sss'))
cal_num('ssss')
# 输出
1
2
[1, 2]
('aaa', 'sss')
ssss

如果有一个list或tuple,想要将其元素逐个传入函数中:

def cal_num(*nums):
    for i in nums:
        print(i)
nums = [1, 2]
cal_num(nums)
cal_num(*nums)
# 输出
[1, 2]
1
2

关键字参数

可定义关键词参数,是在参数前加一个**号,将传入的任意个参数值自动组装为一个dict,即类似于“键值对”:

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
person('Michael', 30)
person('Bob', 35, city='Beijing')
person('Adam', 45, gender='M', job='Engineer')
# 输出
name: Michael age: 30 other: {}
name: Bob age: 35 other: {'city': 'Beijing'}
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

命名关键字参数

命名关键字参数是限制关键字参数的名字,与关键字参数定义不同,只需要一个特殊分隔符*,后面的参数作为命名关键字参数。

def person(name, age, *, city, job):
    print(name, age, city, job)
person('Michael', 30)
person('Bob', 35, city='Beijing')
person('Adam', 45, city='shanghai', job='Engineer')
# 输出
报错
报错
Adam 45 shanghai Engineer
  • 命名关键字参数,不能是0参数,必须传入指定参数名的参数

如果函数定义中已经有了一个可变参数,后面的命名关键字参数就不再需要特殊分隔符(加上会报错):

def person(name, age, *args,city, job):
    print(name, age, args, city, job)
person('Adam', 45,'M',city='shanghai', job='Engineer')
# 输出
Adam 45 ('M',) shanghai Engineer
posted @ 2024-02-19 10:18  PamShao  阅读(113)  评论(0编辑  收藏  举报