Python
大约 6 分钟
Python
目录
交互
控制台 I/O
输出与字符串
输出会输出的是字符串,如何将值转化为字符串?
str()
,用于将值转换为适于人阅读的形式(如果对象没有适于人阅读的解释形式,会返回与repr()
等同的值)- 比如
repr()
,转换为供解释器读取的形式(如果没有等价的语法,则会发生SyntaxError
异常)
格式化输出
字符串的其他格式化方法
str.zfill()
,用于向数值的字符串表达左侧填充 0- 用法:例如:
'12'.zfill(5)
输出00012'-3.14'.zfill(7)
输出-003.14'3.14159265359'.zfill(5)
输出'3.14159265359'
- 用法:例如:
旧式的字符串格式化
使用%
操作符,配合格式化指令,详见printf-style String Formatting
- 使用:例如:
print('The value of PI is approximately %5.3f.' % math.pi)
str.format()
方法
str.format()
, 用于格式化字符串
- 传参用法:例如:
print('{} {}!'.format('Hello', 'world'))
,(按位置传递参数)print('{1} {0}!'.format('world', 'Hello'))
,(按序列传递参数)print('{first} {second}!'.format(first='Hello', second='world'))
,(按关键字传递参数)- 也可以序列和关键字混合使用
- 格式化参数:例如:
{!a}
,表示应用ascii()
格式化值{!s}
,表示应用str()
格式化值{!r}
,表示应用repr()
格式化值{}
字段后允许可选的:
和格式指令,如{0:.3f}
表示第一个参数输出3位小数{}
内允许进行进一步操作,如{0[Jack]:d}
表示去第一个参数的键的对应值
原始字符串方式
引号前面加r
即可,用起来也特别方便,性能也高
补充:原始字符串写\
路径时不用写\\
【比较】各种方法1
name = 'Tom'
age = 17
# %-formatting
print('我的名字是%s,%d岁' % (Tom, 17))
print('我的名字是%s' % Tom)
# str.format()
print('我的名字是{},{}岁'.format('Tom', 17, 666)) # 顺序填坑
print('我的名字是{0},{2}岁'.format('Tom', 666, 17)) # 下标填坑
print('我的名字是{name},{age}岁'.format(name='Tom', foo='666', age=17)) # 变量填坑
# Python3.6及以后的版本,f-string在功能方面不逊于传统的%-formatting语句和str.format()函数,同时性能又优于二者
print(f'我的名字是{name},{age}岁')
【比较】各种方法2
举例,输出平方和立方表
repr()
与str.rjust()
方式
>>> for x in range(1, 11):
... print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
... # Note use of 'end' on previous line
... print(repr(x*x*x).rjust(4))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
format()
方式
>>> for x in range(1, 11):
... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
- 格式化字符串方式(不是原始字符串)
Template方法
文件 I/O
使用
创建文件实例
- 方式一(创建对象实例形式)
- 通用:
open(filename, mode='r')
,调用完后f.close()
关闭并释放其占用的所有系统资源 - 举例:
f = open('workfile', 'w')
- 通用:
- 方式二(with代码块形式)
- 通用:
with open(filename, mode='r') as f:
- 好处:用关键字
with
处理文件对象是个好习惯- 用完文件会自动关闭
- 允许发生异常,它是
try-finally
块的简写
- 通用:
- 方式一(创建对象实例形式)
逐行读写
f.readline()
,从文件中读取单独一行字符串结尾会自动加上一个换行符
\n
,只有当文件最后一行没有以换行符结尾时,这一操作才会被忽略一般配合循环使用,连续调用时会依次输出每一行
for line in f:
,也可以输出每一行
转化为列表(每行是一个元素)
list(f)
或者f.readlines()
写 / 输出
f.write(string)
,将 string 的内容写入文件,并返回写入字符的长度
文件指针
- 文件对象中包含一个文件指针
f.tell()
,返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针处的比特数f.seek(offset,from_what=0)
,指针在该操作中从指定的引用位置移动 offset 比特,引用位置由 from_what 参数指定- from_what 值为 0 表示自文件起始处开始,1 表示自当前文件指针位置开始,2 表示自文件末尾开始,默认值为0
f.read(n)
,读取指针所在位置的n个字节
参数
字母后+
b
表示以二进制方式打开读写方式(文本) 读写方式(二进制) 可否读写 若文件不存在 写入方式 W/w wb 写入 创建 覆盖写入 w+ wb+ 读取+写入 创建 覆盖写入 R/r rb 读取 报错 不可写入 r+ rb+ 读取+写入 报错 覆盖写入 A/a ab 写入 创建 附加写入 a+ ab+ 读取+写入 创建 附加写入
使用json存储结构化数据
从文件中读写字符串很容易。数值就要多费点儿周折,因为 read()
方法只会返回字符串,应将其传入 int() 这样的函数,就可以将 '123'
这样的字符串转换为对应的数值 123。当你想要保存更为复杂的数据类型,例如嵌套的列表和字典,手工解析和序列化它们将变得更复杂。
好在用户不是非得自己编写和调试保存复杂数据类型的代码,Python 允许你使用常用的数据交换格式 JSON(JavaScript Object Notation)。标准模块 json 可以接受 Python 数据结构,并将它们转换为字符串表示形式;此过程称为 序列化。从字符串表示形式重新构建数据结构称为 反序列化。序列化和反序列化的过程中,表示该对象的字符串可以存储在文件或数据中,也可以通过网络连接传送给远程的机器。
- 使用
- 对象转json,例如:
json.dumps([1, 'simple', 'list'])
- 对象转json并写入到文件,
json.dump(x, f)
- 读取存储json的文件,
x = json.load(f)
- 对象转json,例如:
一些拓展
不换行输出
print参数:end
,默认值'\n'即默认换行,改成''就不会换行了
如:print('hello', end='')
动态输出
两种方法
- 方法一
- 依赖sys包(自带,不用pip安装)
- 方法二
\r
表示将光标的位置回退到本行的开头位置\b
表示将光标的位置回退一位- print参数:
end
,默认值'\n'即默认换行,改成''就不会换行了 - print参数:
flush
,刷新
print方法
import sys
import time
if __name__ == "__main__":
for i in range(51):
# 方法1
# sys.stdout.write('\r' + str(i))
# sys.stdout.flush()
# 方法2
print('\r' + str(i), end='', flush=True)
time.sleep(0.3)
【使用案例】终端实现倒计时功能
import time
for i in range(10):
print("\r离程序退出还剩%s秒" % (9-i), end="")
time.sleep(1)
【使用案例】终端实现转圈loading功能
import time
lst = ["\\", "|", "/", "———"]
for i in range(20):
j = i % 4
print("\r" + lst[j], end="")
time.sleep(0.2)
【使用案例】终端实现进度条功能
import time
for i in range(10):
print("\r" + "■"*i, sep="", end="")
time.sleep(0.2)
print("\n下载完成")
【使用案例】终端实现删除效果功能
import time
s = "枝上柳绵吹又少,天涯何处无芳草"
l = len(s)
for i in range(l):
print("\r" + s[:l-1-i] + "|", end="")
time.sleep(0.15)