欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 【重生之我学Python进阶】----第一章

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

2024/12/22 0:56:57 来源:https://blog.csdn.net/2403_83182682/article/details/144281524  浏览:    关键词:【重生之我学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 + '\\' + 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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com