视频见:https://www.bilibili.com/video/av54728208
python书写格式官方参考:https://www.python.org/dev/peps/pep-0008/
1 公共操作
1.1 运算符
运算符 | 描述 | 支持的容器类型 |
---|---|---|
+ | 合并 | 字符串、列表、元组 |
* | 复制 | 字符串、列表、元组 |
in | 元素是否存在 | 字符串、列表、元组、字典 |
not in | 元素是否不存在 | 字符串、列表、元组、字典 |
1.1.1 +
# 1. 字符串
str1 = 'aa'
str2 = 'bb'
str3 = str1 + str2
print(str3) # aabb,无引号
# 2. 列表
list1 = [1, 2]
list2 = [10, 20]
list3 = list1 + list2
print(list3) # [1, 2, 10, 20]
# 3. 元组
t1 = (1, 2)
t2 = (10, 20)
t3 = t1 + t2
print(t3) # (10, 20, 100, 200)
1.1.2 *
# 1. 字符串
print('-' * 10) # ----------
# 2. 列表
list1 = ['hello']
print(list1 * 4) # ['hello', 'hello', 'hello', 'hello']
# 3. 元组
t1 = ('world',)
print(t1 * 4) # ('world', 'world', 'world', 'world')
t2 = (3)
print(t2 * 4) # 12
1.1.3 in
或not in
# 1. 字符串
print('a' in 'abcd') # True
print('a' not in 'abcd') # False
# 2. 列表
list1 = ['a', 'b', 'c', 'd']
print('a' in list1) # True
print('a' not in list1) # False
# 3. 元组
t1 = ('a', 'b', 'c', 'd')
print('aa' in t1) # False
print('aa' not in t1) # True
# 4. 字典
dict1 = {'name':'Python', 'age':30}
print('name' in dict1) # True
print('name' in dict1.keys()) # True
print(30 in dict1.values()) # True
print(('name','Python') in dict1.items()) # True
1.2 公共方法
函数 | 描述 |
---|---|
len() | 计算容器中元素个数 |
del 目标或 del() | 删除 |
max() | 返回容器中元素最大值 |
min() | 返回容器中元素最小值 |
range(start,end, step) | 生成从start到end的数字,不包括end,步长为step,供for循环使用 |
enumerate() | 函数用于将一个可遍历的数据对象 (如列表、元组或字符串 )组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 |
1.2.1 len()
# 1. 字符串
str1 = 'abcdefg'
print(len(str1)) # 7
# 2. 列表
list1 = [10, 20, 30, 40]
print(len(list1)) # 4
# 3. 元组
t1 = (10, 20, 30, 40, 50)
print(len(t1)) # 5
# 4. 集合
s1 = {10, 20, 30}
print(len(s1)) # 3
# 5. 字典
dict1 = {'name': 'Rose', 'age': 18}
print(len(dict1)) # 2
1.2.2 del()
,del 目标
# 1. 字符串
str1 = 'abcdefg'
del str1
print(str1) # 报错:NameError: name 'str1' is not defined
# 2. 列表
list1 = [10, 20, 30, 40]
del(list1[0])
print(list1) # [20, 30, 40]
1.2.3 max()
# 1. 字符串
str1 = 'abcdefg'
print(max(str1)) # g
# 2. 列表
list1 = [10, 20, 30, 40]
print(max(list1)) # 40
1.2.4 min()
# 1. 字符串
str1 = 'abcdefg'
print(min(str1)) # a
# 2. 列表
list1 = [10, 20, 30, 40]
print(min(list1)) # 10
1.2.5 range()
# range(1, 10),返回一个可迭代对象
print(range(1, 10))
# 1 2 3 4 5 6 7 8 9
for i in range(1, 10, 1):
print(i)
# 1 3 5 7 9
for i in range(1, 10, 2):
print(i)
# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
print(i)
注意: range()生成的序列不包含 end数字,start可以省略,默认为 0,step也可以省略,默认为 1。
1.2.6 enumerate()
语法:enumerate(可遍历对象, start=0)
注意:start参数用来设置遍历数据的下标的起始值,可以省略,默认为 0。
示例:
list1 = ['a', 'b', 'c', 'd', 'e']
for i in enumerate(list1):
print(i)
for index, char in enumerate(list1, start=1):
print(f'下标是{index}, 对应的字符是{char}')
enumerate返回结果是元组,元组第一个数据是原迭代对象的数据对应的下标,元组第二个数据是原迭代对象的数据
1.3 容器类型转换
1.3.1 tuple()
作用:将某个序列转换成元组
list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}
c1 = 'abdfgh'
print(tuple(list1))
print(tuple(s1))
print(list(c1)) # ('a', 'b', 'd', 'f', 'g', 'h')
1.3.2 list()
作用:将某个序列转换成列表
t1 = ('a', 'b', 'c', 'd', 'e')
s1 = {100, 200, 300, 400, 500}
c1 = 'abdfgh'
print(list(t1))
print(list(s1))
print(list(c1)) # ['a', 'b', 'd', 'f', 'g', 'h']
1.3.3 set()
作用:将某个序列转换成集合
list1 = [10, 20, 30, 40, 50, 20]
t1 = ('a', 'b', 'c', 'd', 'e')
c1 = 'abdfgh'
print(set(list1))
print(set(t1))
print(list(c1)) # {'g', 'b', 'd', 'a', 'h', 'f'}
注意:
- 集合可以快速完成列表去重
- 集合不支持下标
2 推导式(生成式)
仅适用于列表,字典和集合,又称为生成式。
2.1 列表推导式
作用: 用一个表达式创建一个有规律的列表或控制一个有规律列表。
列表推导式又叫列表生成式。
2.1.1 快速体验
需求:创建一个 0-10的列表。
- while循环实现
# 1. 准备一个空列表
list1 = []
# 2. 书写循环,依次追加数字到空列表 list1中
i = 0
while i < 10:
list1.append(i)
i += 1
print(list1) # [0,1,2,3,4,5,6,7,8,9]
- for循环实现
list1 = []
for i in range(10):
list1.append(i)
print(list1) # [0,1,2,3,4,5,6,7,8,9]
- 列表推导式实现:
[要返回的值 for i in 序列]
list1 = [i for i in range(10)]
print(list1) # [0,1,2,3,4,5,6,7,8,9]
列表推导式从 for 循环开始执行
2.1.2 带 if 的列表推导式
需求:创建0-10的偶数列表
- 方法一: range()步长实现
list1 = [i for i in range(0, 10, 2)]
print(list1)
- 方法二: if 实现
list1 = [i for i in range(10) if i % 2 == 0]
print(list1)
2.1.3 多个for循环实现列表推导式
需求:创建列表如下:
[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
代码如下:
list1 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list1)
2.2 字典推导式
思考: 如果有如下两个列表:
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']
如何快速合并为一个字典?
答: 字典推导式
字典推导式作用:快速合并列表为字典或提取字典中目标数据。
- 创建一个字典:字典 key是1-5数字,value是这个数字的2次方。
dict1 = {i: i**2 for i in range(1, 5)}
print(dict1) # {1: 1, 2: 4, 3: 9, 4: 16}
- 将两个列表合并为一个字典
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']
dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)
list3 = ['name', 'age', 'gender']
list4 = ['Tom', 20]
# 结果:IndexError: list index out of range
dict2 = {list1[i]:list2[i] for i in range(len(list3))}
print(dict2)
# 结果:{'name': 'Tom', 'age': 20}
dict3 = {list1[i]:list2[i] for i in range(len(list4))}
print(dict4)
总结:
- 如果两个列表数据个数相同,len统计任何一个列表的长度都可以
- 如果两个列表数据个数不同,len统计数据多的列表数据个数会报错;len统计数据少的列表数据个数不会报错
- 提取字典中目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
# 需求:提取上述电脑数量大于等于 200的字典数据
count1 = {key: value for key, value in counts.items() if value >= 200}
print(count1) # {'MBP': 268, 'DELL': 201}
2.3 集合推导式
需求:创建一个集合,数据为下方列表的 2 次方。
list1 = [1, 1, 2]
代码如下:
ist1 = [1, 1, 2]
set1 = {i ** 2 for i in list1}
print(set1) # {1, 4}
注意:集合有数据去重功能。
3 文件
3.1 文件操作的作用
思考: 什么是文件?
思考: 文件操作包含什么?
答: 打开、关闭、读、写、复制…
思考: 文件操作的的作用是什么?
答: 读取内容、写入内容、备份内容 …
总结: 文件操作的作用就是把一些内容 (数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
3.2 文件的基本操作
文件操作步骤
- 打开文件
- 读写等操作
- 关闭文件
注意: 可以只打开和关闭文件,不进行任何读写操作。
3.2.1 打开
在python,使用open
函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:open(name, mode)
name:是要打开的目标文件名的字符串 (可以包含文件所在的具体路径 )。
mode:设置打开文件的模式 (访问模式):只读、写入、追加等。
3.2.2 打开文件模式
模式 | 描述 |
---|---|
r | 以只读方式打开文件。默认模式文件的指针将会放在文件的开头 |
rb | 以二进制格式打开一个文件用于只读。默认模式文件指针将会放在文件的开头 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。如果文件已存在,则依次替换 原文件内容,如果文件不存在,报错 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件。清空文件,且读取为空,慎用 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾,读取数据为空 。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写 |
示例:
f = open('test.txt', 'w')
注意:
- 此时的
f
是open函数的文件对象。- 访问模式可以省略,默认为 r
- 读中文:
f = open('test.txt','r', encoding='UTF-8')
3.2.3 文件对象方法
3.2.3.1 写
语法:文件对象.write('内容')
示例:
# 1. 打开文件
f = open('test.txt', 'w')
# 2.文件写入
f.write('hello world')
# 3. 关闭文件
f.close()
注意:
- w 和 a 模式:如果文件不存在则创建该文件;如果文件存在, w 模式先清空再写入, a 模式直接末尾追加。
- r 模式:如果文件不存在则报错。
3.2.3.2 读
read()
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入 num,那么就表示读取文件中所有的数据。
123456
123456
hello world
abcdefg
f = open('test.txt','r')
content = f.read(10)
print(content)
content = f.read(3)
print(content)
content = f.read(2)
print(content)
# 关闭文件
f.close()
注意:如果读取内容包括换行,则换行符\n算一个字节
readlines()
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open('test.txt')
content = f.readlines()
# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)
# 关闭文件
f.close()
注意:换行符也会读取出来
readline()
readline()一次读取一行内容。
f = open('test.txt')
content = f.readline()
print(f'第一行: {content}')
content = f.readline()
print(f'第二行: {content}')
# 关闭文件
f.close()
3.2.3.3 seek()
作用: 用来移动文件指针。
语法 :文件对象.seek(偏移量, 起始位置)
起始位置:
- 0:文件开头
- 1:当前位置
- 2:文件结尾
# test.txt
hello world
abcdefg
1234567890
通常配合 r+ 、w+模式,seek指针移动只能从头开始移动,即seek(x,0),a+模式下直接在文件末尾写入,seek移动指针不起作用
r+
模式
f = open('test.txt','r+')
f.seek(10,0)
content = f.read()
print(content)
f.close()
w+
模式
f = open('test.txt','w+')
f.seek(10,0)
f.write('heima')
f.close()
3.2.3.3 关闭
文件对象.close()
3.3 文件备份
需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能 (备份文件名为 xx[备份]后缀,例如:test[备份].txt)。
步骤
- 接收用户输入的文件名
- 规划备份文件名
- 备份文件写入数据
示例:
- 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名: ')
- 规划备份文件名
2.1 提取目标文件后缀
2.2 组织备份的文件名, xx[备份]后缀
# 2. 规划备份文件名
# 2.1 提取目标文件后缀
# 找到名字中的点 ——> 名字和后缀分离 ——> 最右侧的点才是后缀的点 ——> 字符串查找某个子串 rfind
index = old_name.rfind('.') # 输入文件名为字符串类型
# print(index) # 输出后缀中.之前包含的字符数
# print(old_name[:index]) # 源文件名(无后缀)
# 2.2 组织新文件名:旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]
# 打印新文件名(带后缀)
# print(new_name)
- 备份文件写入数据
3.1 打开源文件 和 备份文件
3.2 将源文件数据写入备份文件
3.3 关闭文件
# 3.1 打开文件
old_f = open(old_name, 'rb') # 二进制打开文件,不会出错
new_f = open(new_name, 'wb')
# 3.2 将源文件数据写入备份文件
# 如果不确定目标文件大小,循环读取写入,当读取出来的数据为空则终止循环
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
# 3.3 关闭文件
old_f.close()
new_f.close()
- 有效文件名
思考:如果用户输入 .txt,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?
答:添加条件判断即可。
old_name = input('请输入您要备份的文件名: ')
index = old_name.rfind('.')
# 判断文件吗是否有效
if index > 0:
postfix = old_name[index:]
new_name = old_name[:index] + '[备份]' + postfix # 若后缀名变量为空,报错
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
old_f.close()
new_f.close()
3.4 文件和文件夹的操作
在Python中文件和文件夹的操作要借助os模块
里面的相关功能,具体步骤如下:
3.4.1 os
模块介绍
- 导入 os模块:
import os
- 使用 os 模块相关功能:
os.函数名()
- 文件、文件夹重命名:
os.rename(目标文件(夹)名,新文件(夹)名)
- 删除文件:
os.remove(目标文件名)
- 创建文件夹:
os.mkdir(文件夹名字) # 可加入路径
- 删除文件夹:
os.rmdir(文件夹名字)
- 获取当前文件所在路径 / 目录:
os.getcwd()
- 改变默认目录:
os.chdir(目录)
import os
os.mkdir('aa') # 创建‘aa’文件夹
os.chdir('aa') # 进入‘aa’文件夹所在路径
os.mkdir('bb') # 在‘aa’文件夹下创建‘bb’文件夹
- 获取目录列表:
os.listdir(目录)
,获取某个文件夹下所有文件,返回一个列表
print(os.listdir())
3.4.2 应用案例
需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。
步骤
- 设置添加删除字符串的的标识
- 获取指定目录的所有文件
- 将原有文件名添加 /删除指定字符串,构造新名字
- os.rename()重命名
import os
# 设置重命名标识 flag:1——>添加指定字符,2——>删除指定字符
flag = 1
# 获取指定目录
dir_name = './'
# 获取指定目录的文件列表
file_list = os.listdir(dir_name)
# print(file_list)
# 遍历文件列表内的文件
for name in file_list:
# 添加指定字符
if flag == 1:
new_name = 'Python-' + name
# 删除指定字符
elif flag == 2:
num = len('Python-') # 7
new_name = name[num:]
# 打印新文件名,测试程序正确性
print(new_name)
# 重命名
os.rename(dir_name+name, dir_name+new_name)
注意: 默认情况下,文件夹包含.idea文件,会报错,运行前可先删除