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

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

  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中,打印是一个内置函数,用关键字参数来表示特定模式
  • 在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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容