这是本文的目录

  • 前言
  • Python的自定义函数。
  • 函数变量作用域
  • 闭包
  • 总结
  • 零基础Python学习指南
  • 👉Python学习路线汇总👈
  • 👉Python必备开发工具👈
  • 👉Python学习视频600合集👈
  • 👉实战案例👈
  • 👉100道Python练习题👈
  • 👉面试刷题👈
  • 👉资料领取👈


前言

实际工作生活中,有不少初学者编写的Python程序,他们长达几百行的代码中却没有一个函数,通通按顺序对到一块,不仅让人读起来费时费力,往往也错误连连。一个规范的、值得借鉴的Python程序,除非代码量很少,基本都应该由多个函数组成,这样的代码才更加模块化、规范化。函数是Python程序中不可或缺的一部分,

python3 可以使用宏定义吗 python有宏定义吗_学习

Python的自定义函数。

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

Python 定义函数使用 def 关键字,一般格式如下:

python3 可以使用宏定义吗 python有宏定义吗_python3 可以使用宏定义吗_02


函数的定义主要有如下要点:

def: 表示函数的关键字
函数名: 函数的名称,日后根据函数名调用函数
函数体: 函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等…
参数: 为函数体提供数据
返回值: 当函数执行完毕后,可以给调用者返回数据。
以上要点中,比较重要有参数和返回值:

和其他高级语言区别:
1.声明函数名尾部要有冒号.
2.它不需要用花括号将语句块括起来,用TAB键缩进.

函数式编程最重要的是增强代码的重用性和可读性,实例:

python3 可以使用宏定义吗 python有宏定义吗_开发语言_03


函数有三中不同的参数:

普通参数

默认参数

动态参数

python3 可以使用宏定义吗 python有宏定义吗_开发语言_04


默认参数,函数传递参数的默认值

python3 可以使用宏定义吗 python有宏定义吗_python3 可以使用宏定义吗_05


动态参数,有如下特点:

1.可以接收任意个参数
2.动态参数有两种 *args和kwargs ,*args必须在kwargs之前
3.顺序:位置参数,*args,默认参数,**kwargs,其中

*args:接收的是按照位置传参的值,组织成一个元组
**kwargs:接收的是按照关键字传参的值,组成一个字典

1.> *args 接收参数操作实例

python3 可以使用宏定义吗 python有宏定义吗_python3 可以使用宏定义吗_06


python3 可以使用宏定义吗 python有宏定义吗_开发语言_07


2.> **kwargs 接收参数操作实例

python3 可以使用宏定义吗 python有宏定义吗_python3 可以使用宏定义吗_08


更进一步操作.

python3 可以使用宏定义吗 python有宏定义吗_python_09


混搭使用

python3 可以使用宏定义吗 python有宏定义吗_python_10


如果*arg也需要接收参数,那么前面不能有默认参数,不然调用时会报错.

python3 可以使用宏定义吗 python有宏定义吗_开发语言_11


return语句,return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:

python3 可以使用宏定义吗 python有宏定义吗_学习_12


匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.(匿名函数没有函数名)

匿名函数用关键字lambda定义

定义普通函数和定义lambda函数的方法和区别.

python3 可以使用宏定义吗 python有宏定义吗_python_13


在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:

python3 可以使用宏定义吗 python有宏定义吗_开发语言_14


匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

函数变量作用域

Python函数中变量的作用域和其他语言类似,如果变量是在函数内部定义的,就称为局部变量,只在函数内部有效,一旦函数执行完毕,局部变量就会被收回,无法访问。比如下面这个例子,

python3 可以使用宏定义吗 python有宏定义吗_python3 可以使用宏定义吗_15

我们在函数内部定义的file这个变量,这个变量只在read text from file这个函数里有效,在函数外部则无法访问。相对应的,全局变量则是定义在整个文件层次上的,

我们不能在函数内部随意改变全局变量的值,否则程序就会报错

这是因为Python的解释器会默认函数内部的变量为局部变量。但是又发现局部变量又没有声明,因此就无法执行相关操作。所以如果我们一定要在函数内部改变全局变量的值,就必须加上global这个声明:

python3 可以使用宏定义吗 python有宏定义吗_python入门_16

这里的global关键字,并不表示重新创建了一个全局变量min- value,而是告诉Python解释器,函数内部的变量min- value就是之前定义的全局变量,并不是新的全局变量,也不是局部变量。这样程序就可以在函数内部访问全局变量并修改它的值了。

另外,如果遇到函数内部局部变量和全局变量同名的情况,那么在函数内部,局部变量会覆盖全局变量。比如下面这种:

python3 可以使用宏定义吗 python有宏定义吗_开发语言_17

在函数validation- check内部,我们定义了和全局变量同名的局部变量min- value,那么mean value在函数内部的值就应该是3而不是1了。

类似的,对于嵌套函数来说,内部函数可以访问外部函数定义的变量,但是无法修改,若要修改,必须加上那local这个关键字,如果不加上nanlocal这个关键字:

python3 可以使用宏定义吗 python有宏定义吗_python3 可以使用宏定义吗_18

而内部函数的变量又和外部函数变量同名,那么同样的内部函数变量会覆盖外部函数的变量。

python3 可以使用宏定义吗 python有宏定义吗_python入门_19

闭包

闭包其实和刚刚的嵌套函数类似,不同的是这里外部函数返回的是一个函数,而不是一个具体的值。返回的函数通常赋予一个变量,这个变量可以在后面被继续执行调用。

举个例子,比如我们想计算一个数的N次幂,用闭包可以写成下面的代码:

python3 可以使用宏定义吗 python有宏定义吗_python_20


这里外部函数nth-power()返回值是函数exponent-of(),而不是一个具体的数值。需要注意的是,在执行完square=nth-power(2)和cube=nth-power(3)后,外部函数nth-power()的参数exponent仍然会被内部函数exponent-of()记住,这样之后。我们调用square(2)或者cube(2)时,程序就能顺利的输出结果,而不会报错说参数exponent没有定义了。看到这里,你也许会想,为什么叫闭包呢?上面的程序我也可以写成下面的形式:

python3 可以使用宏定义吗 python有宏定义吗_开发语言_21

确实可以,不过要知道使用闭包的一个原因就是让程序变得更简洁易读。

其次,和上面讲到的嵌套函数优点类似,函数开头需要做一些额外工作,而你又需要多次调用这个函数时,将那些额外工作的代码放在外部函数,就可以减少多次调用导致的不必要的开销,提高程序的运行效率。

总结

第一,Python中函数的参数可以接受任意的数据类型,使用起来需要注意,必要时请在函数开头加入数据类型的检查。
第二,和其他语言不同,Python中函数的参数可以设定默认值。
第三,嵌套函数的使用能保证数据的隐私性,提高程序运行效率,
第四,合理的使用闭包则可以简化程序的复杂度,提高可读性。