二分法(二分查找)
-
概念 - 二分法的本质是对半取元素,判断要查找的元素是否在对应区间里
-
限制 - 所查找的容器必须先排好序
# 有二分法查找出目标值 list1 = [0, 5, 10, 60, 90] target = 60 left = 0 right = len(list1) - 1 while left <= right: mid = (left + right) // 2 if list1[mid] == target: print(mid) break elif list1[mid] > target: right = mid - 1 else: left = mid + 1 else: print('该元素不在列表中!')
-
使用二分法时要注意***时空复杂度(时间、空间)***:
- 时间复杂度 - 程序执行花费的时间
- 空间复杂度 - 程序执行花费的内存
- 两者要保持平衡
-
二分法变形 - 容器中元素先升序再降序
- 使用两个二分法来做
数据持久化
-
概念 - 将数据从瞬时状态转化为持久状态
-
两种文件形式 - 文本文件 & 表格文件
-
Python操作文件流程:
操作文本文件: 新建(重命名) -> 打开 -> 写数据 -> 保存关闭 (写)
打开 -> 读数据 -> 关闭 (读)
操作表格文件: 新建 -> 打开 -> 写数据 -> 保存、关闭、重命名
打开 -> 读数据 -> 关闭
-
文件操作形式:
a. 以什么形式操作**(读 / 写)**
# r - 只读,文件若不存在会报错 # w - 只写,文件不存在会创建一个新的,若存在则先清空再创建 # a - 追加,文件不存在会创建一个新的,若存在则继续添加内容
-
b. 以什么数据类型操作文件:
# t - 字符串形式 (t可以不写,为默认值,r = rt、tr) # b - 二进制形式 (一般计算机中储存的数据都为二进制形式存在,如图片、音频、视频等)
-
如何使用文件操作形式:
- 从 '以什么形式操作 ’ 和 '以什么数据类型操作 ’ 中各选一种搭配
- 例如 - rb、rt、tr、br等
文件读写操作
-
读操作通常有四个参数
# 参数1 - 文件名、文件路径 # 参数2 - 文件操作模式 # 参数3 - 编码方式,encoding = 'utf-8' # 参数4 - 换行方式,newline = ''(读操作时不需要指定) # windows: \r\n (会出现空一行打印一排的情况) # mac: \r # linux: \n # r 会将鼠标光标移动到下一行行首
-
文件路径分为两种
# 相对路径 - 以当前文件为参照物,查找另一个文件相对其的位置 # .表示当前目录 # ..表示返回上一级 # /两个文件夹之间及文件夹和文件之间的间隔符号 # 绝对路径 - 文件准确的位置,放在xx磁盘下的xx文件夹 # D:\\user\word\test.txt
-
以文件对象的形式打开已存在文件
file = open(r'test.txt', 'r', encoding='utf-8') print(file)
-
读操作
# read、readline、readlines # read: 以字符串形式一次性将文件中的内容全读出来 # readline: 每次只读一行,结果为字符串类型 # readlines: 一次性将所有行读出来,结果为列表,文件的每一行信息为一个元素
-
关闭文件
# close: 关闭文件
-
文件读写示例
# 写入文件 file = open('古诗.txt', 'w', encoding='utf-8', newline='') # write: 向文件写入内容 str1 = '静夜思\n唐 李白\n床前明月光\n疑是地上霜' file.write(str1) file.close() # 追加内容 file = open('古诗.txt', 'a', encoding='utf-8', newline='') # append: 向文件追加内容 str1 = '\n举头望明月\n低头思故乡' file.write(str1) file.close() # 读取内容 # 读操作和写操作编码要保持一致 file = open('古诗.txt', 'r', encoding='utf-8') print(file.read()) file.close()
-
with的用法
# with预定义了close方法,会在操作后直接执行清理操作,关闭文件 with open('古诗.txt', 'r', encoding='utf-8', newline=''): result = file.read() print(result) print(file.read()) # ValueError: I/O operation on closed file.
-
eval - 将字符串序列化
# eval: 将字符串序列化, eval中必须写长度非0的字符串 print(eval('1') + 2) # 打印结果为3 print('[1, 2, 3, 4, 5]'[0]) # 打印结果为[ print(eval('[1, 2, 3, 4, 5]')[0]) # 打印结果为1
python读写图片与视频
-
python读取图片和视频,打印结果为二进制字节码
# b'xxxxxx' 二进制字节码 # 读取图片 file = open('photo1.jpg', 'rb') result = file.read() file.close() print(result) # 将图片用二进制写回去 file = open('photo2.jpg', 'wb') file.write(result) file.close() # 读取和写入视频 file = open('MarkDown为什么会这么流行.mp4', 'rb') result1 = file.read() file.close() print(result1) file = open('MarkDown为什么会这么流行1.mp4', 'wb') file.write(result1) file.close()
CSV文件的读写
# CSV文件中的数据是以表格形式显示的
import csv
csvfile = open('学生成绩.CSV', 'w', encoding='utf-8')
# 先写列明
# 使用CSV模块提供的writer方法进行文件写入
myWrite = csv.writer(csvfile)
myWrite.writerow(['编号', '姓名', '年龄', '专业'])
# writerow() - 单行写入,writerow中传递一个列表,列表表示一行
# 列表中的一个元素代表一个单元格的内容
myWriterows(
[
['python001', '张三', '18', '计算机科学与技术'],
['python002', '李四', '18', '计算机科学与技术'],
['python003', '王五', '18', '计算机科学与技术'],
]
)
# writerows() - 多行写入,writerows中传递一个列表,列表中一个元素代表一行内容
csvfile.close()
# 读取写入的内容
file = open('学生成绩.CSV', 'r', encoding='utf-8')
# csv.reader得到一个可迭代对象
data = csv.reader(file)
for i in data:
print(i)
file.close()