Day11-函数进阶

一、传入参数

# 不可变数据类型 可读不可写(字符串 元组)
# 可变数据类型 可读可写(列表 字典 集合)

b = 1
l1 = [1, 2, 3]

def func():
    # b += 1      #UnboundLocalError: local variable 'b' referenced before assignment
    # print(b)

    l1.append(1)
    print(l1)  # [1, 2, 3, 1]
func()

 

def func(b):
    b += 1  # 不可变数据类型传入函数,对外部变量无影响
    print(b)
func(b)  # 2
print(b)  # 1

 

def func():
    # global 声明一个变量为全局变量
    global b  # 声明b为全局变量
    b += 1
    print(b)
func()  # 2
print(b)  # 2

# 不可变类型参数传入函数,进行的操作不会影响到外面的变量
# 声明一个变量为全局变量,进行操作会影响到外面的变量

# 传入参数 不影响外部
# global 影响外部

# 可变数据类型 传入还是直接使用都是会改变原本的数据的进行影响
a=[1,2,3]
def func1(a):
    a.pop()
    print(a)
func1(a)    #[1, 2]
print(a)    #[1, 2]

a = [1, 2, 3]
def func1():
    a.pop()
    print(a)
func1()  # [1, 2]
print(a)  # [1, 2]

总结:

# 不可变数据类型 直接使用 可读不可写  传入后的操作不会对外面的变量造成影响
# 声明为全局变量的时候 就可以直接使用,并且会对外面的变量造成影响

案例:

my_money = 10000

def add(money):
    """奖钱"""
   
global my_money
    my_money = my_money + money
    print(f'当前余额{my_money}')

def bdd(money):
    """罚款"""
   
global my_money
    my_money = my_money - money
    print(f'当前余额{my_money}')

add(1000)   #当前余额11000
add(2000)   #当前余额113000
bdd(3000)   #当前余额10000

二、形参与实参

1、

# def func(name, age, money):  # 形参
#     print(f'我的名字是{name},我的年龄是{age}')

# my_name = '小明'
# my_age = 20
# func(my_name, my_age, 100)  # my_name,my_age 实参
#我的名字是小明,我的年龄是20

2、

# 关键字传参
def func(name, age, money, gender):  # 形参
    print(f'我的名字是{name},我的年龄是{age} {money} {gender}')

my_name = '小明'
my_age = 20
func(name=my_name, age=my_age, money=100, gender='女')  # my_name,my_age 实参
# 关键字传参 关键字不需要加引号  优点 可以打乱参数传入顺序
# 关键字参数一定全部写在最后面

3、

# 默认参数  可写可不写  不写使用默认参数  写了使用传入参数
# def func(name, age, money, gender='男'):
#     print(f'我的名字是{name},我的年龄是{age} {money} {gender}')

# my_name = '小明'
# my_age = 20
# func(my_name, my_age, 100, '女')  # my_name,my_age 实参
# 我的名字是小明,我的年龄是20 100 女

4、

# 不定长参数 不定长关键字参数 keyword
# *args, **kwargs

def func(name, *args):
    print(*args)  # 包本身
    print(args)  # 元组
    print(f'{name}菜里面的调料有{args}')
func('小明', '番茄酱', '辣椒粉', '孜然粉')  # 调料

 

def func(name, **kwargs):
    print(kwargs)  # {'t': '番茄酱', 't1': '辣椒粉', 't2': '孜然粉'}
    print(f'{name}菜里面的调料有{kwargs}')  # 小明菜里面的调料有{'t': '番茄酱', 't1': '辣椒粉', 't2': '孜然粉'}

func('小明', t='番茄酱', t1='辣椒粉', t2='孜然粉')  # 调料

其他:
1、  作用域=命名空间
2、  作用域:内建变量(built in)>全局变量(global)>嵌套(enclosing)>局部变量(local)
3、  优先级:内建变量(built in)<全局变量(global) <嵌套(enclosing) <局部变量(local)



posted @ 2023-02-09 16:16  Py小阿白  阅读(19)  评论(0)    收藏  举报