本笔记是基于《Python学习手册-原书第五版》第十一章 赋值、表达式和打印
赋值语句
Python赋值语句的作用是把对象赋给一个变量。
其基本形式是在等号左侧写赋值语句的目标,在等号的右侧写要赋值的对象。
左侧的目标可以是变量或对象组件。
右侧的对象可以是任何通过计算能得到对象的表达式。
赋值语句的主要特性
1.赋值语句创建对象引用
Python的赋值更像是指针而不是数据存储区域,是引用而不是复制。
2.变量在首次赋值时会被创建
3.变量在引用前必须先赋值
4.某些操作会隐式地进行赋值
模块导入,函数和类的定义,for循环变量,函数参数等都是隐式赋值运算。
常见的赋值形式
1.基础形式
将一个名称绑定到对象上。
# code是变量的名称,'Python'是字符串对象
code = 'Python'
2.元组赋值
当被赋值的目标为多个,且和对象数量相匹配时,赋值会按照位置顺序从左至右进行匹配。
Python会在内部为目标生成一个元组。因此被称为元组赋值。
# Python在内部会生成(code1,code2)的元组
# 变量名称code1 匹配 'Python'字符串对象
# 变量名称code2 匹配 'Java'字符串对象
>>> code1,code2 = 'Python', 'Java'
>>> code1
'Python'
>>> code2
'Java'
# 元组赋值可以用来快速交换元素
>>> code1,code2 = 'Python', 'Java'
>>> code1, code2 = code2, code1
>>> code1
'Java'
>>> code2
'Python'
# 元组赋值可以实现栈的数据结构
>>> L = [1,2,3,4]
>>> while L:
front, L = L[0],L[1:]
print(front, L)
1 [2, 3, 4]
2 [3, 4]
3 [4]
4 []
3.列表赋值
列表赋值和元组类似。操作形式不同。
# 列表赋值
>>> [code3,code4] = ['C++','C']
>>> code3
'C++'
>>> code4
'C'
4.序列赋值
任何值的序列都可以赋值给任何名称的序列,Python会按照位置一次性完成所有的赋值。
# 注意变量名称要和对象一一对应。不然会报错。
>>> s1, s2, s3, s4, s5, s6 = 'Python'
>>> [s1, s2, s3, s4, s5, s6]
['P', 'y', 't', 'h', 'o', 'n']
# 序列赋值的另一种操作
>>> ((s1,s2),s3)=('Py','thon')
>>> s1,s2,s3
('P', 'y', 'thon')
5.扩展序列解包
可以理解为自动切片赋值。
# 扩展序列解包
>>> s1,*s2 = 'Python'
>>> [s1, s2]
['P', ['y', 't', 'h', 'o', 'n']]
>>> s2
# 当使用一个带星号的名称时,左侧的目标数目不必等于右侧的对象书目。
>>> *a,b,c = 'Python'
>>> a,b,c
(['P', 'y', 't', 'h'], 'o', 'n')
>>> a,*b,c = 'Python'
>>> a,b,c
('P', ['y', 't', 'h', 'o'], 'n')
>>> a,b,*c = 'Python'
>>> a,b,c
('P', 'y', ['t', 'h', 'o', 'n'])
# 扩展序列解包遇到单个的项,会向其赋值一个列表。
>>> a,b,c,*d = '1234'
>>> a,b,c,d
('1', '2', '3', ['4'])
# 当没有可扩展的项时,会赋值一个空的列表。
>>> a,b,c,d,*e = '1234'
>>> a,b,c,d,e
('1', '2', '3', '4', [])
# 序列解包常用来处理“第一项,剩余项”需求
>>> L = [1,2,3,4]
>>> a, *b = L
>>> a,b
(1, [2, 3, 4])
# 序列解包常用来处理“最后一项,剩余项”需求
>>> L = [1,2,3,4]
>>> *a,b = L
>>> a,b
([1, 2, 3], 4)
6.多目标赋值
指的是链式赋值。相同对象给所有目标引用。
# 多重目标赋值
>>> a = b = [1,3]
>>> a
[1, 3]
>>> b
[1, 3]
等效于
b = [1,3]
a = b
需要注意区分对象是可变的还是不可变的。
当对象是可变对象时,发生的操作是对象的变化。
当对象是不可变对象时,发生的操作是引用的变化。
7.增量赋值
表达式和赋值语句结合到一起的简写形式
# 增量赋值
>>> a = 100
>>> a += 100
等效于
a = a + 100
增量赋值的语句有将运算符放在等号前
格式为
变量名 运算符 赋值符号 对象
等效
变量名 赋值符号 变量名 运算符 对象
是一种在允许的条件下原位置处理对象的方法。所以比经过复制之后再运算要快一些。
变量命名规则
Python中,变量命名遵循一般语法——(下划线或字母)+(字母,数字,下划线);区分大小写;不允许使用保留字——关键字。
Python中的常用关键字有——False,True,finally,is,return,None,continue,for,lambda,try,class,def,from,nonlocal,while,and,del,global,not,with,as,if,elif,else,or,yield,assert,import,pass,break,except,in,raise等
在Python中,以单一下划线开头的名称不会被from module import*格式语句导入;前后均有双下划线的名称是系统定义的名称;以双下划线开头,结尾没有下划线的名称是外围类的本地变量;通过交互式命令行运行时,只有单个下划线的名称会保存最后一个表达式的结果。
在Python中,名称永远只是对象的引用。名称存在于作用域中,作用域决定了名称可以使用的范围;一个名称赋值的位置决定了名称的作用域范围。
更多详细名称命名规则参考PEP8。
表达式语句
表达式通常在调用函数和方法;在交互式命令行下打印值时用作语句。
表达式语句是单独的一条语句,不能作为表达式嵌套在语句中。
常见的表达式语句
1.函数调用
2.方法调用
3.在交互式解释器中打印变量
4.print()中打印
5.yield表达式语句
打印print操作
Python中的pirnt语句可以实现打印,是一个程序员友好的标准输出流接口。
Python的打印操作与文件和流——stdout的概念紧密相连。
print默认把对象写入stdout流,同时加入一些自动的格式化。
stdout——标准输出流是发送一个程序文本输出的默认位子。是脚本启动时创建的3种数据连接的一种。通常映射到Python程序的启动窗口,除非它已在操作系统的shell中被重新定向到文件或管道。由于stdout在Python中可以作为内置的sys模块中的stdout文件对象来使用,我们可以用文件写入的方法调用来模拟print。
# print()语句的格式
print([object,...][,sep = ''][, end = '\n'][,file = sys.stdout][, flush = False])
sep用来分割中间字符串。默认值是空格。
end用来加上结尾字符串。默认值是换行符。
file用来定义输出流。默认值是sys.stdout。
flush用来决定是否刷新输出缓冲区。默认值是False。
>>> x,y,z = 'Java', 'Python', 'C++'
>>> print(x,y,z)
Java Python C++
>>> print(x,y,z,sep=',')
Java,Python,C++
>>> print(x,y,z,end='bbb')
Java Python C++bbb
file可以写入文件中。file = opem('文件路径', 'w')
打印流重定向
有时我们要把文本发送到其他地方,如文本文件中以便存储结果供以后使用和测试。
# 模拟print()函数
>>> print('Hello world')
Hello world
>>> import sys
>>> sys.stdout.write('Hello world\n')
Hello world
12
# print()背后的事
print(x, y)
实际上在做
import sys
sys.stdout.write(str(x) + ' ' + str(y) + '\n')
# 手动流重定向
>>> import sys
>>> temp = sys.stdout 存储sys.stdout对象
>>> sys.stdout = open('log.txt', 'a') #生成一个log.txt文件 , 将文件对象指向sys.stdout
>>> print('Java') #此时打印内容写向该文件
>>> print(1,2,3) #此时打印内容写向该文件
>>> sys.stdout.close()
>>> sys.stdout = temp #恢复sys.stdout对象
>>> print(open('log.txt').read())
Java
1 2 3
#自动流定向
>>> log = open('log.txt','a')
>>> print('Python', file = log)
>>> print('C++', file = log)
>>> log.close()
>>> print(open('log.txt').read())
Java
1 2 3
Python
C++