10 函数的参数

男娘i 2022-01-05 14:59 240阅读 0赞

函数的参数

实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合———-传值

形参:定义函数,在括号内声明的变量名,用来接受外界传来的值————接收值

    形参随着函数的调用而产生,随着调用结束而销毁

实参

为形参传值;两种类型都存在:位置实参在前,关键字实参在后

分为两类:

位置实参:不用明确形参名的传参方式,按照位置给形参传值 一一对应
关键字实参:必须明确形参名字与值为形参传值,可以不用按照位置 按名取值

注:混用
1.关键字实参必须出现在位置实参后
2.多个位置实参还是按照位置传参
3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序

  1. def fn2(a, b, c, d, e, f):
  2. print(a, b, c, d, e, f)
  3. fn2(10, 20, 30, e=100, f=500, d=200) #10, 20, 30位置实参,e=100, f=500, d=200关键字实参
  4. 》》》10 20 30 200 100 500

形参与实参:

  1. # ***** 在函数定义()中出现的参数:形参
  2. # ***** 形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁
  3. def fn(a, b, c):
  4. # a,b,c必须要从外界获取值,采用意义
  5. print(a)
  6. print(b)
  7. print(c)
  8. # 外部提前产生了的变量,内部可以使用
  9. print(x)
  10. print(y)
  11. print(z)
  12. # x,y,z是实际存在的值
  13. x = 10
  14. y = 20
  15. z = 30
  16. # ***** 在函数调用()中出现的参数(外界实际存在的值):实参
  17. # fn(10, 20, 30) #fn(x, y, z)
  18. 执行结果:
  19. 10
  20. 20
  21. 30
  22. 10
  23. 20
  24. 30
  25. fn(x + 10, y * 2, z / 5)
  26. 执行结果:
  27. 20
  28. 40
  29. 6.0
  30. 10
  31. 20
  32. 30
  33. # ***** 调用函数,实参可以由 常量、变量、表达式或三种的组合
  34. # 在函数的外部不能直接使用函数的形参,原因:函数调用完毕后,形参被销毁了
  35. # print(a)
  36. # print(b)
  37. # print(c)
  38. 执行结果:
  39. NameError: name 'a' is not defined

实参的混用

  1. def fn1(a, b, c):
  2. print(a, b, c)
  3. #两者混用: 关键字实参 必须出现在位置实参之后
  4. fn1(10, c=20, a=30) # 10按位置传参给a,a=30给a传参,c可以拿到20,但b没人传参
  5. TypeErrorfn1() got multiple values for argument 'a' a被多次传值
  6. # 合法传参 *****
  7. fn1(10, c=30, b=20)
  8. fn1(10, b=30, c=20)
  9. def fn2(a, b, c, d, e, f):
  10. print(a, b, c, d, e, f)
  11. fn2(10, 20, 30, e=100, f=500, d=200)
  12. 执行结果:
  13. 10
  14. 20
  15. 30
  16. 200
  17. 100
  18. 500

形参

分为六类:

   位置形参:位置实参与关键字实参都可以对其传参

   默认形参:位置实参与关键字实参都可以对其传参,也可以不被传参

   可变长位置形参:接收位置形参、默认形参没有接收完的所有位置实参

  有初值关键字形参:只能由关键字实参传值,也可以不被传值

  无初值关键字形参:只能由关键字实参传值

  可变长关键字形参:接收两种关键字形参没有接收完的所有关键字实参

  

  1. def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
  2. pass
  3. # 位置形参:a、b
  4. # 默认形参:c
  5. # 可变长位置形参:args
  6. # 无初值关键字形参:d、f
  7. # 有初值关键字形参:e
  8. # 可变长关键字参数:kwargs

1、位置形参positional argument

  1. def fn(a, b, c):
  2. print(a, b, c)
  3. # 位置形参可以由 位置实参 与 关键字实参 来传值
  4. fn(10, 20, 30)
  5. fn(a=10, b=20, c=30)

2、默认形参

  1. # 默认形参具有默认值,用=进行复制
  2. def fn(a=10,b=20):
  3. print(a, b)
  4. # 默认形参可以由 位置实参 与 关键字实参 来传值,还可以不用传值(采用自身默认值)
  5. fn(20, 30) #20,30
  6. fn(a=200, b=300) #200,300
  7. fn(100) #100,20 传值给a
  8. fn(b=100) #10,100传值给b
  9. # 位置形参与默认形参同时存在,默认形参必须在后
  10. def fn1(a,b,c=10,d=20):
  11. print(a, b, c, d)
  12. # 位置形参必须传值,默认形参分情况传值
  13. fn1(100, 200, d=1000) #100,200,10,1000

3、可变长位置形参

  1. # 可变长形参只能由 位置实参 来传值
  2. def fn(a, b=10, *args):
  3. print(a, b)
  4. print(args)
  5. # 可变长形参会以元组形式接受 位置形参与默认形参未接受完的 所有传入的位置实参
  6. # 小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
  7. # 导致默认形参只能由位置实参来传值
  8. fn(1, 20, 100, 200)
  9. 执行结果:
  10. 1 20
  11. (100, 200)
  12. fn(100)
  13. 执行结果:
  14. 100 10
  15. ()

  可变长位置形参的整体赋值

  1. def fn(*args):
  2. print(args)
  3. fn(1, 2, 3, 4, 5) # (1, 2, 3, 4, 5)
  4. a = 'ab'
  5. b = [1, 2]
  6. c = (1, 2)
  7. d = {1, 2}
  8. fn(a) # ('ab', )
  9. fn(b) # ([1, 2], )
  10. fn(c) # ((1, 2), )
  11. fn(d) # ({1, 2}, )
  12. # 问:就拿a,b,c,d进行传值,如何得到
  13. ('a', 'b')
  14. (1, 2)
  15. # *单列集合(保护字符串)将该变量进行 打散 传值 (本质传递的是地址)
  16. fn(*a)
  17. fn(*b)
  18. fn(*c)
  19. fn(*d)
  20. # 打散
  21. def fn1(*args):
  22. print(args)
  23. ls = [1, 2, 3, 4, 5]
  24. fn1(ls) # (ls, )===>([1, 2, 3, 4, 5],)
  25. fn1(*ls) # 将ls打散为1,2,3,4,5再进行传值=>(1,2,3,4,5)

4、关键字形参

“*“为分割线,可以有变量名 *args, 也可以只用来做分隔

  1. # 前提:出现在 * 之后的形参
  2. def fn(a, b=10, *, c, d=20, e):
  3. pass
  4. # c,d,e都是出现在*之后,都是关键字形参,由于必须由 关键字实参 来传值,没有顺序的强行要求
  5. # 可变长关键字形参:用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值
  6. # 用字典来存放数据
  7. def fn(**kwargs):
  8. print(kwargs)
  9. fn(a=10,b=20) # {'a': 10, 'b': 20}
  10. dic = {
  11. 'x': 100, 'y': 200}
  12. fn(**dic) # {'x': 100, 'y': 200}
  13. a:位置
  14. b:默认
  15. ce:无值关键字形参
  16. d:有值关键字形参
  17. 注:
  18. ab有先后顺序
  19. cd, e无先后顺序
  20. # *****关键字形参必须由 关键字实参 来传值, 出现在*后的都是关键字形参
  21. def tt(a, b=10, *, c, d=10, e):
  22. print(a, b, c, d, e)
  23. # keyword-only arguments
  24. def fn(*, a, b=10, c):
  25. print(a, b, c)
  26. # fn(10, 20, 30) # 错误:TypeError: fn() takes 0 positional arguments but 3 were given
  27. fn(b=300, c=100, a=200)

5、可变长关键字形参

 用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值

  1. 用字典来存放数据
  2. def fn(*, a, b=20, c, **kwargs):
  3. print(a, b)
  4. print(kwargs)
  5. fn(d=40, e=50, a=10, c=30)
  6. # 整体赋值
  7. dic = {
  8. 'name': 'Owen', 'age': 18}
  9. def fn1(**kwargs):
  10. print(kwargs)
  11. fn1(**dic)
  12. dd = {
  13. 'k1': [1, 2, 3, 4, 5],
  14. 'k2': {
  15. "name":"Bob"}
  16. }
  17. fn1(**dd)
  18. def fn2(*args):
  19. print(args)
  20. ll = [1, [1, 2], {
  21. "name":"Bob"}]
  22. fn2(*ll) # (1, [1, 2], {"name":"Bob"})

参数总结

  1. def fn(a, b=10, *args, d, f=20, **kwargs):
  2. print(a)
  3. print(b)
  4. print(args)
  5. print(d)
  6. print(f)
  7. print(kwargs)
  8. # 由位置实参传值: args和kwargs如果都能接收到值:
  9. # b必须传值且只能用位置实参传值,f可以不用传值
  10. fn(1,2,3,4,d=5,g=6,k=7)
  11. 执行结果:
  12. 1
  13. 2
  14. (3, 4)
  15. 5
  16. 20
  17. {
  18. 'g': 6, 'k': 7}
  19. # 全部用关键字实参传值
  20. fn(x=100,y=200,d=300,b=400,a=500)
  21. 执行结果:
  22. 500
  23. 400
  24. ()
  25. 300
  26. 20
  27. {
  28. 'x': 100, 'y': 200}

1.位置形参与默认形参: 能用 位置实参 关键字实参 传值
2.可变长位置形参:只能 位置实参 传值

3.所有关键字形参:只能 关键字实参 传值

注:各种形参出现的先后
位置形参 - 默认形参 - 可变长位置形参 - 无|有初值关键字形参 - 可变长关键字参数

转载于:https://www.cnblogs.com/zhouyongv5/p/10622266.html

发表评论

表情:
评论列表 (有 0 条评论,240人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python 函数参数

    使用位置参数 有时候,方法接收的参数数目可能不一定,比如定义一个求和的方法,至少要接收两个参数: def sum(a, b): return a

    相关 10 函数参数

    函数的参数   实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合-------传值 形参:定义函数,在括号内声明的变量名,用来接受外界传来的值