Python学习笔记08

chapter_8

赋值,表达式和打印

序列赋值

>>> nudge = 1
>>> wink = 2
>>> A,B = nudge,wink
>>> A,B
(1, 2)
>>> [C,D] = [nudge,wink]
>>> C,D
(1, 2)
>>> nudge = 1
>>> wink = 2
>>> [a,b,c] = (1,2,3)
>>> a,c
(1, 3)
>>> (a,b,c) = "ABC"
>>> a,c
('A', 'C')

###高级序列赋值语句模式

>>> string = 'SPAM'
>>> a,b,c,d = string #序列赋值需要两边的元素数目相等
>>> a,d
('S', 'M')
>>> 
>>> a,b,c = string #不相等则报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)

Python 3.0中的扩展序列解包

  • 一个列表赋给了带星号的名称,该名称收集了序列中没有赋值给其他名称的所有项.
>>> seq = [1,2,3,4]
>>> a,b,c,d = seq #两边元素个数要对应
>>> print(a,b,c,d)
1 2 3 4
>>> a,b = seq #元素不对应就报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> 
>>> 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 = 'spam'
>>> a
's'
>>> b
['p', 'a', 'm']

解包的边界情况

>>> seq
[1, 2, 3, 4]
>>> a,b,c,*d = seq #带星号的名称可能只匹配单个的项,但是总是向其赋值一个列表
>>> print(a,b,c,d)
1 2 3 [4]
>>> seq
[1, 2, 3, 4]
>>> a,b,c,d,*e = seq #没有剩下的内容进行匹配,会被赋值一个空的列表
>>> print(a,b,c,d,e)
1 2 3 4 []

>>> a,b,*e,c,d = seq
>>> print(a,b,c,d,e)
1 2 3 4 []

错误:

  • 有多个带星号的名称
  • 值少了而没有带星号的名称
  • 带星号的名称自身没有编写到一个序列中
>>> seq
[1, 2, 3, 4]
>>> a,*b,c,*d = seq #有多个带星号的名称
  File "<stdin>", line 1
SyntaxError: two starred expressions in assignment
>>> a,b = seq #值少了而没有带星号的名称
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
>>> *a = seq #带星号的名称自身没有编写到一个序列中
  File "<stdin>", line 1
SyntaxError: starred assignment target must be in a list or tuple
>>> *a, = seq
>>> a
[1, 2, 3, 4]

多目标赋值语句

>>> a = b = c = 'spam'
>>> a,b,c
('spam', 'spam', 'spam')

#等价于
>>> c = 'spam'
>>> b = c
>>> a = b

注意:这里是一个对象由三个变量共享引用,这种行为对于不可变类型而言没有问题.

>>> a = b = 0
>>> b = b + 1
>>> a,b
(0, 1)

>>> a = b = []
>>> b.append(22)
>>> a,b
([22], [22])


>>> a = []
>>> b = []
>>> b.append(42)
>>> a,b
([], [42])

增强赋值以及共享引用

>>> L = [1,2]
>>> M = L
>>> L = L + [3,4] #传统的赋值,产生新的对象
>>> L,M
([1, 2, 3, 4], [1, 2])


>>> L = [1,2]
>>> M = L
>>> L += [3,4] #使用增强赋值,没有产生新的对象,在原处修改对象
>>> L,M
([1, 2, 3, 4], [1, 2, 3, 4])

Python命名惯例

  • 以单一下划线开头的变量名 (_X) 不会被 from module import * 语句导入
  • 前后有下划线的变量名 (X) 是系统定义的变量名,对解析器有特殊意义
  • 以两下划线开头,但结尾没有两个下划线的变量名 (__X)是类的本地变量
  • 通过交互模式运行时,只有单个下划线的变量名 (_) 会保存最后表达式的结果

Python3.0 的 print 函数

原型: print([object, …][, sep = ’ ‘][,end = ‘\n’][, file = sys.stdout])

  • sep 是在每个对象的文本之间插入的一个字符串,如果没有传递的话,它默认的是一个单个的空格.
  • end 是添加在打印文本末尾的一个字符串,默认是一个\n换行字符
  • file 指定了文本将要发送到的文件,标准流或者其他类似文件的对象,默认的是 sys.stdout.

Python 2.6 和 Python 3.0 print的等价形式

Python 2.6 Python3.0
print x, y print(x, y)
print x,y, print(x, y, end = ”)
print >> afile, x, y print(x, y, file = afile)

自动化流重定向

  • sys.stdout 只是普通的文件对象,可以存储它,需要时可以恢复
>>> import sys
>>> temp = sys.stdout
>>> sys.stdout = open('log.txt','a') #重定向输出流
>>> print('spam') 
>>> print(1,2,3)
>>> sys.stdout.close()
>>> sys.stdout = temp #恢复输出流
>>> print('back here')
back here
>>> print(open('log.txt').read())
spam
1 2 3
  • 在关闭重定向的文件后,打印方法会自动恢复为sys.stdout
>>> log = open('log.txt','w')
>>> print(1,2,3,file = log)
>>> print(4,5,6,file = log)
>>> log.close()
>>> print(7,8,9)
7 8 9
>>> print(open('log.txt').read())
1 2 3
4 5 6

在Python 2.6 中编写 Python3.0的print函数

  • 在Python 2.6中加入以下语句
from __future__import print_function

你可能感兴趣的:(python)