3.1 懒人炒菜机
1.函数是什么
集合的对应关系、数据的魔法盒子、 语句的封装
2.定义函数
def 函数名(参数) #命名定义的函数,并赋予形参
statement #执行下列语句
return (参数) #返回函数结果,可以同时返回多个值,函数结束
3.调用函数
1.给定实参 2.直接调用
a=5
b=6
x=square_sum(a, b)
print(x) # 结果为61
4.函数文档
即说明文档。
def square_sum(a,b):
"""return the square sum of two arguments"""
a = a**2
b = b**2
c = a + b
return c
在函数内容一开始的时候,增加了一个多行注释。这个多行注释同样有缩进。 它将成为该函数的说明文档。
如何调用:
help(square_sum)
3.2参数传递
1.基本传参
(1)位置对应
def print_arguments(a, b, c):
"""print arguments according to their sequence"""
print(a, b, c)
print_arguments(1, 3, 5) # 打印1、3、5
print_arguments(5, 3, 1) # 打印5、3、1
print_arguments(3, 5, 1) # 打印3、5、1
(2)关键字对应
print_arguments(c=5,b=3,a=1) # 打印1、3、5
2.包裹传参
1.元组包裹
def package_position(*all_arguments):
print(type(all_arguments))
print(all_arguments)
package_position(1,4,6)
package_position(5,6,7,1,2,3)
为了提醒Python参数all_arguments是包裹位置传递所用的元组名,我们在定义 package_position()时要在元组名all_arguments前加*号
2.字典包裹
def package_keyword(**all_arguments):
print(type(all_arguments))
print(all_arguments)
package_keyword(a=1,b=9)
package_keyword(m=2,n=1,c=11)
为了提醒,参数all_arguments是包裹关键字传递所用的字典,因此在 all_arguments前加**
3.解包裹
unpackage:把元组和字典拆分成一个个元素
3.3递归
在一个函数定义中调用这个函数自身。
为了不陷入死循环要设定一个程序能达到的终止条件。
3.3.2 函数栈
显著特征:先进后出
程序运行的过程,可以看作是一个先增长栈后消灭栈的过程。每次函数 调用,都伴随着一个帧入栈。如果函数内部还有函数调用,那么又会多一个帧入 栈。当函数返回时,相应的帧会出栈。等到程序的最后,栈清空,程序就完成了。
3.3.3 变量的作用域
python寻找变量的范围为当前帧+“主程序”中的定义,当在函数定义内部时,优先调用内部的定义。
函数的参数与函数内部变量类似。我们可以把参数理解为函数内部的变量。在函数调用时,会把数据赋值给这些变量。等到函数返回时,这些参数相关的变量会被清空。
3.4 引入那把宝剑
3.4.1 引入模块
在Python中,一个.py文件就构成一个模块。通过模块,你可以调用其他文件中的函数。而引入(import)模块, 就是为了在新的程序中重复利用已有的Python程序。Python通过模块,让你可以调用其他文件中的函数。
from 文件名 import 元素/定义
3.4.2 搜索路径
(1)python安装目录
(2)标准库的安装路径
(3)操作系统环境变量PYTHONPATH所包含的路径。
3.5异常处理
3.5.1 恼人的BUG
bug:程序缺陷,包含语法错误(无法执行)和语义错误(错误执行)
3.5.2 Debug
在程序内部插入简单的print()函数,就可以查看变 量的状态以及运行进度。有时,还可以将某个指令替换成其他形式,看看程序结果 有何变化,从而验证自己的假设。当其他可能性都排除了,那么剩下的就是导致错误的真正的原因。
测试驱动开发:适用于python
利用PyCharm的Debug功能
3.5.3异常处理
(1)在程序中止之前进行更多的操作,如提供错误信息
(2)在程序犯错后依然能运行下去。
网友评论