1.交换两个变量
>>> author, reader = 'piglei', 'raymond'
>>> author, reader = reader, author ➊
>>> author
'raymond'
2.变量解包
变量解包(unpacking)是Python里的一种特殊赋值操作,允许我们把一个可迭代对象(比如列表)的所有成员,一次性赋值给多个变量:
>>> usernames = ['piglei', 'raymond']
# 注意:左侧变量的个数必须和待展开的列表长度相等,否则会报错
>>> author, reader = usernames
>>> author
'piglei'
假如在赋值语句左侧添加小括号(...),甚至可以一次展开多层嵌套数据:
>>> attrs = [1, ['piglei', 100]]
>>> user_id, (username, score) = attrs
>>> user_id
1
>>> username
'piglei'
除了上面的普通解包外,Python还支持更灵活的动态解包语法。只要用星号表达式(*variables)作为变量名,它便会贪婪[插图]地捕获多个值对象,并将捕获到的内容作为列表赋值给variables。比如,下面data列表里的数据就分为三段:头为用户,尾为分数,中间的都是水果名称。通过把*fruits设置为中间的解包变量,我们就能一次性解包所有变量——fruits会捕获data去头去尾后的所有成员:
>>> data = ['piglei', 'apple', 'orange', 'banana', 100]
>>> username, *fruits, score = data
>>> username
'piglei'
>>> fruits
['apple', 'orange', 'banana']
>>> score
100
和常规的切片赋值语句比起来,动态解包语法要直观许多:
#1. 动态解包
>>> username, *fruits, score = data
# 2. 切片赋值
>>> username, fruits, score = data[0], data[1:-1], data[-1]
# 两种变量赋值方式完全等价
上面的变量解包操作也可以在任何循环语句里使用:
>>> for username, score in [('piglei', 100), ('raymond', 60)]:
... print(username)
...
piglei
raymond
3.单下划线变量名_
在常用的诸多变量名中,单下划线_是比较特殊的一个。它常作为一个无意义的占位符出现在赋值语句中。_这个名字本身没什么特别之处,这算是大家约定俗成的一种用法。举个例子,假如你想在解包赋值时忽略某些变量,就可以使用_作为变量名:
#忽略展开时的第二个变量
>>> author, _ = usernames
# 忽略第一个和最后一个变量之间的所有变量
>>> username, *_, score = data
而在Python交互式命令行(直接执行python命令进入的交互环境)里,_变量还有一层特殊含义——默认保存我们输入的上个表达式的返回值:
>>> 'foo'.upper()
'FOO'
>>> print(_) ➊
FOO
❶此时的_变量保存着上一个.upper()表达式的结果
4.给变量注明类型
4.1 Sphinx格式法:
def remove_invalid(items):
"""剔除 items 里面无效的元素
:param items: 待剔除对象
:type items: 包含整数的列表,[int, ...]
"""
4.2 类型注解法(Python 3.5版本以上):
方法:在变量后添加类型,并用冒号隔开即可,比如func(value:str)表示函数的value参数为字符串类型。
下面是给remove_invalid()函数添加类型注解后的样子:
from typing import List
def remove_invalid(items: List[int]): ➊
"""剔除 items 里面无效的元素"""
... ...
❶List表示参数为列表类型,[int]表示里面的成员是整型[插图]
注:“类型注解”只是一种有关类型的注释,不提供任何校验功能。要校验类型正确性,需要使用其他静态类型检查工具(如mypy等)。
5.变量命名原则
- 普通变量,使用蛇形命名法,比如max_value;·
- 常量,采用全大写字母,使用下划线连接,比如MAX_VALUE;
- 如果变量标记为“仅内部使用”,为其增加下划线前缀,比如_local_var;·
- 当名字与Python关键字冲突时,在变量末尾追加下划线,比如class_。
- 类名应该使用驼峰风格(FooClass)
- 函数应该使用蛇形风格(bar_function)
- 布尔值变量名示例
- 匹配int/float类型的变量名救示例
- 使用以_id结尾的单词,比如user_id、host_id;
- 使用以length/count开头或者结尾的单词,比如length_of_username、max_length、users_count。
- 最好别拿一个名词的复数形式来作为int类型的变量名,比如apples、trips等,因为这类名字容易与那些装着Apple和Trip的普通容器对象(List[Apple]、List[Trip])混淆,建议用number_of_apples或trips_count这类复合词来作为int类型的名字。
- 数组索引三剑客i、j、k
- 某个整数n
- 某个字符串s
- 某个异常e
- 文件对象fp
- 在同一段代码内,不要出现多个相似的变量名,比如同时使用users、users1、users3这种序列;
- 可以尝试换词来简化复合变量名,比如用is_special来代替is_not_normal;