python入门系列第十一篇: 赋值与表达式

135 阅读4分钟
原文链接: zhuanlan.zhihu.com
赋值语句
标识符 = 对象  # python中一切皆对象
  • 赋值语句建立对象引用值

python变量更像是一个指针, 赋值语句会把对象引用值存储在变量名中或者数据结构的元素里面。

  • 变量名在首次赋值时候就会被创建
  • 变量名在引用之前一定要先赋值
  • 一些隐式赋值操作

在python中有一些情况下, 不是使用=进行赋值, 而是隐式赋值运算, 如模块引入, 函数和类的定义, for循环, 函数参数等。



下面是一些不同的赋值语句的形式

spam = 'spam'  # 基本赋值
spam, ham = 'spam', 'ham' # 元组分解赋值 (位置性)
[spam, ham] = ['spam', 'ham'] # 列表赋值(位置性)
a, b, c, d = 'abcd' # 序列赋值(通用性)
a, *b = 'abcd' # 扩展的序列解包
spam = ham = 'lunch' # 多目标赋值
spam += ' hello ' # 增强赋值
  • 元组分解赋值
>>> name, age = 'kobe', 20
>>> name
'kobe'
>>> age
20
>>> a, b, c = range(3)
>>> a ,b ,c
(0, 1, 2)
>>>
  • 列表分解赋值
>>> [l1, l2] = [[1,2], [3, 4]]
>>> l1
[1, 2]
>>> l2
[3, 4]
>>>
  • 扩展的序列解包

使用带*的名称时候, 左边的目标的项数就不需要跟主体序列长度匹配了。

>>> beijing, *citys = ['beijing', 'jiangxi', 'hubei', 'shanghai']
>>> beijing
'beijing'
>>> citys
['jiangxi', 'hubei', 'shanghai']


>>> a, *b, c = 'hello'
>>> a
'h'
>>> b
['e', 'l', 'l']
>>> c
'o'
>>>


>>> a, b, c, *d = 'kobe'
>>> d
['e']
>>>


>>> a, b, c , d, *e = 'kobe'
>>> e
[]
>>> a, b, c, d
('k', 'o', 'b', 'e')
>>>


>>> a, d, *e, c, d = 'kobe'
>>> e
[]
>>>


>>> a, b = 'hello'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> a, b, *c, d = 'hello'
>>> c
['l', 'l']
>>> a, b, *c, *d, e = 'hello'
  File "<stdin>", line 1
SyntaxError: two starred expressions in assignment
>>> *a = 'hello'
  File "<stdin>", line 1
SyntaxError: starred assignment target must be in a list or tuple
>>> *a, = 'hello'
>>> a
['h', 'e', 'l', 'l', 'o']
>>>
  • 多重目标赋值

多目标赋值时候针对可变数据类型, 需要注意引用共享问题。

>>> str1 = str2 = 'kobe'
>>> str1
'kobe'
>>> str2
'kobe'
>>>

等同于

>>> str2 = 'kobe'
>>> str1 = str2
>>> str1
'kobe'
>>> str2
'kobe'
>>>
  • 增强赋值语句
a += 2 等同于 a = a + 2

常见的增强赋值语句有:

x += y  x &= y  x -= y  x |= y
x *= y  x ^= y  x /= y  x >>= y
x %= y  x <<= y  x **= y x //= y

增强赋值语句的优点:

1. 程序输入更少, 简洁
2. 左侧只需要计算一次, 因此增强语句执行速度快
3. 对于支持在原处修改的对象来说, 增强形式会自动执行原处修改运算, 而不是相对来说速度更慢的复制

举例说明+=增强操作是对可变对象的原处操作。

>>> a = [1, 2, 3]
>>> b = a
>>> a = a + [4]  # +操作总是返回一个新的对象
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]

>>> a = [1, 2, 3]
>>> b = a
>>> a += [4]  # 在原处修改
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]


变量的命名规则
(下划线或者字母) + (任意数目的字母, 数字,下划线)

python变量是区分大小写的, 另外禁止使用保留字。


命名惯例

开发者pythoner都会遵循一些基本的命名惯例。

- 以单一下划线开头的变量名(_x), 不会被from module inport * 语句导入
- 前后都有下划线的变量名(_x_)属性系统定义的变量名, 具有特殊意义
- 以两个下划线开头, 但是结尾没有两个下划线的变量名(__x), 是类的本地变量
- 类变量名通常以大些字母开头
- 模块变量名通常以小写字母开头


表达式语句

在python中我们可以使用表达式做为语句(本身只占一行),通常有两张情况下表达式做为语句。

调用函数与方法
在python交互模式下打印值


spam('helllo') # 函数调用
spam.hi('hello') # 方法调用
yield x ** 2 # 表达式语句
print(a, 'sep='')