看到这篇文章,说明你已经对python有了一定的了解,对于一些简单需求,自己可以独立完成,但对于一些比较大型的需求,这还远远不够。Python进阶就是把一些重复性代码简化、使用一些外部库等,对于项目的进行会有很大帮助。
目录
1、列表推导式
(1)为一个列表填充值
(2)定义一个2维空列表
(3)返回元组
2、os库读取文件夹
3、zip函数
4、lambda表达式(匿名函数)
5、正则表达式(re)
findall()
search()
finditer()
re.match函数
sub()
1、列表推导式
在需要创建多个列表、或者需要为列表填充具有一定规律的值时,能以极少的代码完成。
它的基本格式为:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
下面将举几个例子进行说明:
(1)为一个列表填充值
为一个列表填充范围为(1,10),能被2整除的数的两倍
li_1 = [2*i for i in range(10) if i%2==0]
print(li_1)
结果:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
(2)定义一个2维空列表
li_2 = [[] for i in range(10)]
print(li_2)
结果:
[[], [], [], [], [], [], [], [], [], []]
(3)返回元组
将i,j以元组形式返回,每次i取一个值时,j循环一次
li_3 = [(i,j) for i in range(1,6) for j in range(-8,1,2)]
print(li_3)
结果:
[(1, -8), (1, -6), (1, -4), (1, -2), (1, 0), (2, -8), (2, -6), (2, -4), (2, -2), (2, 0), (3, -8), (3, -6), (3, -4), (3, -2), (3, 0), (4, -8), (4, -6), (4, -4), (4, -2), (4, 0), (5, -8), (5, -6), (5, -4), (5, -2), (5, 0)]
2、os库读取文件夹
os
就是“operating system”的缩写,顾名思义,os
模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os
模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性。
这里介绍os库的读取问价夹操作,当您进行数据处理时可能会遇到数据文件量大的情况,例如一个文件夹下的几百个Excel文件,您不可能会一个一个读取这些Excel文件,您可以先使用os库构造这些Excel文件的路径,再写循环读取。
首先是导入os库
import os
您可以使用os.listdir()来读取某一文件夹下的一级文件,获得的是文件夹中的文件名称列表(按字母表顺序排序)
path = "D:\OneDrive\桌面\\2024Mathurcup\附件二处理后数据"
result = os.listdir(path)
# 循环输出
print(type(result))
for file in result[0:200:40]:print(file)
结果:
category1.xlsx
category1.xlsx
category135.xlsx
category171.xlsx
category207.xlsx
category243.xlsx
得到了Excel文件名后就可以构建绝对路径了
path = "D:\OneDrive\桌面\\2024Mathurcup\附件二处理后数据"
result = os.listdir(path)
# 循环输出
print(type(result))
for file in result[0:200:40]:if '.xlsx' in file:file = path + '\\' + fileprint(file)
由此,即构建完Excel文件的决定路径,然后就可以批量进行下一步的读取、处理了。
D:\OneDrive\桌面\2024Mathurcup\附件二处理后数据\category1.xlsx
D:\OneDrive\桌面\2024Mathurcup\附件二处理后数据\category135.xlsx
D:\OneDrive\桌面\2024Mathurcup\附件二处理后数据\category171.xlsx
D:\OneDrive\桌面\2024Mathurcup\附件二处理后数据\category207.xlsx
D:\OneDrive\桌面\2024Mathurcup\附件二处理后数据\category243.xlsx
3、zip函数
zip函数的使用场景很多,比如在进行遍历时,需要同时变量两个数据结构的变量,普通变量无法同时完成,这时可以zip函数。
可以理解zip函数为压缩,即将两个数据结构压缩到一起,对应元素用元组存储。
下面进行示例:
a = [1,2,3,4,5]
b = [6,7,8,9,10]
for i,j in zip(a,b):print(f"i是{i},j是{j}")
结果:
i是1,j是6
i是2,j是7
i是3,j是8
i是4,j是9
i是5,j是10
打印转换完的zip数据的类型
print(type(zip(a,b)))
发现返回的是一个对象
<class 'zip'>
尝试进行转换类型
li_4 = list(zip(a,b))
print(type(li_4))
print(li_4)
结果:
<class 'list'>
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
既然有压缩,那也一定有解压缩,解压缩可以用zip(*) ,返回二维矩阵式,可定义变量接收
示例:
# 解压
zip_1 = zip(*zip(a,b))
print(f"解压后类型为:{type(zip_1)}")
a,b = zip(*zip(a,b))
print(f"a:{a}")
print(f"b:{b}")
结果:
解压后类型为:<class 'zip'>
a:(1, 2, 3, 4, 5)
b:(6, 7, 8, 9, 10)
4、lambda表达式(匿名函数)
lambda 函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只能有一个表达式。匿名函数不需要使用 def 关键字定义完整函数。lambda 函数通常用于编写简单的、单行的函数,通常在需要函数作为参数传递的情况下使用,例如在 map()、filter()、reduce() 等函数中。
lambda 函数特点:
- lambda 函数是匿名的,它们没有函数名称,只能通过赋值给变量或作为参数传递给其他函数来使用。
- lambda 函数通常只包含一行代码,这使得它们适用于编写简单的函数。
lambda 语法格式:
lambda arguments: expression
lambda
是 Python 的关键字,用于定义 lambda 函数。arguments
是参数列表,可以包含零个或多个参数,但必须在冒号(:
)前指定。expression
是一个表达式,用于计算并返回函数的结果。
示例:
c = [1,2,3,4,5]
resp = list(map(lambda x:x**2,c))
print(resp)
map()
是一个内置函数,它接受两个参数:一个函数和一个可迭代对象(如列表、元组等)。map()
会将给定的函数应用到可迭代对象的每一个元素上,并返回一个映射对象(这是一个迭代器),其中包含了应用函数后的结果。- 结果:
[1, 4, 9, 16, 25]
5、正则表达式(re)
正则表达式是一种强大的文本处理工具,它可以帮助开发者进行复杂的字符串匹配、搜索和替换操作。在Python中,正则表达式通过内置的re模块提供支持,该模块实现了Perl风格的正则表达式语法。试想,当你需要从爬取的网页源码中获取特定url时,并没有什么很好的方法直接找出,而使用正则则可以根据数据匹配出您需要的数据。
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
下面是正则经常遇到的表达式:
"""
. 除了换行符以外的其他字符(包括空格,有几个点就匹配几个字符)
\w 数字字母下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
(?P<name>.*?) 给匹配到的内容给个名字叫name
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符* 重复0次或更多次
+ 重复一次或更多次
? 重复0次或一次
{a,} 某正则模式重复a次及以上({a,b},{a}相似)
/. 转义,匹配 . ().* 匹配任意,除了换行
.*? 尽可能少地匹配
re.S 让.能匹配换行
"""
下面是一个小示例:
首先,引入re库
import re
findall()
该函数在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
resp = re.findall(r"\d+","我有1000万,不给你画,我有1快,我全给你")
print("resp:",resp)
这里的“\d+”就是匹配模板,意思是匹配连续的数字
结果:
resp: ['1000', '1']
search()
search函数是搜索结果,全局搜索,一搜索到就返回,后面的结果就没了
resp_2 = re.search(r"\d+","我有1000万,不给你画,我有1快,我全给你")
print("resp_2:",resp_2)
结果:
resp_2: <re.Match object; span=(2, 6), match='1000'>
可见,打印的是一个re.Match对象,span=(2,6)表示匹配的下标范围,match=‘1000’表示匹配具体的值。可用.group()函数获取具体匹配的值。
print("resp_2:",resp_2.group())
结果:
resp_2: 1000
finditer()
finditer和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
# finditer=>迭代器=>循环=>match=>group()
resp_1 = re.finditer(r"\d+","我有1000万,不给你画,我有1快,我全给你")
for i in resp_1:# i是分组,group是拿结果print(f"分组:{i}")print(i.group())
结果:
分组:<re.Match object; span=(2, 6), match='1000'>
1000
分组:<re.Match object; span=(15, 16), match='1'>
1
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
函数语法:
re.match(pattern, string, flags=0)
参数:
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
示例:
words = "my name is edward_tan"
print(re.match(r'(.*) is (.*)', words).groups()) # 在起始位置匹配
结果:
('my name', 'edward_tan')
sub()
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
示例:
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num_1 = re.sub(r'#.*$', "", phone)
print("电话号码是: ", num_1)# 删除非数字(-)的字符串
num_2 = re.sub(r'\D', "", phone)
print("电话号码是 : ", num_2)
代码中"#.*$"意思是匹配#符号直到结尾,\D代表匹配所有非零字符串
结果:
电话号码是: 2004-959-559
电话号码是 : 2004959559
感谢您的三连,我会继续努力,为您带来更好的博客!!!