十.函数
-
函数:执行特定任务以完成特定功能的一段代码
-
为什么需要函数
复用代码,隐藏实现细节,提高可维护性,提高可读性便于调试 -
函数的创建
语法结构:def 函数名(输入参数): 函数体 [return ...] #不一定有return函数
举例:
def calc(a,b): #输入参数为a和b两个参数,a和b为形参 c=a+b return c #函数返回值为参数a和b之和 print(calc(10,20)) #调用函数,10和20为实参
输出
30
形参和实参名称可以不同 -
匿名函数
语法结构:<函数名>=lambda<参数列表>:<表达式>
举例:
f=lambda x,y:x+y print(f(1,2))
输出
3
匿名函数用于在一行内定义一个简单的函数 -
函数分类
- 来源:python标准库函数(内置函数、模块函数)、第三方库函数、用户自定义函数
- 长度:单行(匿名函数)、多行(命名函数)
- 嵌套:无嵌套、简单嵌套、自嵌套(递归函数)
-
函数调用的参数传递
-
位置实参
根据形参的对应位置进行实参传递
举例:def calc(a,b): c=a/b return c print(calc(1,2))
输出
0.5
-
关键字实参
根据形参名称进行实参传递
以上面calc函数为例print(calc(b=1,a=2))
输出
2.0
-
默认参数
指定参数的默认值,但输入的实参小于形参个数,即使用默认值
举例:def calc(a,b=1): c=a+b return c print(calc(2))
输出
3
(形参a的值为给定的实参2,b的值为默认参数1) -
关键字参数
定义函数时在变量前加**,这些关键字参数在函数内部自动组装为一个dict(关键字参数可给定任意数量参数)
举例:def person(name,age,**kw): print('name:',name,'age:',age,'other:',kw) person('bob',35,m=1,n=2) person('bob',35,m=1,n=2,t=3)
输出
{'m': 1, 'n': 2} {'m': 1, 'n': 2, 't': 3}
-
命名关键字参数
可以限制关键字参数的名字,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
举例:def person(name,age,*,city,job): print(name,age,city,job) person('jack',128,city='beijing',job='engineer')
输出
jack 128 beijing engineer
但如果
person('jack',128,'beijing','engineer')
就会报错(因为没有输入关键字参数的名字)
-
-
参数补充知识
- 在函数调用过程中,进行参数的传递,如果是不可变对象,在函数体的修改不会影响实参的值,如果是可变对象,在函数体的修改会影响实参的值
举例:
def fun(a): a=1000 return a b=1 print(fun(b)) print(b)
输出
1000 1
b调用函数后为1000,但其本身仍然未改变,是1
-
当定义函数时即使用默认参数也使用可变参数,默认参数会退化为普通参数
-
参数定义的顺序:必选参数、默认参数、可变参数、命名关键字参数、关键字参数
- 在函数调用过程中,进行参数的传递,如果是不可变对象,在函数体的修改不会影响实参的值,如果是可变对象,在函数体的修改会影响实参的值
-
函数的返回值
函数返回多个值时,结果为元组 -
全局变量和局部变量
函数内定义的变量是局部变量,在函数体外部不可使用,函数外定义的变量是全局变量。
如果要在函数内定义全局变量,使用global
举例x = 1 def f(): global x x = 2 f() print(x)
输出
2
十一.解决bug
-
bug由来
粗心导致的语法错误、索引越界、知识点掌握不熟练、思路不清… -
try-except结构
语法结构:try: 可能会出现异常的代码 except 异常类型(可省略): 报错后执行的代码
多个except结构时,捕获异常的顺序按照先子类后父类的顺序,最大的父类是BaseException
举例:try: a=int(input('请输入第一个数')) b=int(input('请输入第二个数')) #a和b使用int函数进行强制类型转换 result=a/b print(result) except ZeroDivisionError: #b为0时 print('对不起,除数不能为0') except BaseException:1 print('对不起,您似乎没有输入整数')
-
try-except-else结构
果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块 -
try-except-else-finally结构
无论是否异常都执行finally块 -
python中常见异常类型
- ZeroDivisionError:除(取模)0
- indexError:序列中没有此索引
- KeyError;映射中没有这个键
- NameError:未声明/初始化对象
-
try-except-else-finally结构
无论是否异常都执行finally块 -
python中常见异常类型
- ZeroDivisionError:除(取模)0
- indexError:序列中没有此索引
- KeyError;映射中没有这个键
- NameError:未声明/初始化对象
- SyntaxError:Python语法错误;ValueError:传入无效参数