出自:https://blog.csdn.net/gavin_john/article/details/49906095
在Python的语法模型中:
【1】.一行的结束就是终止该行语句(没有分号)。
【2】.嵌套语句是代码块并且与实际的缩进相关(没有大括号)
注意:不应该在同一段Python代码中混合使用制表符和空格!!
=======================================================================================
赋值语句
运算 | 解释 |
spam='Spam' | 基本形式 |
spam,ham = 'yum','YUM' | 元组赋值运算(位置性) |
[spam,ham]=['yum','YUM'] | 列表赋值运算(位置性) |
a,b,c,d='spam' | 序列赋值运算,通用性 |
a,b,c = [1,2,3] | |
a,*b = 'spam' | 扩展的序列解包(Python3.0) |
spam = ham = 'lunch' | 多目标赋值运算 |
spams += 42 | 增强赋值运算(相当于spams = spams + 42) |
序列赋值
- >>> nudge = 1
- >>> wink =2
- >>> A,B = nudge,wink
- >>> A,B
- (1, 2)
- >>> [C,D] = [nudge,wink]
- >>> C,D
- (1, 2)
- >>> nudge = 1
- >>> wink =2
- >>> nudge,wink = wink,nudge
- >>> nudge,wink
- (2, 1)
因为语句执行时,Python会建立临时的元组,来存储右侧变量原始的值,分解赋值语句也是一种交换两变量的值,却不需要自行创建临时变量的方式:右侧的元组会自动记住先前的变量的值。
事实上,Python中原始的元组和列表赋值语句形式,最后已经被通用化,以接受右侧可以是任何类型的序列,只要长度相等即可。
你可以将含有一些值的元组赋值给含有一些变量的列表,字符串中的字符赋值给含有一些变量的元组。
- >>> [a,b,c]=(1,2,3)
- >>> a,c
- (1, 3)
- >>> (a,b,c)='ABC'
- >>> a,c
- ('A', 'C')
高级序列赋值语句模式
可以赋值嵌套序列,而Python会根据其情况分解其组成部分,就像预期的一样:
- >>> string = 'SPAM'
- >>> (a,b),c=string[:2],string[2:]
- >>> a,b,c
- ('S', 'P', 'AM')
- >>> red,green,blue = range(3)
- >>> red,blue
- (0, 2)
- >>> L=[1,2,3,4]
- >>> while L:
- front,L = L[0],L[1:]
- print(front,L)
- 1 [2, 3, 4]
- 2 [3, 4]
- 3 [4]
- 4 []
Python3.0中的扩展序列解包
一个带有单个星号的名称,可以在赋值目标中使用,以指定对于序列的一个更为通用的匹配——一个列表赋给了带星号的名称,该列表收集了序列中没有赋值给其他名称的所有项。对于前面示例中把序列划分为其“前面”和“剩余”部分的常用编码模式,这种方法特别方便。
扩展解包的实际应用:
a匹配序列中的第一项,b匹配剩下的内容:
- >>> seq = [1,2,3,4]
- >>> a,*b = seq
- >>> a
- 1
- >>> b
- [2, 3, 4]
- >>> *a,b=seq
- >>> a
- [1, 2, 3]
- >>> b
- 4
- >>> a,*b,c = seq
- >>> a,
- (1,)
- >>> b
- [2, 3]
- >>> c
- 4
- >>> a,b,*c = seq
- >>> a
- 1
- >>> b
- 2
- >>> c
- [3, 4]
- >>> a,*b = 'spam'
- >>> a,b
- ('s', ['p', 'a', 'm'])
- >>> a,*b,c = 'spam'
- >>> a,b,c
- ('s', ['p', 'a'], 'm')
- >>> L=[1,2,3,4]
- >>> while L:
- front,*L = L
- print(front,L)
- 1 [2, 3, 4]
- 2 [3, 4]
- 3 [4]
- 4 []
边界情况
首先,带星号的名称可能只匹配单个的项,但是,总是会向其赋值一个列表:
- >>> seq
- [1, 2, 3, 4]
- >>> a,b,c,*d = seq
- >>> print(a,b,c,d)
- 1 2 3 [4]
- >>> a,b,c,d,*e = seq
- >>> print(a,b,c,d,e)
- 1 2 3 4 []
-------------------------------------------------------------------------------------------------------------------- -----------------------------------
一个有用的便利形式:常用的“第一个,其余的”分片编码模式可以用扩展的解包来编写
应用于for循环:
- for(a,*b,c) in [(1,2,3,4),(5,6,7,8)]:
- ...
- a,*b,c = (1,2,3,4) # b gets [2,3]
多目标赋值语句
多目标赋值语句就是直接把所有提供的变量名都赋值给右侧的对象:
- >>> a = b = c = 'spam'
- >>> a,b,c
- ('spam', 'spam', 'spam')
- >>> a is b is c
- True
- >>> a = 'spam'
- >>> b =a
- >>> c = a
多目标赋值以及共享引用
记住,这里只有一个对象,由三个变量共享(全都指向内存内同一对象)。
这种行为对于不可变类型而言并没有问题,但对于可变对象,我们就要小心一点:
- >>> a = b = 0
- >>> a += 1
- >>> a,b
- (1, 0)
- >>> a = b = []
- >>> a.append('test')
- >>> a,b
- (['test'], ['test'])
================================================================ =======================
增强赋值
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.左侧只需计算一次。在完整形式x = x+y中,x出现两次,必须执行两次。因此,增强赋值语句通常执行得更快。
3.优化技术会自动选择。对于支持在原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是相比来说速度更慢的复制。