Python学习笔记08
2016-04-24 10:18
561 查看
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 生成qrcode二维码
- python基础一
- Python 中else介绍.举例,代码
- python中sort()与sorted()区别
- Principle of Computing (Python)学习笔记(1) 2048
- 【python】matplotlib在把坐标轴移到中间后如何去掉两个坐标轴上多余的一个0?
- python抓取网页内容并进行语音播报
- [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)
- python内置函数
- 如何入门 Python 爬虫?
- python函数参数+lambda表达式
- python列表
- python源码乱码问题
- python工具pycharm使用-断点调试
- python函数定义与使用+返回值简解
- python字符串
- python数字类型
- Python数据可视化练习
- Python爬虫辅助利器PyQuery模块的安装使用攻略
- 安装Python的Numpy和SciPy库