瀋凣

V1

2022/03/03阅读:95主题:极简黑

python笔记35

Python day35

1. 函数

1.4 参数的研究

1.4.1 必须参数(位置参数)

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

>>> def myfunc(s,v,o):
        return "".join((o,v,s))
        
>>> myfunc('假面骑士','打败了','怪人')
'怪人打败了假面骑士'

当传入的参数数量或位置不正确时,就会报错

>>> def myprint(name,times):
...     for i in range(times):
...             print(f"I love {name}")
...
>>> myprint()  #参数数量不正确
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: myprint() missing 2 required positional arguments: 'name' and 'times'
>>> myprint(2,'python')  #参数位置不正确
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
  File "<stdin>", line 2in myprint
TypeError: 'str' object cannot be interpreted as an integer

一旦函数功能复杂,需要传入的参数变多,光是记住参数的顺序都会显得力不从心。遇到这种情况怎么办?我们可以使用关键字参数

1.4.2 关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

>>> myfunc(o="假面骑士",v="打败了",s="怪人")
'假面骑士打败了怪人'

当位置参数和关键字参数同时使用时,要注意位置问题:

>>> myfunc(o='I','love','U')
  File "<stdin>", line 1
    myfunc(o='I','love','U')
                           ^
SyntaxError: positional argument follows keyword argument

规则:调用函数时位置参数必须在关键字参数之前

>>> myfunc('U','love',o='I')
'IloveU'

这里的关键字参数在最后的意思并不是任意一个参数都可以放到最后面,指的是只有最后一个参数可以用关键字参数。

>>> myfunc('love','I',s='U')
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: myfunc() got multiple values for argument 's'

1.4.3 默认参数

调用函数时,如果没有传递参数,则会使用默认参数。

>>> def printinfo(name,age=None):
...     print("name:",name)
...     print("age:",age)
...
>>> printinfo('vanovel')
name: vanovel
age: None
>>> printinfo('zhangfei',18)
name: zhangfei
age: 18

使用默认参数要注意位置问题

>>> def myfunc(s='I',v,o='U'):
  File "<stdin>", line 1
    def myfunc(s='I',v,o='U'):
                       ^
SyntaxError: non-default argument follows default argument

规则:自定义函数时默认参数要放到最后面

>>> def myfunc(v,s='I',o='U'):
...     return "".join((s,v,o))
...
>>> myfunc('love')
'IloveU'
>>> myfunc('love','He','Her')
'HeloveHer'

1.4.4 冷门小知识

当我们在使用help()函数来查看函数文档的时候,经常会在函数原型中看到/

>>> help(abs)
Help on built-in function abs in module builtins:

abs(x, /)
    Return the absolute value of the argument.
    
>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, /, start=0)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers

    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.

那么/代表什么意思呢?
/左侧的参数必须传递位置参数,而不能是关键字参数,右侧随意。

  • 尝试在abs()函数的参数里填入关键字参数:
>>> abs(-1.5)
1.5
>>> abs(x=-1.5)
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: abs() takes no keyword arguments
  • 测试sum()函数的参数:
>>> sum([1,2,3],4)
10
>>> sum([1,2,3],start = 4)
10

自定义函数同样遵从这个语法:

>>> def abc(a,/,b,c):
...     print(a,b,c)
...
>>> abc(1,2,3)
1 2 3
>>> abc(1,b=2,c=3)
1 2 3
>>> abc(1,b=2,3)  #遵从此语法同时也要遵从关键字参数最后原则
  File "<stdin>", line 1
    abc(1,b=2,3)
               ^
SyntaxError: positional argument follows keyword argument
>>> abc(a=1,b=2,c=3)
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: abc() got some positional-only arguments passed as keyword arguments: 'a'

这时候就有同学要问了:既然有限制只能位置参数的符号,是不是还有限制只能关键字参数的符号呢?

您好,有的。

*左侧的参数随意,右侧必须传递关键字参数,而不能是位置参数。

>>> def abc(a,*,b,c):
...     print(a,b,c)
...
>>> abc(1,b=2,c=3)
1 2 3
>>> abc(a=1,b=2,c=3)
1 2 3
>>> abc(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
TypeError: abc() takes 1 positional argument but 3 were given
点点关注不迷路
点点关注不迷路
- END -

分类:

后端

标签:

Python

作者介绍

瀋凣
V1