PYTHON训练营DAY29(补)
# 带默认值的参数必须放在没有默认值的参数之后
一、函数的参数类型
(一)位置参数
场景:点奶茶时,店员会按顺序问你三个问题:
-
尺寸?(小杯 / 中杯 / 大杯)
-
配料?(珍珠 / 椰果 / 布丁)
-
几分糖?(无糖 / 三分 / 五分 / 全糖)
关键点:
-
必须按顺序回答,不能跳过或颠倒。
-
如果只回答了两个问题,店员会懵圈(报错)
def order_milk_tea(size, topping, sugar):return f"您点了{size},加{topping},{sugar}糖。"# 调用时按位置传递参数
order_milk_tea("大杯", "珍珠", "三分") # 正确
order_milk_tea("珍珠", "三分", "大杯") # 错误!顺序错乱
order_milk_tea("中杯", "布丁") # 错误!缺少参数
但是,关键字参数可以不用按照顺序来
场景:填写在线表格
-
位置参数:必须按固定顺序填写(如先填姓名,再填年龄,最后填城市)。
-
关键字参数:可以随意顺序填写(如先填城市,再填姓名,最后填年龄),只要标明每个字段的名称
# 函数定义(参数名是关键)
def register_user(name, age, city):return f"{name},{age}岁,住在{city}。"# 关键字参数调用(位置不重要)
register_user(city="上海", name="李四", age=30) # 正确!
(二)默认参数
带默认值的参数必须放在没有默认值的参数之后
def describe_pet_default(pet_name, animal_type="狗"): # animal_type 有默认值"""显示宠物的信息,动物类型默认为狗。"""print(f"我有一只 {animal_type}.")print(f"我的 {animal_type} 的名字叫 {pet_name.title()}.")describe_pet_default(pet_name="小黑") # animal_type 使用默认值 "狗"
describe_pet_default(pet_name="雪球", animal_type="仓鼠") # 提供 animal_type,覆盖默认值
# 注意:带默认值的参数必须放在没有默认值的参数之后
(三)args
-
*args
会将多余的位置参数收集为一个元组(tuple)。 -
常用于不确定会传入多少个参数的场景
def print_info(name, *args):print(f"姓名:{name}")print(f"其他信息:{args}") # 多余的参数被收集到args中print_info("张三", 25, "北京", "工程师")
# 输出:
# 姓名:张三
# 其他信息:(25, '北京', '工程师')
(四)kwargs
-
**kwargs
会将多余的关键字参数收集为一个字典(dict)。 -
常用于不确定会传入哪些关键字参数的场景
def print_user_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_user_info(name="李四", age=30, city="上海")
# 输出:
# name: 李四
# age: 30
# city: 上海
二、变量作用域
区分全局变量和局部变量
x = 10 # 全局变量(模块顶层定义)def func():y = 20 # 局部变量(函数内部定义)print(x) # 可以访问全局变量 xprint(y) # 可以访问局部变量 yfunc()
print(x) # 可以访问全局变量 x
print(y) # 报错:无法访问局部变量 y
局部变量
def calculate():x = 10 # 局部变量print(x) # 正确:函数内部可以访问 xcalculate() # 输出:10
print(x) # 错误:函数外部无法访问 x
全局变量
x = 10 # 全局变量def read_global():print(x) # 正确:函数内部可以读取全局变量def modify_global_error():x = 20 # 这里会创建一个新的局部变量 x,而非修改全局 xdef modify_global_correct():global x # 声明要修改全局变量x = 20 # 正确:修改全局变量read_global() # 输出:10
modify_global_error()
read_global() # 输出:10(全局变量未被修改)
modify_global_correct()
read_global() # 输出:20(全局变量被修改)