2021-03-04

python-第六节-函数

函数的基本概念
1、一个程序由一个个任务组成,函数就是代表一个任务或者一个功能
2、函数就是代码复用的通用机制
python中函数的分类
1、内置函数
str list len
2、标准库函数
import
3、第三方库函数
开源社区的库
4、用户自定义函数
用户自定义

函数的定义和调用
核心要点
python语法如下:
def 函数名(参数列表):
文档字符串
函数体若干语句

要点:
1、我们使用def来定义函数,然后就是一个空格和函数名称:
(1)python执行def时,会创建一个函数对象,并绑定到函数名变量上
2、参数列表
(1) 圆括号内是形式参数列表,有多个参数则使用逗号隔开
(2) 形式参数不需要声明类型,也不需要指定函数返回值类型
(3) 无参数,也必须保留空的圆括号
(4) 实参列表必须与形参列表一一对应
3、return返回值
(1) 如果函数体中包含 return 语句,则结束函数执行并返回值;
(2) 如果函数体中不包含 return 语句,则返回 None 值。
4. 调用函数之前,必须要先定义函数,即先调用 def 创建函数对象
(1) 内置函数对象会自动创建
(2) 标准库和第三方库函数,通过 import 导入模块时,会执行模块中的 def 语句
我们通过时间定义函数来学习函数的定义方式

形参和实参:
在这里插入图片描述
上面的 printMax 函数中,在定义时写的 printMax(a,b)。a 和 b 称为“形式参数”, 简称“形参”。也就是说,形式参数是在定义函数时使用的。 形式参数的命名只要符合“标 识符”命名规则即可。 在调用函数时,传递的参数称为“实际参数”,简称实参。10,20就是实参

文档字符串(函数的注释)
程序的可读性最重要,一般建议在函数体开始的部分附上函数定义说明,这就是“文档字符 串”,也有人成为“函数的注释”。我们通过三个单引号或者三个双引号来实现,中间可以加入多行文字进行说明。
在这里插入图片描述
返回值
return 返回值要点:
如果函数体中包含 return 语句,则结束函数执行并返回值;
如果函数体中不包含 return 语句,则返回 None 值。
要返回多个返回值,使用列表、元组、字典、集合将多个值“存起来”即可。
在这里插入图片描述
函数也是对象,内存底层分析
执行函数后,系统创建相应的函数对象。执行如下程序,然后进行解释
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
显然,我们将内置函数对象 int()赋值给了变量 zhengshu,这样 zhengshu 和 int 都是指向 了同一个内置函数对象。当然,此处仅限于原理性讲解,实际开发中没必要这么做。

变量的作用域(全局变量和局部变量)
变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。
变量分为:全局变量、局部变量。
全局变量: 1. 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。2. 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。 3. 全局变量一般做常量使用。 4. 函数内要改变全局变量的值,使用 global 声明一下
局部变量: 1. 在函数体中(包含形式参数)声明的变量。 2. 局部变量的引用比全局变量快,优先考虑使用。 3. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
示例
在这里插入图片描述
输出局部变量和全局变量
在这里插入图片描述
局部变量和全局变量效率测试
局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。 在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度。
在这里插入图片描述
参数的传递
函数的参数传递本质上就是:从实参到形参的赋值操作。 Python 中“一切皆对象”, 所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不 是“值传递”。具体操作时分为两类: 1. 对“可变对象”进行“写操作”,直接作用于原对象本身。 2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填 充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”) 可变对象有: 字典、列表、集合、自定义的对象等 不可变对象有: 数字、字符串、元组、function 等

传递可变对象的引用
传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
示例
在这里插入图片描述
传递不可变对象的引用
传递参数是不可变对象(例如:int、float、字符串、元组、布尔值),实际传递的还是对 象的引用。在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。【操作】参数传递:传递不可变对象的引用
在这里插入图片描述
浅拷贝和深拷贝
为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以 使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。
浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象
在这里插入图片描述
在这里插入图片描述
注意是子对象的变化,浅拷贝子对象拷贝引用,深拷贝子对象拷贝内容

传递不可变对象包含的子对象时可变的情况
在这里插入图片描述
参数的几种类型

位置参数:函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,称为:“位置参数”。
在这里插入图片描述
在这里插入图片描述
默认值参数
我们可以为某些参数设置默认值,这样这些参数在传递时就是可选的。称为“默认值参数”。 默认值参数放到位置参数后面。
在这里插入图片描述在这里插入图片描述
可变参数
可变参数指的是“可变数量的参数”。分两种情况: 1. *param(一个星号),将多个参数收集到一个“元组”对象中。 2. **param(两个星号),将多个参数收集到一个“字典”对象中。
在这里插入图片描述
强制命名参数
在这里插入图片描述
lambda 表达式和匿名函数
lambda 表达式可以用来声明匿名函数。lambda 函数是一种简单的、在同一行中定义函数 的方法。lambda 函数实际生成了一个函数对象。 lambda 表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数 的返回值。
lambda 表达式的基本语法如下:
lambda arg1,arg2,arg3… : <表达式> arg1/arg2/arg3 为函数的参数。
<表达式>相当于函数体。运算结果是:表达式的运算结果。
在这里插入图片描述
eval()函数
功能:将字符串 str 当成有效的表达式来求值并返回计算结果。
语法: eval(source[, globals[, locals]]) -> value
参数:
source:一个 Python 表达式或函数 compile()返回的代码对象
globals:可选。必须是
dictionary locals:可选。任意映射对象
在这里插入图片描述
递归函数
递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类 似于大家中学数学学习过的“数学归纳法”。 每个递归函数必须包含两个部分:

  1. 终止条件 表示递归什么时候结束。一般用于返回值,不再调用自己。
  2. 递归步骤 把第 n 步的值和第 n-1 步相关联。 递归函数由于会创建大量的函数对象、过量的消耗内存和运算能力。在处理大量数据时,谨慎使用
    在这里插入图片描述
    嵌套函数
    在这里插入图片描述
    上面程序中,f2()就是定义在 f1 函数内部的函数。f2()的定义和调用都在 f1()函数内部。
    一般在什么情况下使用嵌套函数?
  3. 封装 - 数据隐藏 外部无法访问“嵌套函数”。
  4. 贯彻 DRY(Don’t Repeat Yourself) 原则 嵌套函数,可以让我们在函数内部避免重复代码。
  5. 闭包后面会详细讲解
    在这里插入图片描述
    nonlocal关键字
    nonlocal用来声明外层的局部变量
    global用来声明全局变量
    在这里插入图片描述
    LEGB规则
    Python 在查找“名称”时,是按照 LEGB 规则查找的:
    Local–>Enclosed–>Global–>Built in Local 指的就是函数或者类的方法内部
    Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
    Global 指的是模块中的全局变量 Built in 指的是 Python 为自己保留的特殊名称。
    如果某个 name 映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域 (enclosed)进行搜索,如果闭包作用域也没有找到,Python 就会到全局(global)命名空 间中进行查找,最后会在内建(built-in)命名空间搜索 (如果一个名称在所有命名空间 中都没有找到,就会产生一个 NameError)
    在这里插入图片描述
    我们依次将几个str注释掉,观察控制台打印的内容,体会LEGB的搜索顺序,就近原则

实操作业
1、定义一个函数实现反向输出一个整数,比如输入3245,输出5423
在这里插入图片描述
在这里插入图片描述

  1. 编写一个函数,计算下面的数列:
    在这里插入图片描述
    在这里插入图片描述
    3、输入三角形三个顶点的坐标,若游戏则计算三角形的面;如果坐标无效,则给出提示
    在这里插入图片描述
    4、输入一个毫秒数,将该数字换算成小时数,分钟数、秒数
    在这里插入图片描述
    5、使用海龟绘图,输入多个点,将这些点两两相连
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值