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)
浙公网安备 33010602011771号