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()