3.1 懒人炒菜机
3.1.1 函数是什么
- 集合的对应关系
- 数据转换的魔法盒子
- 语句的封装。输入数据被称为参数,参数能影响函数的行为。
3.1.2 定义函数
def 函数名(参数):
<执行>
return [表达式]
- 用关键词def开头。
- 参数可以有多个,也可以完全没有,但括号也要保留。
- 函数定义中的参数是一个形式代表来指代输入数据,并非真正数据,所以又称为形参。
- 当函数被调用时,Python将执行从属于函数的语句,直到从属语句结束。
- 关键字return用于说明函数的返回值,即函数的输出数据。还起到了中止函数和制定返回值的功能。
- 函数执行到return时就会结束,不管它后面是否还有其他函数定义语句。
- return后面没有返回值时,则函数将返回None。None是Python中的空数据,用来表示什么都没有。
- 关键字return返回多个值时等价于返回一个有多个数据的元组。
3.1.3 调用函数
- 直接使用函数名,在括号里加入具体的参数。此时的参数是一个实际的数据。所以,在函数调用时出现的参数称为实参。
- 如果一个函数有其他返回值,那么我们可以获得这个返回值
- Python通过参数出现的先后位置来对应形参。
- 参数可以是程序中已经存在的变量。
3.2 参数传递
3.2.1 基本传参
参数传递:把数据用参数的形式输入到函数。
位置传参:若有多个参数,那么在调用函数时,Python会根据位置来确认数据对应哪个参数。
关键字传参:在定义函数时,我们给了形参一个符号标记,即参数名。根据参数名来让数据与符号对应上。
混合使用:一部分的参数传递根据位置,另一部分根据参数名。在所有的位置参数都要出现在关键字参数之前。
形参默认值:调用时若不提供这些形参的具体数据,那么它们将采用定义时的默认值。
3.2.2 包裹传参
包裹传参:在不知道参数的个数时使用。
包裹位置传参:在调用函数时,所有的数据都根据先后顺序,收集到一个元组。 在函数内部,我们可以通过元组来读取传入的数据。定义函数时在元组名前加*号。
包裹关键字传参:与包裹位置传参相似,但数据容器为字典。每个关键字形式的参数调用,都会成为字典的一个元素。参数名成为元素的键,而数据成为元素的值。定义函数时在字典名前加**。
混合使用:
- 包裹位置传参和包裹关键字传参混合使用:定义函数时先写*元组名再写 **字典名。
- 包裹传参和基本传参混合使用: 先后顺序 位置→关键字→包裹位置→包裹关键字
3.2.3 解包裹
解包裹:把一个数据容器传递给函数,再自动地分解为各个参数。
- 在序列名前加*号。
- 在词典前加**号,每个键值对作为一个关键字传递给函数。
- 混合使用原则:位置→关键字→位置解包裹→关键字解包裹。
3.3 递归
3.3.1 高斯求和与数学归纳法
高斯求和公式:1+2+3+4+……+ n = (n+1)n /2
递归:在一个函数定义中,调用了这个函数自身。
- 关键是说明紧邻的两个步骤之间的衔接条件。
- 要求程序有一个能够达到的终止条件防止死循环。
数学归纳法:
证明某个命题对于自然数n成立:
1.证明命题对于n = 1成立。
2.假设命题对于n成立,n为任意自然数,则证明在此假设下,命题对于 n+1成立。
命题得证。
3.3.2 函数栈
数据结构:计算机存储数据的组织方式。
栈:数据结构的一种,可以有序地存储数据。后进后出。
帧:栈的元素。
弹出 pop:取出栈顶元素。
推入 push:将一个新的元素存入栈顶。
程序运行:先增长栈后消灭栈。每次函数调用,都伴随着一个帧入栈。如果函数内部还有函数调用,那么又会多一个帧入栈。当函数返回时,相应的帧会出栈。等到程序的最后,栈清空,程序就完成了。
3.3.3 变量的作用域
- Python寻找变量的范围不止是当前帧。它还会寻找函数外部,也就是Python的主程序中定义了的变量。
- 当主程序中已经有了一个变量,函数调用内部可以通过赋值的方式再创建了一个同名变量。函数会优先使用自己函数帧中的那个变量。且函数内部使用的是自己内部的那一份,所以函数内部对变量的操作不会影响到外部同名变量。
- 在函数调用时,会把数据赋值给变量。等到函数返回时,这些参数相关的变量会被清空。
- 对于数据容器来说,函数内部的更改会影响到外部。
3.4 引入那把宝剑
3.4.1 引入模块
模块:是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。能定义函数,类和变量,模块里也能包含可执行的代码。是比函数更高一层的封装模式。
引入 import:引入模块,调用其他文件中的函数或数据。
3.4.2 搜索路径
库:具有相关功能模块的集合。
- 标准库:Python官方提供的库。
- 第三方库:由其他的第三方机构发布提供的库。
寻找库的路径:
- 当前文件夹。
- 标准库的安装路径。
- 操作系统环境变量PYTHONPATH所包含的路径。可以修改PYTHONPATH这个环境变量,当PYTHONPATH包含模块所在的路径时,Python便可以找到那个模块。
3.5 异常处理
3.5.1 恼人的bug
bug:程序缺陷,会引发错误或者意想不到的后果。
运行时错误:只有在运行时编译器才会发现的错误。。由于Python是动态语言,许多操作必须在运行时才会执行,因此,Python要比静态语言更容易产生运行时错误。
语义错误:编译器认为你的程序没有问题,可以正常运行。但当检查程序时,却发现程序并非你想做的。
3.5.2 Debug
debug:修改程序缺陷的过程。
- 在程序内部插入简单的print()函数,就可以查看变量的状态以及运行进度。
- 将某个指令替换成其他形式,看看程序结果有何变化,从而验证自己的假设。
3.5.3 异常处理
异常处理:
- 让程序中止前进行更多的操作,比如提供更多的关于错误的信息。
- 是让程序在犯错后依然能运行下去。
try:
...
except exception1:
...
except exception2:
...
else:
...
finally:
...
- 如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较, 看是否是exception1、exception2……直到找到其归属,执行相应的except中的 语句。如果try中没有异常,那么except部分将跳过,执行else中的语句。
- finally是无论是否有异常,最后都要做的一些事情。
- 如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。
- 如果无法将异常交给合适的对象,那么异常将继续向上层抛出,直到被捕捉或者造成主程序报错
raise:在程序中主动抛出异常。
代码地址:https://gitee.com/sibyltui/learn_programming_from_python