零基础 | 入门python 09 自定义函数,函数变量作用域、闭包

本文详细介绍了Python函数的基础概念、自定义函数的定义与使用方法、参数类型及作用域等内容,并通过实例讲解了闭包的应用。

前言

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

Python的自定义函数。

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

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

Python 定义函数使用 def 关键字,一般格式如下:
在这里插入图片描述
函数的定义主要有如下要点:

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

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

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

在这里插入图片描述
函数有三中不同的参数:
普通参数
默认参数
动态参数

在这里插入图片描述
默认参数,函数传递参数的默认值
在这里插入图片描述
动态参数,有如下特点:

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

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

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

在这里插入图片描述
在这里插入图片描述
2.> **kwargs 接收参数操作实例
在这里插入图片描述
更进一步操作.
在这里插入图片描述
混搭使用
在这里插入图片描述
如果*arg也需要接收参数,那么前面不能有默认参数,不然调用时会报错.
在这里插入图片描述
return语句,return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:

在这里插入图片描述
匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.(匿名函数没有函数名)
匿名函数用关键字lambda定义
定义普通函数和定义lambda函数的方法和区别.
在这里插入图片描述
在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:
在这里插入图片描述
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

函数变量作用域

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

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

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

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

在这里插入图片描述

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

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

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

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

而内部函数的变量又和外部函数变量同名,那么同样的内部函数变量会覆盖外部函数的变量。
在这里插入图片描述

闭包

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

举个例子,比如我们想计算一个数的N次幂,用闭包可以写成下面的代码:
在这里插入图片描述
这里外部函数nth-power()返回值是函数exponent-of(),而不是一个具体的数值。需要注意的是,在执行完square=nth-power(2)和cube=nth-power(3)后,外部函数nth-power()的参数exponent仍然会被内部函数exponent-of()记住,这样之后。我们调用square(2)或者cube(2)时,程序就能顺利的输出结果,而不会报错说参数exponent没有定义了。

看到这里,你也许会想,为什么叫闭包呢?上面的程序我也可以写成下面的形式:
在这里插入图片描述

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

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

总结

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

如果你也正在学python或者准备学python,这份学习资料会对你有用

零基础Python学习指南

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉100道Python练习题👈

检查学习结果。

👉面试刷题👈


👉资料领取👈

这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加“住隔壁的王叔”,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值