在 Python 函数内部,对变量进行赋值操作(例如 x = 5)时,如果没有使用 global 关键字进行声明,Python 会默认创建一个新的局部变量。
这个新创建的局部变量会与同名的全局变量“重名”,并在函数内部“遮蔽”掉全局变量。这意味着,在函数内部对该变量的所有操作都只作用于这个新的局部变量,而不会影响到函数外部的全局变量。
🤔为什么会这样?
这背后是 Python 作用域查找的 LEGB 规则
L (Local) - 局部作用域
E (Enclosing) - 嵌套作用域
G (Global) - 全局作用域
B (Built-in) - 内置作用域
在函数内部读取一个变量时,Python 会按照 L -> E -> G -> B 的顺序查找。但是,在函数内部赋值一个变量时,Python 会默认将其视为局部作用域(L)的变量,并直接在局部作用域中创建或修改它。
题目2:在调用 abnum 函数时,为防止因参数顺序混淆而传错位置,应通过关键字参数直接标明各参数的值。题目3:在个人资料填写场景中,若选择女性则性别为女,未选择时默认为男。请通过定义带有缺省参数的 gender 函数实现该功能,要求函数输出“所选性别为*”,并能成功调用运行。题目4:请声明一个名为 num 的函数。要求该函数能够接受任意数量的非关键字参数,并在函数内部遍历并打印出每一个参数的值。不定长元组类型参数的使用:
在 Python 中,如果不确定调用时会传入多少个参数,可以使用不定长参数(通常写作 *args)作为形参。
>>作用:它会将所有传入的非关键字参数收集起来,打包成一个元组。
>>遍历:在函数内部,可以通过遍历这个元组来访问每一个具体的参数值
不定长参数的作用:当无法预知参数个数时,使用不定长参数作为形参,可以让函数灵活地接收并处理多个实参。
现有字典 {"name": "电脑", "price": "7000"}。请定义一个名为 num 的函数,要求使用不定长参数接收该字典的键值对,并在函数内部遍历打印,输出格式需符合 key:键 value:值 的规范。调用时:使用 ** 操作符将字典解包,把键值对作为关键字参数传入。定义时:使用 **kwargs 不定长关键字参数接收,它会将所有传入的参数自动组装成一个字典。遍历时:使用 .items() 方法同时获取键和值。请定义一个名为 num 的函数,使其能够灵活应对不同数量和类型的参数调用。具体要求如下:
兼容性要求:该函数必须能正常处理以下三种调用情况:
num(1, 2, a=3, b=4):既有位置参数,又有关键字参数。
num(3, 4, 5, 6, a=1):多个位置参数,少量关键字参数。
num(a=1, b=2):仅包含关键字参数。
1.定义一个空字典 my_dict
# 方法一my_dict = {}# 方法二my_dict = dict()# 虽然这两种方法的结果都是创建一个空字典,但在实际开发中有一些细微的区别:# my_dict = {} (字面量)# 特点:这是 Python 中最常用、最推荐的写法。# 优势:代码更简洁,且在 Python 内部实现上,它的创建速度通常比 dict() 稍快一点。# my_dict = dict() (内置类构造)# 特点:这是调用 Python 的内置类 dict 来实例化一个对象。# 优势:虽然写起来稍微长一点,但它在某些特定场景下很有用,比如需要通过关键字参数快速初始化字典时(例如 dict(a=1, b=2))。# dict(a=1, b=2) 的本质是:向 dict() 这个构造函数传递了命名参数,而 dict() 内部逻辑会将这些参数名作为键,参数值作为值,直接组装成一个新的字典。2.字典的灵活操作
3.for 循环遍历输出
现有字典 dict1 = {'name': 'chuanzhi', 'age': 18},请完成以下任务:
使用循环将字典中所有的 键 输出到屏幕上
使用循环将字典中所有的 值 输出到屏幕上
使用循环将字典中所有的 键值对 按指定格式输出到屏幕上
获取所有键:使用 dict1.keys() 方法,返回字典中所有键的迭代器,通过 for 循环遍历输出。
获取所有值:使用 dict1.values() 方法,返回字典中所有值的迭代器,通过 for 循环遍历输出。
获取所有键值对:使用 dict1.items() 方法,返回字典中所有键值对的迭代器(每个元素是一个元组 (key, value)),通过 for 循环解包为 key 和 value,并按 key:value 格式输出。
4.列表和字典的混合使用
现有商品列表 product,其中包含多个字典,每个字典代表一个商品及其价格:
product =[{"name":"电脑","price":7000},{"name":"鼠标","price":30},{"name":"usb电动小风扇","price":20},{"name":"遮阳伞","price":50},]
小明一共有 8000 块钱,请判断他能否买下列表中的 所有 商品。如果能,请输出“能”,否则输出“不能”。
| | |
|---|
| 旧式 (%) | print("%.3f" % num) | |
| 新式 (f-string) | print(f"{num:.3f}") | |
| | |
| 旧式 (%) | print("%06d" % num1) | |
| 新式 (f-string) | print(f"{num1:06d}") | |
格式化输出(控制数据显示样子)的写法
%.3f(保留 3 位小数)这是旧式格式化(% 格式化)的写法,专门用于浮点数(小数)。
3 表示精度,对于小数来说,就是保留小数点后 3 位。效果:
如果数字是 3.14159,使用 %.3f 后会变成 3.142(会自动四舍五入)
%06d(补零占位)这也是旧式格式化的写法,专门用于整数。
% 占位符开始。
0 表示填充字符。如果数字不够长,用 0 来填补空白(默认是用空格填补)。6 表示最小宽度。输出的内容至少要占 6 个字符的位置。效果:假设 num1 = 1: