函数:
1.函数定义:
def 函数名(参数1,参数2,...):
执行代码
返回值
函数名(参数1,参数2...)#通过方法进行调用
1.1 形参
1.1.1 默认形参:
-
默认参数不能放首位
-
传入参数数量不足时,后面的参数使用默认值
1.1.2 位置形参
def 函数名(形参名1, 形参名2, ...):
pass
1.1.3 星号元组形参
-
将位置实参合并为一个元组
-
通用写法 *args
-
def foo(*args) print(*args) foo(1,2,3)
1.1.4 双星号字典形参
-
通用写法 **args
-
def foo(**kwargs) print(kwargs) foo(a=1,b=2,c=3)
1.1.5 命名关键字形参
def fun04(*args,a,b,c):
print(args)
print(a)
print(b)
print(c)
fun04(args1,2,3,a=4,b=5,c=6)
PS:两种星号形参常用于不确定传入的参数时
1.2 实参
1.2.1 位置实参
序列实参 :将序列拆分后,依次传入参数
list01=[1,2,3]
foo(*list01)
def foo(a,b,c):
print(a)
print(b)
print(c)
foo(a,b,c)
1.2.2 关键字实参
字典实参:将字典拆分后,依次传入参数
dict01={1,2,3}
foo(**dict01)
def foo(a,b,c):
print(a)
print(b)
print(c)
foo(a=2,b=3,c=3)
PS:当两种实参护混合使用时,位置实参必须放在关键字实参之前
1.3 可变和不可变变量
1.3.1 可变变量
定义:变量值能被修改的变量
可变变量类型有:列表、字典、结合等
1.3.2 不可变变量
定义:变量值不能被修改的变量
不可变变量类型有:整数、字符串、元组、空值、布尔值等
1.4 函数返回值
返回值:函数执行的结果,无返回值时,结果为空值
return 表达式
匿名参数
- 语法
lambda [函数的参数列表]: 表达式
- 作用
创建一个匿名函数对象
lambda是关键字,表示你正在定义一个匿名函数。
同 def 类似,但不提供函数名
[函数的参数列表]`是函数的参数,可以有零个或多个参数,参数之间用逗号分隔。
: 表达式是函数的返回值,通常是一个表达式,匿名函数会计算这个表达式并返回结果。
- 说明
lambda 表达式 的创建函数只能包含一个表达式
1.5 变量作用域
1.5.1 定义
一个变量声明以后,在哪里能够被访问使用,就是这个变量"起作用"的区域:也就是这个变量的作用域
一般来说,变量的作用域,是在函数内部和外部的区域 来体现,因此常常与函数有关。
1.5.2 全局变量
-
定义在函数外部,模块内部的变量称为全局变量
-
全局变量, 所有的函数都可以直接访问(取值,但函数内部不能直接将其赋值改变)
-
全局变量控制:gloabl 修改全局变量
1.5.3 局部 变量
-
定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
-
函数内部的变量只能在函数内部或者函数内部的函数内部访问 ,函数外部不能访问
-
局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
-
局部变量控制:nonlocal 修改局部变量
1.6 内存分配
1、将函数的代码存储到代码区,函数体中的代码不执行。
2、调用函数时,在内存中开辟空间(栈帧),存储函数内部定义的变量。
3、函数调用后,栈帧立即被释放。
1.7 函数递归
定义:函数直接或间接调用自己
# 函数直接的调用自身
def f():
f() # 调用自己
# 此递归达最大深度出错
# f()
print("递归完成")
# 函数间接的调用自身
def fa():
fb()
def fb():
fa()
fa()
print("递归完成")
说明:
-
递归一定要控制递归的层数,当符合某一条件时要终止递归调用
-
几乎所有的递归都能用while循环来代替
递归的实现方法:
-
先假设此函数已经实现
递归优缺点:
-
优点:
-
递归可以把问题简单化,让思路更为清晰,代码更简洁
-
-
缺点:
-
递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果
-