【重生之我学Python进阶】----第一章

看到这篇文章,说明你已经对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 + '\\' + file
        print(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

感谢您的三连,我会继续努力,为您带来更好的博客!!!

相关推荐
lizz66611 分钟前
Python查询ES错误ApiError(406, ‘Content-Type ...is not supported
python·elasticsearch
lqjun082717 分钟前
Focal Loss 原理详解及 PyTorch 代码实现
人工智能·pytorch·python
Kazefuku31 分钟前
python文件打包成exe文件
python·学习
源码方舟1 小时前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
萑澈2 小时前
2025深圳杯D题法医物证多人身份鉴定问题四万字思路
python·数学建模
Ronin-Lotus2 小时前
图像处理篇---MJPEG视频流处理
图像处理·python·opencv
请你喝好果汁6412 小时前
python_竞态条件
开发语言·python
正在走向自律2 小时前
Python 数据分析与可视化:开启数据洞察之旅(5/10)
开发语言·人工智能·python·数据挖掘·数据分析
dudly2 小时前
Python 字典键 “三变一” 之谜
开发语言·python
小明.杨3 小时前
Django 中时区的理解
后端·python·django