跳至主要內容

Python

LincZero大约 6 分钟

Python

目录

交互

控制台 I/O

输出与字符串

输出会输出的是字符串,如何将值转化为字符串?

  • str(),用于将值转换为适于人阅读的形式(如果对象没有适于人阅读的解释形式,会返回与repr()等同的值)
    • 比如
  • repr(),转换为供解释器读取的形式(如果没有等价的语法,则会发生SyntaxError异常)

格式化输出

字符串的其他格式化方法

  • str.zfill()open in new window,用于向数值的字符串表达左侧填充 0
    • 用法:例如:
      • '12'.zfill(5)输出00012
      • '-3.14'.zfill(7)输出-003.14
      • '3.14159265359'.zfill(5)输出'3.14159265359'

旧式的字符串格式化

使用%操作符,配合格式化指令,详见printf-style String Formattingopen in new window

  • 使用:例如:
    • print('The value of PI is approximately %5.3f.' % math.pi)

str.format()方法

str.format()open in new window, 用于格式化字符串

  • 传参用法:例如:
    • 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:
      • 好处:用关键字withopen in new window处理文件对象是个好习惯
        1. 用完文件会自动关闭
        2. 允许发生异常,它是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/wwb写入创建覆盖写入
    w+wb+读取+写入创建覆盖写入
    R/rrb读取报错不可写入
    r+rb+读取+写入报错覆盖写入
    A/aab写入创建附加写入
    a+ab+读取+写入创建附加写入

使用json存储结构化数据

从文件中读写字符串很容易。数值就要多费点儿周折,因为 read() 方法只会返回字符串,应将其传入 int()open in new window 这样的函数,就可以将 '123' 这样的字符串转换为对应的数值 123。当你想要保存更为复杂的数据类型,例如嵌套的列表和字典,手工解析和序列化它们将变得更复杂。

好在用户不是非得自己编写和调试保存复杂数据类型的代码,Python 允许你使用常用的数据交换格式 JSON(JavaScript Object Notation)open in new window。标准模块 jsonopen in new window 可以接受 Python 数据结构,并将它们转换为字符串表示形式;此过程称为 序列化。从字符串表示形式重新构建数据结构称为 反序列化。序列化和反序列化的过程中,表示该对象的字符串可以存储在文件或数据中,也可以通过网络连接传送给远程的机器。

  • 使用
    • 对象转json,例如:json.dumps([1, 'simple', 'list'])
    • 对象转json并写入到文件,json.dump(x, f)
    • 读取存储json的文件,x = json.load(f)

一些拓展

不换行输出

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)