python——模块 迭代器 正则

一、python模块

先创建一个 .py 文件,这个文件就称之为 一个模块 Module。

使用模块的优点:

模块化编程,多文件编程

1.2 模块的使用

1.2.1 import语句

想要B.py文件中,使用A.py文件,只需要在B.py文件中使用关键字import导入即可。

import A

# 若A是一个包的话,可以这样写

import A.函数名

 

1.2.2 from ···import···语句

在python中,导入一个模块/文件通常使用关键字import,若是只想导入一个模块某个属性或方法,我们可以使用 from ... import ...语句。

语法格式

from 模块名/包名 import 属性名, 函数名

 

1.3 Python中的包

随着模块数目的增多,把所有模块不加区分地放到一起就显得非常不合理了,于是Python为我们提供了一种把模块组织到一起的方法,即创建一个包。

因为包是模块,所以包的使用和普通模块的使用方式是一样的。

1.3.1 什么是包

模块 就是 一个 .py 文件

包 就是一个包含 __init__.py文件的 文件夹,文件夹中可以包含子包或者模块。

创建包的目的不是为了运行,而是为了被导入使用,包的本质就是模块,因此可以将包当做模块来导入。

包是不能像普通模块那样被执行代码,所以包提供了一个__init__.py文件,导入包就会执行__init__.py文件,这也是__init__.py文件存在的意义。

1.3.2 如何使用包

1.3.3 导入自定义包

导入自定义的包,必须确保包在Python的搜索路径中 ,Python在导入包时会查找特定的目录列表,这个列表通常包括:

  1. 当前脚本所在的目录。
  2. 环境变量PYTHONPATH中指定的目录。
  1. Python安装目录中的库目录,如Lib/site-packages。

为了确保你的自定义包可以被导入,你需要确保它的目录在上述列表中的一个。最常见的方法是将你的包放在当前脚本所在的目录或一个子目录中,或者将包的目录添加到PYTHONPATH环境变量中。

1.4 Python常用标准库

Python 标准库非常庞大,所提供的模块涉及范围十分广泛,使用标准库我们可以让您轻松地完成各种任务。

下面是一些Python3中常用的标准库。

模块名称

模块描述

os

os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。

sys

sys 模块提供了与 Python 解释器和系统相关的功能,例如解释器的版本和路径,以及与 stdin、stdout 和 stderr 相关的信息。

time

time 模块提供了处理时间的函数,例如获取当前时间、格式化日期和时间、计时等。

datetime

datetime 模块提供了更高级的日期和时间处理函数,例如处理时区、计算时间差、计算日期差等。

math

math 模块提供了数学函数,例如三角函数、对数函数、指数函数、常数等。

json

json 模块提供了 JSON 编码和解码函数,可以将 Python 对象转换为 JSON 格式,并从 JSON 格式中解析出 Python 对象。

numpy

一个用于维度数组计算的库

opencv

一个用于计算机视觉的库

matplotlib

一个用于数据可视化的库(绘图)

scikit-learn

一个用于机器学习的库

tensorflow

一个用于深度学习的库

threading

一个用于设置多线程的库

二、迭代器与生成器 

2.1 迭代器

迭代是python访问集合中元素的一种方式,迭代器是一个可以记住遍历的位置的对象。

举例:

使用map()函数,将一个函数作用于一个序列中的所有元素,并返回一个迭代器——对迭代器可以再次转换成list tuple set等等等

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不能后退。

迭代器有两个基本的方法:iter() 和 next()。

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代

创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。

  • iter() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。
  • next() 方法会返回下一个迭代器对象。
# 创建一个返回数字的迭代器,起始值为10,逐步递增10
# 也就是说起始值是10,步长值为10
class num:def __iter__(self):self.a = 0return selfdef __next__(self):if self.a <=100:x = self.aself.a += 10return xelse:raise StopIteration#实例化对象
ls = num()
iter1 = iter(ls)
try:while True:print(next(iter1),end=' ')
except StopIteration:print('迭代完成')
#0 10 20 30 40 50 60 70 80 90 100 迭代完成

练习:# 实现一个自定义迭代器类MyRange,其功能类似于内置的range()函数,

          # 但要求支持步长参数,并且只能从0开始迭代

class myiter:def __init__(self,end,spet):self.start = 0self.end = endself.spet = spetdef __iter__(self):return selfdef __next__(self):if self.start<self.end:x = self.startself.start+=self.spetreturn xelse:raise StopIterationresult = myiter(5,2)
iter1 = iter(result)
try:while True:print(next(iter1))
except StopIteration:print('迭代结束')
"""
0
2
4
迭代结束
"""

2.2 生成器

在python中,使用了 yield 的函数就被称为——生成器。

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单的理解【生成器就是一个迭代器】。

每次使用yield语句生产一个值之后,函数都将暂停执行【内存释放出来】,等待再次唤醒。

yield语句和return语句的差别就在于yield语句返回的是可迭代对象,而return返回的是不可迭代对象。

每次调用生成器的next()方法或者使用for或while循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇见yield语句。

def create(n):while n>0:yield nn-=1create_iter = create(5)
print(next(create_iter))#5
print(next(create_iter))#4
print(next(create_iter))#3
print(next(create_iter))#2
print(next(create_iter))#1
# print(next(create_iter))会报错StopIteration# for i in create_iter:
#     print(i,end=' ')

生成器的优势是它们是按需生成值,避免一次性生成大量数据并占用大量内存,此外生成器还可以与其他迭代工具(如for循环)无缝衔接配合使用,提供了更加简洁和高效的迭代方式

练习:

使用生成器实现一个函数fibonacci(n),该函数返回一个生成斐波那契数列的生成器,

其中n表示生成斐波那契数列的元素个数。

def fun(n):a,b = 1,1while n:yield aa,b = b,a+bn-=1
n = fun(5)
try:while True:print(next(n))
except Exception as f:print(f)

三、正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。

一个正则表达式的匹配工具:regex101: build, test, and debug regex

s = "C:\\a\\b\\c"
print(s)#C:\a\b\c# 正则表达式中遇见 \ 为转义字符,自动转义
# 若在前面加 r 说明是原生字符串,不转义s1 = r"C:\\a\\b\\c"
print(s1) #C:\\a\\b\\c

3.1 re.match函数

re.match 是从字符串的起始位置匹配一个模式,匹配不成功就返回None。

语法:re.match(pattern, string, flags=0)

参数:

         pattern 需要匹配的正则表达式

         string 匹配的字符串

         flags 标志位,用于控制正则表达式的匹配方式, 如:是否区分大小写,多行匹配等

 若匹配到了数据,就可以使用group(num) 或 groups() 来提取数据了。

group(num=0) 匹配整个字符串,可以设置参数

groups() 返回一个元组,包含所有小组字符串的元组

import re
s = 'hello and world'
ret = re.match('hello',s)
print(ret.group())#helloret2 = re.match('and',s)
print(ret2.group())#error

3.2 re.search函数

re.search 扫描整个字符串并返回第一个成功匹配的字符串。

import re
s = 'and hello and and world'
ret = re.search('and',s)
print(ret.group())#and返回第一个能匹配的

3.3 re.findall函数

re.findall 匹配整个字符串,返回string中所有与pattern相匹配的全部子串,返回形式为数组

import re
s = 'and hello and and world'
ret = re.findall('and',s)
print(ret)#['and', 'and', 'and']

3.4 matchr、search、findall的区别

  1. re.match 从首字母匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None。
  2. re.search 匹配整个字符串,直到找到一个对应匹配【若有多个,也只返回第一个】。
  3. re.findall 返回匹配到的所有子串。

3.5 正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符

描述

re.I

使匹配对大小写不敏感。

re.L

做本地化识别(locale-aware)匹配。

re.M

多行匹配,影响 ^ 和 $。

re.S

使 . 匹配包括换行在内的所有字符。

re.U

根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B。

re.X

该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

import re
s = 'and hello and And world'
ret = re.findall('and',s,re.I)
print(ret)#['and', 'and', 'And']ret2 = re.findall('and',s)
print(ret2)#['and', 'and']

3.6 正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式。

  1. 字母和数字表示他们自身。
  2. 一个正则表达式模式中的字母和数字匹配同样的字符串。
  3. 多数字母和数字前加一个反斜杠时会拥有不同的含义。
  4. 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
  5. 反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。

import re
s = '__ 888 hqyj 666 &&&&&'ret1 = re.findall('.', s)
ret2 = re.findall('[h6]', s)
ret3 = re.findall(r'\d', s)
ret4 = re.findall(r'\D', s)
ret5 = re.findall(r'\w', s)
ret6 = re.findall(r'\W', s)print(ret1)#['_', '_', ' ', '8', '8', '8', ' ', 'h', 'q', 'y', 'j', ' ', '6', '6', '6', ' ', '&', '&', '&', '&', '&']
print(ret2)#['h', '6', '6', '6']
print(ret3)#['8', '8', '8', '6', '6', '6']
print(ret4)#['_', '_', ' ', ' ', 'h', 'q', 'y', 'j', ' ', ' ', '&', '&', '&', '&', '&']
print(ret5)#['_', '_', '8', '8', '8', 'h', 'q', 'y', 'j', '6', '6', '6']
print(ret6)#[' ', ' ', ' ', ' ', '&', '&', '&', '&', '&']

#匹配出一个字符串第一个字母为大写字符
#后面都是小写字母并且这些小写字母可有可无
import re
def fun1(n):ret = re.match('[A-Z]+[a-z]*', n)if ret:print(ret.group())else:print('匹配不成功')
n = input(">>")
fun1(n)#匹配变量名是否有效
def fun2(m):ret2 = re.match(r'[A-Za-z_]+\w*',m)if ret2:print(ret2.group())else:print("input error")
m = input(">>")
fun2(m)# 匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
def fun3(b):ret3 = re.match(r'\w{8,20}',b)if ret3:print(ret3.group())else:print("input error")
b = input(">>")
fun3(b)

import re
#匹配163.com的邮箱地址
# 以^确定开头
# 通过$来确定末尾
myemail = 'hqyj_sunwy@163.com'
ret = re.match(r'^\w{4,20}@163\.com$', myemail)
print(ret.group())

 

import re#匹配出163、126、qq邮箱
myemail = '2042856895@qq.com'
ret = re.match(r'^\w{4,20}@(163|126|qq)\.com$', myemail)
print(ret.group())#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())

注意贪婪和非贪婪

贪婪是尝试匹配尽可能多的字符。

非贪婪是尝试匹配尽可能少的字符。

解决方式:非贪婪操作符”?”,用在"*","+","?"的后面,要求正则匹配的越少越好。

import re
s = 'abbcdef123456'
ret = re.match(r'\w+', s)
print(ret.group())
# 输出结果:abbcdef123456
ret = re.match(r'\w+?', s)
print(ret.group())
# 输出结果:a

练习

注册用户:

1、输入邮箱,邮箱验证: 6-16位非特殊字符的163邮箱。

2、输入手机号,进行手机号验证。11位数字,第一位是1,第二位是2到9,其余0到9

3、输入用户名,不少于非特殊4位字符。

4、输入昵称,不少于2个字符。

5、输入密码,必须包含字母、数字,特殊符号。

输入正确则提示注册成功,不正确则重新输入。

import re
def user():d = {}count1 = 0while True:a = input("输入邮箱>>")t1 =re.match(r'\w{6,16}@163\.com$',a)if t1.group():d['邮箱'] = t1.group()count1+=1breakelse:print("输入错误请重新输入")while True:b = input("输入电话号码>>")t2 = re.match(r'[1]+[3-9]+\d{9}', b)if t2.group():d['电话号码'] = t2.group()count1 += 1breakelse:print("input error")while True:c = input("用户名>>")t3 = re.match(r'\w{4,}',c)if t3.group():d['用户名'] = t3.group()count1 += 1breakelse:print("input error")while True:f = input("昵称>>")t4 = re.match('..',f)if t4.group():d['昵称'] = t4.group()count1 += 1breakelse:print("input error")while True:e = input("密码>>")t5 = re.match(r'.{6}',e)if t5.group():d['密码'] = t5.group()count1 += 1breakelse:print("input error")if count1 == 5:return dprint(user())

3.8 re.split函数

功能是分割

import re
s = 'user:zhangsan pwd:888666'
ret = re.split(r':| ', s)
print(ret)

3.9 re.sub函数

功能是替换

import re
s = 'i am zhangsan, i am 18 year, i like eat'
ret = re.sub(r"i", "I", s)
print(ret)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/16771.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

STL之mapset|AVL树

STL之map&set|AVL树 set&map搜索二叉树实现代码 set的使用map的使用set&map的模拟实现&#xff08;见红黑树篇&#xff09; AVL树AVL树的模拟实现 set&map 前言&#xff1a;stl库中set和map的底层都是红黑树&#xff0c;一种平衡搜索二叉树&#xff0c;是我下…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

OceanBase 分区表详解

1、分区表的定义 在OceanBase数据库中&#xff0c;普通的表数据可以根据预设的规则被分割并存储到不同的数据区块中&#xff0c;同一区块的数据是在一个物理存储上。这样被分区块的表被称为分区表&#xff0c;而其中的每一个独立的数据区块则被称为一个分区。 如下图所示&…

代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结

LeetCode 322.零钱兑换&#xff1a; 文章链接 题目链接&#xff1a;322.零钱兑换 思路&#xff1a; 首先分析题目&#xff0c;每种硬币的数量是无限的&#xff0c;因此为完全背包问题&#xff1b;又要求返回的是最少硬币个数&#xff0c;因此与组合数/排列数无关&#xff0c…

计算机网络WebSocket——针对实习面试

目录 计算机网络WebSocket什么是WebSocket&#xff1f;WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景&#xff1f;说明WebSocket的建立连接的过程&#xff1f; 计算机网络WebSocket 什么是WebSocket&#xff1f; WebSocket是一个网络通信协议&#xff0c;提…

在Ubuntu 24.04 LTS上安装飞桨PaddleX

前面我们介绍了《在Windows用远程桌面访问Ubuntu 24.04.1 LTS》本文接着介绍安装飞桨PaddleX。 PaddleX 3.0 是基于飞桨框架构建的一站式全流程开发工具&#xff0c;它集成了众多开箱即用的预训练模型&#xff0c;可以实现模型从训练到推理的全流程开发&#xff0c;支持国内外多…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2&#xff1a;简单的语言模型社会解决复杂推理问题 论文地址&#xff1a;https://aclanthology.org/2024.emnlp-main.920/ 项目地址&#xff1a; https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…

(三十三)队列(queue)

文章目录 1. 队列&#xff08;queue&#xff09;1.1 定义1.2 函数1.3 习题1.3.1 例题&#xff08;周末舞会&#xff09; 2. 双向队列&#xff08;deque&#xff09;2.1 定义2.2 函数2.3 题目2.3.1 例题&#xff08;打BOSS&#xff09; 1. 队列&#xff08;queue&#xff09; 队…

web——upload-labs——第二关

MIME验证 MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;验证是指在互联网传输中&#xff0c;通过检查数据的MIME类型来确保数据格式的正确性和安全性。MIME最初是为了扩展电子邮件的功能&#xff0c;让邮件支持多种格式&#xff0c;如文本、图片、音频等…

Vue3 -- 集成sass【项目集成5】

集成sass&#xff1a; 看过博主的 配置styleLint工具应该已经安装过 sass sass-loader 了&#xff0c;所以我们只需要加上我们的 lang"scss"即可。 <style scoped lang"scss"></style>给项目添加全局样式文件&#xff1a; 在src文件夹下创建…

【Web前端】Promise的使用

Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作&#xff0c;并提供了一种机制来处理该操作最终的成功或失败。具体来说&#xff0c;Promise是由异步函数返回的对象&#xff0c;能够指示该操作当前所处的状态。 当Promise被创建时&#xff0c;它会处于“待定”&a…

EI检索!2024年大数据与数据挖掘会议(BDDM 2024)全解析!

第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xff09;将于2024年12月13-15日在武汉举行&#xff0c;已启动第二轮征稿&#xff0c;截稿2024年11月30日。邀请学者探讨大数据与数据挖掘进展&#xff0c;可在线投稿及AC学术中心查看详情。 大会官网&#xff1a;www.i…

基于java+ssm+Vue的校园美食交流系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

关于 MSVCP110.dll 缺失的解决方案

背景&#xff1a;之前使用 PR&#xff08;Adobe Premiere&#xff09; 从来没有遇到过这样的问题。今天重装系统后&#xff08;window 10&#xff09;&#xff0c;想要重新安装以前的软件时&#xff0c;遇到了以下 DLL 文件缺失的错误。 解决方案&#xff1a; 可以到微软官网的…

Python小游戏27——飞翔的小鸟

首先&#xff0c;你需要确保已经安装了Pygame库。如果还没有安装&#xff0c;可以通过以下命令进行安装&#xff1a; 【bash】 pip install pygame 游戏的代码&#xff1a; 【python】 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕大小和标题 screen_…

【Three.js基础学习】24. shader patterns

前言 课程回顾: ShaderMaterial 这里用的是着色器材质 所以顶点和片段着色器就不需要像原始着色器那样添加需要的属性 然后写 片段着色器需要属性 &#xff1a; 顶点 属性 -》变化 -》 片段中 顶点中的属性不需要声明 只需要声明传送的变量 例如 varying vec vUv; vUv uv; 补充…

构建客服知识库:企业效率提升的关键步骤

客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题&#xff0c;还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…

运动汇 专业的比赛管理平台数据获取

在获取到运动汇的网站链接后&#xff0c;界面如图所示: 右键检查&#xff0c;我们会发现没有任何数据&#xff0c;只有当我们点开这些"第一单元"、"第二单元"等&#xff0c;数据才会加载出来&#xff1b; 由于我们只需要分析这一个网页并获取其中的数据&a…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点&#xff0c;博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体&#xff0c;Blog站点所形成的网状结构促成了不同于以往社区的Blog文化&#xff0c;Blog技术缔造了“博客”文化。本文课题研究的“…

Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)

Docker搭建Cloudreve Cloudreve介绍&#xff1a; Cloudreve 是一个基于 ThinkPHP 框架构建的开源网盘系统&#xff0c;旨在帮助用户以较低的成本快速搭建起既能满足个人也能满足企业需求的网盘服务。Cloudreve 支持多种存储介质&#xff0c;包括但不限于本地存储、阿里云OSS、…