Python赋值语句
- Python中的赋值语句的基本形式是在等号左边写赋值语句的目标。要赋值的对象位于右侧。左侧的目标可以是变量名或者元素。右侧的对象可以是任何会计算得到的对象表达式。
- 赋值语句建立对象的引用,而不是赋值对象。
- Python会在首次将对象引用值赋给变量时创建其变量名。一旦赋值后,每当这个变量名出现在表达式时,就会被其所引用的值取代
- 变量名在引用前必须先赋值,禁止未进行赋值就的变量
- 隐式赋值应用于模块导入、函数、类定义、for循环变量以及函数参数
赋值语句的形式
- 基本形式
spam = 'spam'
- 元组及列表分解赋值
spam,ham = 'yum','YUM'
[spam,ham] = ['yum','YUM']
- Python会按照位置把右边的对象和左边的目标从左至右相配对,在执行时会先在右边制作元素的元素。
- 序列赋值
在新的Python版本中,元组及列表赋值语句已经统一为现在的序列赋值语句——任何变量名的序列都可以赋值给任何值的序列。Python会按位置一次赋值一个元素
a,b,c,d='spam'
a赋值为's' b赋值为'p'
- 扩展的序列解包
python3中,一种新形式的序列赋值允许我们更灵活的选择要赋值的一个序列的一个部分
a,*b='spam'
在这个赋值语句中,a匹配第一个字母,剩下的用于匹配b:a赋值为's',b赋值为'pam'
- 多目标赋值
spam=ham='lunch'
在这个语句中spam ham都会赋值成对相同的字符串对象'lunch'的引用
- 增强赋值语句
spam+=42
序列赋值
>>> nudge=1
>>> wink=2
>>> nudge,wink=wink,nudge
>>> nudge.wink
>>> nudge,wink
(2, 1)
赋值右侧可以是任何类型的序列,只要长度相等即可
高级序列赋值语句模式
在Python3.0中可以允许我们使用更为通用的扩展解包语法,在python2.x中要求赋值目标中的项数和主体的数目必须一致:否则就会报错
>>> string='SPAM'
>>> a,b,c,d = string
>>> a,d
('S', 'M')
>>> a,b,c
('S', 'P', 'A')
>>> a,b,c = string
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
如果想使用通用方法就需要使用分片。
>>> string = 'SPAM'
>>> a,b,c=string[0],string[1],string[2:]
>>> a,b,c
('S', 'P', 'AM')
>>> a,b,c = list(string[:2])+[string[2:]]
>>> a,b,c
('S', 'P', 'AM')
>>> (a,b),c = string[:2],string[2:]
>>> a,b,c
('S', 'P', 'AM')
>>>
在最后一个赋值中,Python先把右边的第一个字符串('SP')和左边的第一个元组((a,b))配对,然后一次赋值一个字符,接着再把第二个字符串('AM')一次赋值给变量c。在这个过程中,左边对象的序列嵌套的形状必须符合右边对象的形状。
Python3.0中的扩展序列解包
在Python3.0中一个带有单个星号的名称,可以在赋值目标中使用,以指定对于序列的一个更为通用的匹配
>>> seq = [1,2,3,4,5]
>>> a,*b = seq
>>> a
1
>>> b
[2, 3, 4, 5]
- 当使用一个带星号的名称的时候,左边的目标中的项数不需要与主体序列的长度匹配。带星号的名称可以出现在目标中的任何地方
>>> *a,b = seq
>>> a,b
([1, 2, 3, 4], 5)
b匹配序列中的最后一项,a匹配最后一项之前的所有内容
- 当带星号的名称出现在中间,它收集其他列出的名称之间的所有内容
>>> a,*b,c = seq
>>> a
1
>>> b
[2, 3, 4]
>>> c
5
- 扩展的序列解包语法对于任何序列类型都有效。不只是对列表有效
边界情况
带星号的名称可能只匹配单个的项
>>> seq
[1, 2, 3, 4, 5]
>>> a,b,c,*d=seq
>>> print(a,b,c,d)
1 2 3 [4, 5]
- 如果没有剩下的内容可以匹配带星号的名称,它会赋值一个空的列表。不管该名称出现在哪里
>>> a,b,c,d,e,*f=seq
>>> print(a,b,c,d,e,f)
1 2 3 4 5 []
- 如果有多个带星号的名称,或者如果值少了而没有带星号的名称,以及如果带星号的名称自身没有编写到一个列表中,将会引发错误
应用于for循环
>>> for (a,*b,c) in [(1,2,3,4),(5,6,7,8)]:
... print(a,b,c)
1 [2, 3] 4
5 [6, 7] 8
增强赋值语句
X+=Y X&=Y X-=Y X|=Y
X =Y X^=Y X/=Y X>>=Y
X%=Y X<<=Y X*=Y X//=Y
增强赋值语句的有点
- 输入减少,减少代码量
- 左侧只需要计算一次,在X+=Y中,X可以是复杂的对象表达式。在增强形式中,则只需计算一次,然而,在完整形式X=X+Y中,X出现两次,必须执行两次
- 优化技术自动选择,对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算。而不是使用相对来说速度更慢的复制
增强赋值以及共享引用
对于增强赋值语句,对列表是做原处修改的意思。而'+'总是生成新对象。
>>> M = [1,2]
>>> L = M
>>> L = L +[3,4]
>>> L,M
([1, 2, 3, 4], [1, 2])
上述的例子中,由于'+'会生成一个新的列表对象,所以M的值并没有发生改变
>>> M = [1,2]
>>> L = M
>>> L+=[3,4]
>>> L,M
([1, 2, 3, 4], [1, 2, 3, 4])
犹豫增强赋值对于可变的数据类型时在原处修改值,所以使M的值发生了变化
Python表达式语句
表达式语句和在原处的修改
对列表调用append、sort、reverse这类在原处修改的运算,一定是对列表做原处的修改,但这些方法在列表修改后并不会把列表返回,而是返回的None对象
>>> L = [1,2]
>>> L.append(3)
>>> L
[1, 2, 3]
>>> L.extend([4,5,6])
>>> L
[1, 2, 3, 4, 5, 6]
>>> L = L.append(7)
>>> L
>>> print(L)
None
打印操作
print默认的把对象打印到stdout流,添加了一些格式化。
Python2.X Python3打印的差异
- 在Python3中,打印是一个内置函数,用关键字参数来表示特定模式
- 在Python2.X中,打印是语句。拥有自己的特定语法
Python3 print函数
调用格式
print([object,...],[sep=' '][,end='\n'][,file=sys,stdout])
格式中sep、end、和file部分如果给出的话,必须作为关键字参数给定。必须使用一种特殊的"name = value"语法来根据名称而不是根据位置来传递参数。
- sep是每个对象的文本之间插入一个字符串,如果没有传递的话默认是一个单个的空格
- end是添加在打印文本末尾的一个字符串,如果没有传递的话,默认是一个'\n'换行
- file指定了文本将要发送到的文件。如果没有指定的话默认会发送到标准的输入输出sys.stdout
Pyton3的print函数的应用
>>> x='spam'
>>> y=99
>>> z=['eggs']
>>> print(x,y,z)
spam 99 ['eggs']
>>> print(x,y,z,sep='')
spam99['eggs']
>>> print(x,y,z,sep='%')
spam%99%['eggs']
>>> print(x,y,z,sep=' ',end='')
spam 99 ['eggs']>>>
>>> print(x,y,z,sep=' ',end='\n')
spam 99 ['eggs']
打印流重定向
在Python3.0和Python2.6中,打印都默认地发送到标准输出流。也可以发送到一个文本文件’
print只是Python的人性化的特性,它提供了sys.stdout对象的简单接口
>>> import sys
>>> sys.stdout.write('hello world\n')
hello world
12
将输出流重定向到文件后print语句直接打印内容到文件
>>> import sys
>>> sys.stdout = open('/tmp/log.txt','a')
>>> x=[1,2,3,4]
>>> y='hello'
>>> z=136
>>> print(x,y,z)
网友评论