已复制
全屏展示
复制代码

Python函数参数的五种形式


· 4 min read

一. 函数参数的五种形式

1.1 位置参数

根据定义的函数的参数位置来判断参数的值。位置参数一旦定义,在调用函数时,就必须传入对应的参数值。

def show_info(name, age):
    print("name: {0}, age: {1}".format(name,age))

show_info("yuchaoshui", 23)

1.2 默认参数

def show_info(name, age, city="beijing", company="alibaba"):
    print("name: {0}, age: {1}, city:{2}, company:{3}".format(name, age, city, company))

show_info("yuchaoshui", 23)
show_info("yuchaoshui", 23, "shanghai")
show_info("yuchaoshui", 23, company="baidu", city="shanghai")
  • a、必选参数放在前面,默认参数放在后面
  • b、变化大参数放在前面,变化小的放在后面
  • c、调用时默认参数可以不用按顺序提供默认参数,可以使用类似 show_info("yuchaoshui", 23, company="baidu", city="shanghai") 的方法传递参数, 后面的默认参数部分调换了顺序,调用时默认参数部分如果不给出关键字,可以用默认参数按照顺序给出,以位置参数的形式调用,达到位置参数的效果。
show_info("yuchaoshui", 23, shanghai, baidu)
  • d、默认参数必须指定不变对象,不能是 []  这种可变的序列。
def func(a, b=[]) 
    pass
    

上面的做法是错误的,正确的应该像下面这样实现。

no_value = object()
def  func(a, b=no_value):
     if b is no_value:
          print("No b value supplied")

1.3 可变参数

可变参数表示参数的个数变化的,调用时传递多个参数。

def func(*args):
    for i in args:
        print(i)

func(1,2,3,4)

也可以先组装 list 或 tuple,再通过 *mylist 传入,调用函数时, * 可以将序列分解成单个的参数。args接收到的是一个 tuple 或 list

def func(*args):
    for i in args:
        print(i)

mylist = [1,2,3,4]
func(*mylist)

1.4 关键字参数

关键字参数允许传入未定义的参数名, 函数中 kwargs 接收到的是一个字典。调用函数方式时使用类似 city='Shanghai' 这种方式传入参数。 也可以传入一个字典,传入时使用两个 ** 号来将字典解析成参数传入。

def person(**kwargs):
    for k,v in kwargs.items():
        print('{0}: {1}'.format(k, v))

person(city='Shanghai')

extra = {'city': 'Beijing', 'job': 'Engineer'}
person(**extra)

1.5 命名关键字参数

命名关键字参数也叫强制关键字参数。关键字参数允许传入任意的参数,命名关键字参数可以限制传入参数的关键字,使用*将其分开。

  • 通常使用方式如下,表示只接收关键字为city、job的参数传入值。如果传入其他未定义的关键字参数则报错。
def person(name, age, *, city, job):
    print(name, age, city, job)

person('yzy', 23, city='beijing', job='programer')
  • 命名关键字参数一旦定义,调用时就必须要传入,除非给定的关键字参数已经有了默认值
def person(name, age, *, city='beijing', job='programer'):
    print(name, age, city, job)

person('yzy', 23)
  • 如果已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符 * 了:
def person(name, age, *scores, city='beijing', job='programer'):
    print(name, age, scores, city, job)

person('yzy', 23, 99, 100, city='shanghai')

结果为: yzy 23 (99, 100) shanghai programer , 99,100 是传递的可变参数,后面是命名关键字参数。

二. 函数参数组合使用

以上5种参数都可以随意组合,但是参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。

注意: 参数的组合使用不建议太复杂,太复杂的话可读性很差。

三. 函数参数类型检查

函数的参数可以使用 isinstance() 内置函数来检查。

def test(x,y,z):
    if not isinstance(x, int):
        raise TypeError('x need arg type int')
    if not isinstance(y, str):
        raise TypeError('y need arg type str')
    if not isinstance(z, (str, int)):
        raise TypeError('z need arg type str or int')

test(2,'3',object)
🔗

文章推荐