Python之函数

发布时间:2020-05-24 05:24:13

Python之函数


函数定义

函数定义的简单规则:

  • 函数代码块以def关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须放在圆括号中间
  • 函数内容以冒号起始,并且缩进
  • 若有返回值,Return[expression] 结束函数;不带return 表达式相当于返回None
  • 函数通常使用三个单引号  '''...'''   来注释说明函数
  • 函数体内容不可为空,可用 pass 来表示空语句

Python之函数


   定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

Python之函数


python中的函数,无论是命名函数,还是匿名函数,都是语句和表达式的集合。在Python中,函数是第一个类对象,这意味着函数的用法并没有限制。Python函数的使用方式就像Python中其他值一样,例如字符串和数字等。Python函数拥有一些属性,通过使用Python内置函数dir就能查看这些属性,如下代码所示:

Python之函数

其中,一些重要的函数属性包括以下几个:

1. __doc__返回指定函数的文档字符串

Python之函数

2. __name__返回指定函数的名称

Python之函数

3. __module__返回函数定义所在模块的名字

Python之函数

4.  func_dict返回支持任意函数属性的命名空间。

Python之函数


通常我们在调用函数函数时,常常会搞乱参数的顺序,达不想要的效果。为了解决这个问题,我们就有了关键字参数。

以“参数的名称=参数值的值”的形式使用关键字参数。

Python之函数


有时候会不清楚函数具体需要多少个参数,这时候可变参数就能很好的解决这一问题。

可变参数的表示为在其参数名前加*,如*args。

Python之函数


注意:如果可变参数还要参加其他定制的参数,在调用函数时就应该使用关键字参数来定制。

Python之函数

Python之函数


全局变量的作用域是整个模块,也就是整个文件的代码段,也是代码内的所有函数都可以访问到全局变量。

但是在函数内仅仅访问到全局变量就好,不能去修改全局变量。一旦试图在函数内去修改全局变量,Python会自动在函数内创建一个与全局变量相同名称的局部变量,实际全局变量的值并没有被修改。

Python之函数

如果仍旧想要在函数内修改全局变量,可以使用关键字global来实现。

Python之函数



Python的函数时可以内嵌定义的。允许在函数内嵌套另一个函数。

内部函数整个作用域都在外部函数之内。如下例子中,fun2()只能在fun1()中被调用。

Python之函数


闭包是函数式编程重要的语法结构。如果在一个内部函数里对外部作用域(但不是在全局作用域的变量进行引用), 那么内部函数就会被认为是闭包closure。

Python之函数


需要注意:因为闭包的概念是由内部函数引用而来,因此就不能外部函数的外边对内部函数进行调用。以上例子,funy()是不能直接调用的。

Python之函数


在闭包中,外部函数的局部变量对内部函数的局部变量,就相当于全局变量之与局部变量的关系。在内部函数中,只能对外部函数的局部变量进行访问,不能进行修改。

Python之函数

上述例子报错原因:调用fun1()返回的是fun2()函数,fun2()的整个外部空间是fun1()的内部空间。对于fun2()中 的x,fun1()中的x=5是非全局变量的外部变量。在fun2()的中试图对x进行修改,那么外部函数fun1()的x就会被屏蔽起来。因此fun2()中试图对一个没有定义的x进行平方操作,就会报错。


要解决上述问题,可以通过Python的容器类型来存放x值。因为容器类型不是存放在栈里面,因此x不会被屏蔽掉。于是,代码可以修改如下:

Python之函数


另外,在Python3中,还有另外的解决方法,那就是关键字nonlocal。

Python之函数


python允许lambda表达式来创建匿名函数。

Python之函数Python之函数


Lambda表达式的作用:

1、Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只需要写一个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用lambda就可以使代码更加精简。

2、对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起名字也是比较头疼的,使用lambda就可以不用考虑命名的问题了。

3、简化代码的可读性,由于普通的函数阅读经常要调到开头def定义部分,使用lambda可以省去这样的步骤。