发布时间:2022-12-07 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

1.局部变量和全局变量

在函数外定义的不可变数据类型,在函数里面是可读不可写
在函数外定义的可变数据类型,在函数里面可读可写
不可变类型传入函数,进行的操作不会影响到外面的变量
但是当我们声明一个变量为全局变量后,进行的操作会影响到函数外的变量

可变数据类型,传入和直接使用都会改变原本的数据
不可变数据类型 直接使用是可读不可写的
传入后的操作不会对函数外的变量造成影响
声明为全局变量后,可读可写,并且会对函数外的变量造成影响


# 1.在函数外定义的不可变数据类型
# 在函数里面是可读不可写
b = 1
def func():
    print(b)  # 可以运行成功
    # b += 1  # 报错
    # print(b)

func()

python中的函数进阶

# 2.不可变类型传入函数,进行的操作不会影响到外面的变量
# 但是参数可以传进来
b = 1
def func(b):
    b += 1
    print(b)
func(b)  # 2
print(b)  # 1

python中的函数进阶

# 3.在函数外定义的可变数据类型
# 在函数里面可读可写
l1 = [1, 2, 3]
def func():
    l1.append(6)
    print(l1)
func()

python中的函数进阶

# # 4.global
# # 只能在一个局部的情况下使用
# # 当一个函数外的不可变数据类型在函数内读和写并对原本的变量修改时,用global声明
b = 1
def func():
    # global 声明一个变量为全局变量
    global b
    b += 1
    print(b)
func()  # 2
# 但是当我们声明一个变量为全局变量后,进行的操作会影响到函数外的变量
print(b)  # 2

python中的函数进阶

# 例子
my_money = 10000
def add(money: int):  # 形参money
    """奖金加钱"""
    global my_money
    my_money += money
    print(f'当前余额{my_money}')
def reduce(money: int):  # 形参money
    """罚款减钱"""
    global my_money  # 注意这里也要声明!!!
    my_money -= money
    print(f'当前余额{my_money}')
add(1000)  # 实参1000
add(2000)
reduce(4000)
reduce(666)

python中的函数进阶

2.函数传参

# 1.形参与实参
# 形参和实参的个数需要一样
# 实参形参的位置顺序必须一样
def func(name, age):  # 形参
    print(f'我的名字是{name},我的年龄是{age}')
my_name = '小明'
my_age = 20
func(my_name, my_age)  # 实参

python中的函数进阶

# 2.关键字参数
# 关键字传参 关键字不需要加引号
# 优点:可以打乱参数的传入顺序
# 需要注意:关键字参数一定全都要写到最后面
# 不过一般是如果写关键字就都写关键字了
def func(money, name, age):  # 形参
    print(f'我的名字是{name},我的年龄是{age}\n'
          f'我的钱是{money}')
my_name = '小明'
my_age = 20
func(100, age=my_age, name=my_name)  # 实参

python中的函数进阶

# 3.默认参数
# 可写可不写
# 不写则使用默认参数
# 写了则使用传入的参数
# 默认参数一定要写在最后,否则报错
def func(name, age, money=1000, gender=''):  # 默认参数gender
    print(f'我的名字是{name},我的年龄是{age}\n'
          f'我的钱{money},我的性别{gender}')
my_name = '小明'
my_age = 20
func(my_name, my_age, 100, '')  # 实参

python中的函数进阶

# 4.不定长参数 不定长关键字参数
# *args 也可以是*a *xxx
# **kwargs 也可以是**a **xxx
# key word args
# 加了一个星号 * 不定长参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
# 加了两个星号 ** 的参数会以字典的形式导入,存放已命名的变量参数。
def func(name, *args):
    print(args)  # 是元组
    print(*args)  # 包本身  一般不会使用*args而使用args
    print(f'{name}菜里面的调料有{args}')
func('小明', '番茄酱', '辣椒粉', '孜然粉')
def func1(name, **kwargs):
    print(kwargs)
    # print(**kwargs)  # 报错
    print(f'{name}菜里面的调料有{kwargs}')
func1('小明', t1='番茄酱', t2='辣椒粉', t3='孜然粉')

python中的函数进阶

今日作业

# 定义一个模拟ATM机操作的场景
# 1)需要一个存钱和取钱的函数
# 2)设置全局默认资金1000
# 3)调用存钱函数,存放800元,并将操作后函数将余额打印出米(1000+800= 1800)
# 4)调用取钱函数,取钱500元,并将操作后函数将余额打印出来(1800-500=1300)
money = 1000
def add_money(money1: int):
    """存钱函数"""
    global money  # 声明money为全局变量
    money += money1
    print(f'余额是{money}')
def reduce_money(money2: int):
    global money  # 注意这里也要声明!!!
    money -= money2
    print(f'余额是{money}')
add_money(800)  # 调用存钱函数,存放800元
reduce_money(500)  # 调用取钱函数,取钱500元

python中的函数进阶