5.1 函数的定义
函数是对功能或者动作的封装
def 函数名(形参列表): # 形式参数
函数体(return)
return"返回值" # return表示返回,这个函数在调用之后会得到一个结果
函数名(实参列表) # 实际参数 将实际参数赋值给形式参数
变量 = 函数名 # 接收return返回值
def 函数名(形参列表): # 形式参数
函数体(return)
return"返回值" # return表示返回,这个函数在调用之后会得到一个结果
函数名(实参列表) # 实际参数 将实际参数赋值给形式参数
变量 = 函数名 # 接收return返回值
# 函数例子 -- 登录验证
def login(username, password):
if username == "Agoni" and password == "123":
return True
else:
return False
name = input("请输入账号")
password = input("请输入密码")
if login(name, password):
print("进入主页面")
else:
print("账号或密码错误")
# 函数例子 -- 登录验证
def login(username, password):
if username == "Agoni" and password == "123":
return True
else:
return False
name = input("请输入账号")
password = input("请输入密码")
if login(name, password):
print("进入主页面")
else:
print("账号或密码错误")
当函数执行之后,可以给调用者一个返回值 return 表示返回. 这个函数在调用之后会的得到一个结果.
- 在函数中不写return 表示函数没有返回值,调用方接收到的是None.
- return 可以终止一个函数的运行
- 在函数中写了return ,但是return 没有值,表示函数没有返回值,接收的是None
- 在函数中写return, 后面可以跟多个值,表示返回多个值,接收方收到的是元组
5.2 函数参数
# 参数:函数在调用的时候给函数传递的信息
1.形参: 在函数声明的位置的变量
2.实参:在函数调用的时候给出具体的值
3.传参:把实参赋值给形参的过程
# 实参的分类:
1. 位置参数,按照位置给形参赋值
2. 关键字参数.按照形参的名字给参数赋值
3. 混合参数.位置参数必须放在前面,关键字参数在后面
# 形参的分类:(3大类)
1. 位置参数. 按照位置来声明形参
2. 默认值参数. 当给参数传递值的时候,默认值不起作用. 默认值必须放在后面
3. 动态参数 (*args, **kwargs)
# 参数位置顺序 位置 *agrs 默认值 **kwargs
1. *args 位置参数的动态传参,系统会自动把所有的位置参数聚合成元组
2. **kwargs 关键字参数的动态传参,系统会自动把所有的关键字参数聚合成字典
3. def (*args,**kwargs) 无敌传参,可以是任何参数
# 参数:函数在调用的时候给函数传递的信息
1.形参: 在函数声明的位置的变量
2.实参:在函数调用的时候给出具体的值
3.传参:把实参赋值给形参的过程
# 实参的分类:
1. 位置参数,按照位置给形参赋值
2. 关键字参数.按照形参的名字给参数赋值
3. 混合参数.位置参数必须放在前面,关键字参数在后面
# 形参的分类:(3大类)
1. 位置参数. 按照位置来声明形参
2. 默认值参数. 当给参数传递值的时候,默认值不起作用. 默认值必须放在后面
3. 动态参数 (*args, **kwargs)
# 参数位置顺序 位置 *agrs 默认值 **kwargs
1. *args 位置参数的动态传参,系统会自动把所有的位置参数聚合成元组
2. **kwargs 关键字参数的动态传参,系统会自动把所有的关键字参数聚合成字典
3. def (*args,**kwargs) 无敌传参,可以是任何参数
5.3 函数参数举例
# 位置参数
def food(moring,noon,night):
print(moring,noon,night)
food("牛奶","面条","粥")
# 关键字参数
def food(moring,noon,night):
print(moring,noon,night)
food(noon="面条",night="粥",moring="牛奶")
# 混合参数 位置参数必须放在关键字参数前面
def food(moring,noon,night):
print(moring,noon,night)
food("牛奶","面条",night="粥")
# 默认值参数
def food(moring,noon,night="烧烤"):
print(moring,noon,night)
food("牛奶","饺子") # 牛奶 饺子 烧烤
food("面包","米饭") # 面包 米饭 烧烤
food("鸡蛋","凉皮") # 鸡蛋 凉皮 烧烤
# 动态参数 *args 位置动态参数
def Agoni(*food): # * 表示不定参数,可以传递任意个参数,接收到的是元组
print("我要吃",food)
Agoni("鸡翅","芝士肋排","烤肉")
# 我要吃 ('鸡翅', '芝士肋排', '烤肉')
# 动态参数 **kwargs 关键字传参的动态参数
def funk(**kwargs):
print(kwargs) # 接收到的是字典
funk(a=1,b=1,c=3)
# {'a': 1, 'b': 2, 'c': 3}
def funk(*args):
print(args)
lst = ["梅西","哈维","伊涅斯塔","皮克"]
funk(*lst) # *在实参位置表示打散,打散的是可迭代对象
# ('梅西', '哈维', '伊涅斯塔', '皮克')
def funk(**kwargs):
print(kwargs)
dic = {"阿根廷":"梅西","葡萄牙":"C罗","巴西":"内马尔"}
funk(**dic) # **在这里是把字典打散 此时字典中的key必须是字符串
# {'阿根廷': '梅西', '葡萄牙': 'C罗', '巴西': '内马尔'}
# * 处理剩下的元素
a,*b = (1, 2, 3, 4,)
print(a, b) # 1 [2, 3, 4]
*rest,a,b = range(5)
print(rest, a, b) # [0, 1, 2] 3 4
print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]
# 位置参数
def food(moring,noon,night):
print(moring,noon,night)
food("牛奶","面条","粥")
# 关键字参数
def food(moring,noon,night):
print(moring,noon,night)
food(noon="面条",night="粥",moring="牛奶")
# 混合参数 位置参数必须放在关键字参数前面
def food(moring,noon,night):
print(moring,noon,night)
food("牛奶","面条",night="粥")
# 默认值参数
def food(moring,noon,night="烧烤"):
print(moring,noon,night)
food("牛奶","饺子") # 牛奶 饺子 烧烤
food("面包","米饭") # 面包 米饭 烧烤
food("鸡蛋","凉皮") # 鸡蛋 凉皮 烧烤
# 动态参数 *args 位置动态参数
def Agoni(*food): # * 表示不定参数,可以传递任意个参数,接收到的是元组
print("我要吃",food)
Agoni("鸡翅","芝士肋排","烤肉")
# 我要吃 ('鸡翅', '芝士肋排', '烤肉')
# 动态参数 **kwargs 关键字传参的动态参数
def funk(**kwargs):
print(kwargs) # 接收到的是字典
funk(a=1,b=1,c=3)
# {'a': 1, 'b': 2, 'c': 3}
def funk(*args):
print(args)
lst = ["梅西","哈维","伊涅斯塔","皮克"]
funk(*lst) # *在实参位置表示打散,打散的是可迭代对象
# ('梅西', '哈维', '伊涅斯塔', '皮克')
def funk(**kwargs):
print(kwargs)
dic = {"阿根廷":"梅西","葡萄牙":"C罗","巴西":"内马尔"}
funk(**dic) # **在这里是把字典打散 此时字典中的key必须是字符串
# {'阿根廷': '梅西', '葡萄牙': 'C罗', '巴西': '内马尔'}
# * 处理剩下的元素
a,*b = (1, 2, 3, 4,)
print(a, b) # 1 [2, 3, 4]
*rest,a,b = range(5)
print(rest, a, b) # [0, 1, 2] 3 4
print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]
5.4 名称空间
1.Python最开始会开辟一个自己的命名空间 -- 内置命名空间
2.直接在py文件一个层面上是全局名称空间
a = 1
print(a)
3.在函数内部属于局部名称空间
def func():
s = 1
# 加载顺序: 内置 -- 全局 -- 局部
# 取值顺序: 局部 -- 全局 -- 内置
a = 1
def s():
print(a)
s()
1.Python最开始会开辟一个自己的命名空间 -- 内置命名空间
2.直接在py文件一个层面上是全局名称空间
a = 1
print(a)
3.在函数内部属于局部名称空间
def func():
s = 1
# 加载顺序: 内置 -- 全局 -- 局部
# 取值顺序: 局部 -- 全局 -- 内置
a = 1
def s():
print(a)
s()
5.5 作用域
# 作用域: 变量或者函数的声明周期
1. 全局作用域: 全局名称空间+内置名称空间
2. 局部作用域:局部名称空间
globals() 查看全局作用域中的内容
locals() 查看当前作用域中的内容
3. global nonlocal
global : 在局部引入全局变量
nonlocal : 在局部,引入离他最近的那一层变量
# 作用域: 变量或者函数的声明周期
1. 全局作用域: 全局名称空间+内置名称空间
2. 局部作用域:局部名称空间
globals() 查看全局作用域中的内容
locals() 查看当前作用域中的内容
3. global nonlocal
global : 在局部引入全局变量
nonlocal : 在局部,引入离他最近的那一层变量
5.6 函数的嵌套
def outer():
def inter():
print("我是内部")
print("我是外部")
inter()
outer()
# 我是内部
# 我是外部
def outer():
def inter():
print("我是内部")
print("我是外部")
inter()
outer()
# 我是内部
# 我是外部
# 函数的嵌套和 global , nonlocal 的结合
a = 10
def func():
global a # 引入全局中的变量a 可以定于全局变量
a = 20
print(a)
print(a) # 是全局中a的值
func() # 函数(局部)中a的值
print(a) # 将全局中a拉进函数内部,重新赋值,全局中a也改变
# 结果 10 20 20
def outer():
a = 10
def inner():
nonlocal a # 找的是局部当中,最近的上层变量
a = 20
print(a)
print(a) # 10
inner() # 20
print(a) # 20
outer()
# 函数的嵌套和 global , nonlocal 的结合
a = 10
def func():
global a # 引入全局中的变量a 可以定于全局变量
a = 20
print(a)
print(a) # 是全局中a的值
func() # 函数(局部)中a的值
print(a) # 将全局中a拉进函数内部,重新赋值,全局中a也改变
# 结果 10 20 20
def outer():
a = 10
def inner():
nonlocal a # 找的是局部当中,最近的上层变量
a = 20
print(a)
print(a) # 10
inner() # 20
print(a) # 20
outer()