Python之函数-形参和返回值

Python之函数-形参和返回值

形参

  • 可以有缺省值,定义时,如果没有提供该参数,动用缺省值. 缺省值的定义往后放
  • 5种
  • 1、普通形参:可以有缺省值,2种传实参方式都可以用
  • 2、*args 可变仅位置形参,只能接收按照位置传入的实参,可以接收0个或任意个,没有缺省值
  • 3、**kwargs 可变仅关键字形参,只能接收关键字传入的实参,可以接收0个或任意个. 形参的最后一个, 没有缺省值
  • 4、keyword-only形参,args,或,之后出现的,只仅仅接收关键字传入实参. 缺省值,无所谓前后
  • 5、positional-only形参,/之前,仅仅接受位置传入参数

除了可变参数外,都可以有缺省值,定义时,如果没有提供该参数,动用缺省值.
仅位置和普通参数,一起算,缺省值的定义往后放
仅关键字参数,缺省值无所谓先后


  1. keyword-only形参
def foo(*args, x, y):
    print(x, y, args)
foo(y=6, x=4), foo(x=4, y=6), foo(1, x=4, y=8), foo(1, 2, 3, 4, y=3, x=3)

# 返回结果:4 6 ()
# 返回结果:4 6 ()
# 返回结果:4 8 (1,)
# 返回结果:3 3 (1, 2, 3, 4)
# 返回结果:(None, None, None, None)
def foo(*args, x, y, **kwargs):
    print(x, y, args, kwargs)
foo(a=100, b=2, y=6, x=4), foo(1, 2, x=4, a=100, y=5)

# 返回结果:4 6 () {'a': 100, 'b': 2}
# 返回结果:4 5 (1, 2) {'a': 100}
# 返回结果:(None, None)
def foo(x, *args, y):
    print(x, args, y)
foo(1, 2, 3, y=10), foo(y=6, x=7)

# 返回结果:1 (2, 3) 10
# 返回结果:7 () 6
# 返回结果:(None, None)
def foo(x, *args, y):
    print(x, args, y)
  1. positional-only形参,/之前,仅仅接受位置传入参数
def fn(a, b, /):
    print(a, b)
fn(1, 2)
# 返回结果:1 2
def bar(a, b, /, c, d=10, *args, m, n, **kwargs):
    print(a, b, c, d, '|', m, n, args, kwargs)

# 函数形参5种形参方式都展现出来了。
bar(1, 2, 3, 4, 5, m=6, n=7)

# 返回结果:1 2 3 4 | 6 7 (5,) {}
def config(host, username='Runaway', password='123', port=3306, **options):
    connstr = "mysql://{}:{}@{}:{}".format(username, password, host, port)
    print(connstr)

# 定义函数时,把重要的参数列在外面,最常改变的参数尽量往前放
config('192.168.1.1'), config('192.168.1.1', 'root', 'root', 2206)

# 返回结果:mysql://Runaway:[email protected]:3306
# 返回结果:mysql://root:[email protected]:2206
# 返回结果:(None, None)

参数解构

  • * 对容器解构,按照位置传实参,字典取的是key
  • ** 只用于mapping(字典),按照kv对实现关键字传参,key要和形参对应
def add(*nums):
    s = 0
    for i in nums:
        s += i
    return s

# 求和函数
add(1, 4, 5)

# 返回结果:10 
add(*range(5))

# 对range(5)解构
# 返回结果:10 
add(*[1, 2]), add(*(1, 2)), add(*{1, 2}), add(*{'a':1, 'b':2}.values()) 

# 获取字典的value值在解构就可以了。
# 返回结果:(3, 3, 3, 3)

报错

def foo(*args, x, y):
    print(x, y, args)
foo(), foo(1, 2, 3, 4, 5), foo(x=7, z=5, y=8)

# 报错原因:x和y没有给值
# 报错内容:TypeError: foo() missing 2 required keyword-only arguments: 'x' and 'y'
def foo(x, *args, y):
    print(x, args, y)
foo(1, 2, 3, x=100, y=200)

# 报错原因:# x的值给了2次
# 报错内容:TypeError: foo() got multiple values for argument 'x'
def fn(*, x, y):
    print(x, y)
fn()

# 报错原因:星后面的是仅关键字参数,必须指定,上面的函数是定义了一个keyword形参,只能接收仅关键字参数
# 报错内容:TypeError: fn() missing 2 required keyword-only arguments: 'x' and 'y'
def fn(a, b, /):
    print(a, b)
fn()

# 报错原因:没有传参
# 报错内容:TypeError: fn() got some positional-only arguments passed as keyword arguments: 'a, b'
fn(1), fn(a=1, b=2)

# 报错原因:/前面仅接受位置传参
# 报错内容:TypeError: fn() missing 2 required positional arguments: 'a' and 'b'

你可能感兴趣的:(Python,python,开发语言)