3.1.2 序列解压
在实际应用中,我们经常会有将一个包含N个元素的元组或者序列,解压后同时赋值给N个变量的操作需求。
任何序列(或者可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量。唯一的前提就是变量的数量必须与序列元素的数量是一样的,代码(decompression_exp_1.py)示例如下:
# tuple decompression num_tup = (1, 2) x, y = num_tup print(f'x is:{x}, y is:{y}')
执行py文件,输出结果如下:
x is:1, y is:2
如果变量个数和序列元素的个数不匹配,会产生异常,代码(decompression_exp_1.py)示例如下:
# tuple decompression # 变量个数和序列元素的个数要匹配,否则产生异常 num_tup = (1, 2) try: x, y, z = num_tup except Exception as ex: print(f'出错了,出错原因:{ex}')
执行py文件,输出结果如下:
出错了,出错原因:not enough values to unpack (expected 3, got 2)
解压赋值可以用在任何可迭代对象上,而不仅仅是列表或者元组,包括字符串、文件对象、迭代器和生成器,代码(decompression_exp_1.py)示例如下:
# list object decompre Obj_list = ['abc', 10, 22.2, (2020, 3, 15)] str_obj, int_obj, float_obj, tuple_obj = obj_list print(f'tuple_obj is:{tuple_obj}') # int,float,tuple object decompression str_obj, int_obj, float_obj, (year, month, day) = obj_list print(f'year is:{year}, month is:{month}, day is:{day}') # str object decompression str_var = 'hello' a, b, c, d, e = str_var print(f'the value of a is:{a}')
执行py文件,输出结果如下:
tuple_obj is:(2020, 3, 15) year is:2020, month is:3, day is:15 the value of a is:h
若只想解压一部分,可能会丢弃其他值。对于这种情况,Python并没有提供特殊的语法,但可以使用任意变量名去占位,在结果中丢掉不需要的变量。在Python中,比较习惯用下划线(_)作为占位变量,代码(decompression_exp_1.py)示例如下:
_, _, f_obj, _ = obj_list print(f'f_obj is:{f_obj}')
执行py文件,输出结果如下:
f_obj is:22.2
使用占位变量有一个前提,就是必须保证选用的占位变量名在其他地方没被使用。
扩展:在代码中适当添加注释。对于程序员来说,养成一个随时为代码添加注释的习惯是非常好的,这对团队及自身都是很有帮助的。当然,这个前提是添加的注释是有用的,而不是有误导性的。
Python中有3种形式的代码注释:块注释、行注释及文档注释(Docstring)。这三种形式的惯用方法如下。
1)对于复杂的操作、算法以及一些其他人不易理解的技巧或者不能一目了然的代码,使用块或者行注释。
2)行注释一般放在需要注释代码的上一行,很多人习惯放在代码后面,那样很容易导致行过长,也容易破坏代码的美观性。
3)给外部可访问的函数和方法(无论是否简单)添加文档注释。注释要清楚地描述方法的功能,并对参数、返回值以及可能的异常进行说明,使外部调用者仅仅看文档注释就能正确使用。较为复杂的内部方法也应该添加尽可能详细的注释。
4)代码更新时,同时注意注释的更新,这是很多程序员的短板。在实际开发中,代码更新了,但没有同步更新注释,会导致其他代码维护者被注释误导,从而引发新的问题。