Python函数

函数是一种过程,也称为子程序,它执行一个指定的运算或操作。函数有内部函数或称标准函数,外部函数也即用户定义函数等。函数用来实现单一的功能的一块代码。能提高应用的模块性及代码的复用率。

所以说,函数是个好东西啊^_^!

一、定义

python函数以 def 关键词开头,后接函数名称和圆括号()。

def functionName( arg ):  
  "文档字符串"
   pass
   return expression
复制代码

函数内的第一条语句是字符串时,该字符串就是文档字符串。文档字符串是一个重要工具,用于解释文档程序,便于后面的维护。

文档字符串和注释的区别:文档文档字符串偏向于函数功能的总体介绍,而注释偏向于代码实现的细节介绍。

程序运行起来后,内存中有不同层级的命名空间。Python的命名空间就是它的符号表,函数在 执行 时使用函数局部变量符号表,所有函数变量赋值都存在局部符号表中;引用变量时,首先,在局部符号表里查找变量,然后,是外层函数局部符号表,再是全局符号表,最后是内置名称符号表。

在调用函数时会将实际参数(实参)引入到被调用函数的局部符号表中;因此,实参是使用 按值调用 来传递的(其中的 值 始终是对象的 引用 而不是对象的值)。当一个函数调用另外一个函数时,会为该调用创建一个新的局部符号表。

函数定义在当前符号表中把函数名与函数对象关联在一起。解释器把函数名指向的对象作为用户自定义函数。

Python函数都有返回值,在return后面未返回任何值或根本没有return语句时,函数会返回None

二、传参

函数有三种可以组合使用的传参形式。

1、默认值传参

def func1(x, y=2, z=3):
    return x + y + z
print(func1(1))
print(func1(1,2))
print(func1(1,2,3))
复制代码

上面三种方式调用函数都是合法的,不会报错。三种方式返回值都是:6

2、关键字传参

def func1(x, y=2, z=3):
    return x + y + z
print(func1(y=100, x=9, z=4))
结果:113
复制代码

同样的函数,上面的调用方式没有任何问题,虽然改变了它的传参顺序,但是一点都不会影响结果。

但这种方法有几个需要注意的地方:

①关键字参数必须跟在位置参数后面。

同样是上面那个函数

print(func1(100,y=100,z=1)) #//这样调用不会报错
结果:201
print(func1(y=100,z=1,100)) #这样就会报错,Positional argument cannot appear after keyword arguments
复制代码

②不能对同一个参数多次赋值

print(func1(10,y=100,z=1,x=100)) #这样就会报错,got multiple values for argument 'x'
复制代码

③传参不能超出函数定义的参数的个数

print(func1(10,100,100,100)) #takes from 1 to 3 positional arguments but 4 were given
复制代码

④不能使用传函数中未定义的参数

print(func1(10,100,j=100)) # got an unexpected keyword argument 'j'
复制代码

上面的 j 这个参数未在函数中定义,调用时会报错

3、特殊传参


def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
      -----------    ----------     ----------
        |             |                  |
        |        Positional or keyword   |
        |                                - Keyword only
         -- Positional only
复制代码

/ 和 * 是可选的。这些符号表明形参如何把参数值传递给函数:位置、位置或关键字、关键字。/ 前面只能传递位置参数,* 后面只能传递关键字参数。/ 和 * 之间则两种类型的参数都能传。

第一种:仅位置参数
def f3(x, y, /):
    return x + y
print(f3(1, 2))
结果:3
print(f3('a', 'b'))
结果:ab
复制代码

但如果像下面这样调用的话就会报错:

print(f3(1, x=2)) #got some positional-only arguments passed as keyword arguments: 'x'
复制代码
第二种:仅位置参数
def f4(*, x, y):
    return x+y
print(f4(x=1, y=2))
结果:3
复制代码

下面是错误的用法:

print(f4(1,2))#takes 0 positional arguments but 2 were given
复制代码
第三种:上面两种方式结合使用
def f5(x, /, y, *,z):
    return x+y+z
print(f5(1, 2, z=3))
结果:6
复制代码

小结:

1、使用仅限位置形参,可以让用户无法使用形参名。形参名没有实际意义时,强制调用函数的实参顺序时,或同时接收位置形参和关键字时,这种方式很有用。

2、当形参名有实际意义,且显式名称可以让函数定义更易理解时,阻止用户依赖传递实参的位置时,才使用关键字。

3、对于 API,使用仅限位置形参,可以防止未来修改形参名时造成破坏性的 API 变动。

注:本人只能初学python,如果有什么错误的地方希望能谅解!也欢迎大家指正。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享