Python is Best

Python死磕——Python赋值语句、表达式以及打印

2017-09-22  本文已影响99人  So_ProbuING

Python赋值语句

赋值语句的形式

spam = 'spam'
spam,ham = 'yum','YUM'
[spam,ham] = ['yum','YUM']
a,b,c,d='spam'

a赋值为's' b赋值为'p'

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
增强赋值语句的有点

  1. 输入减少,减少代码量
  2. 左侧只需要计算一次,在X+=Y中,X可以是复杂的对象表达式。在增强形式中,则只需计算一次,然而,在完整形式X=X+Y中,X出现两次,必须执行两次
  3. 优化技术自动选择,对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算。而不是使用相对来说速度更慢的复制

增强赋值以及共享引用

对于增强赋值语句,对列表是做原处修改的意思。而'+'总是生成新对象。

>>> 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 print函数

调用格式

print([object,...],[sep=' '][,end='\n'][,file=sys,stdout])

格式中sep、end、和file部分如果给出的话,必须作为关键字参数给定。必须使用一种特殊的"name = value"语法来根据名称而不是根据位置来传递参数。

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)
上一篇 下一篇

猜你喜欢

热点阅读