2024-10.python包与模块

2024-04-17 20:20
文章标签 python 模块 2024 包与

本文主要是介绍2024-10.python包与模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

模块与包

模块

模块介绍

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。而这样的一个py文件在Python中称为模块(Module)。

模块是组织代码的更高级形式,大大提高了代码的阅读性和可维护性。

模块一共四种:

  • 解释器内建模块
  • python标准库
  • 第三方模块
  • 应用程序自定义模块

另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。

模块导入
'''
# 方式1:导入一个模块
import 模块名
import 模块名 as 别名# 方式2:导入多个模块
import (模块1模块2 )import 模块1,模块2# 方式3:导入成员变量
from 模块名 import 成员变量
from 模块名 import *
'''

导入模块时会执行模块,多次导入只执行一次。

案例:

cal.py
logger.py
main.py
#cal.py
def add(x,y):return x + ydef mul(x,y):return x * yprint('这是cal模块文件')
#logger.py
def get_logger():print('打印日志!')print('这是logger模块文件')
#main.py
import cal #导入了cal模块
import logger #导入和logger模块
#注意:import导入模块,就好比是将模块中的代码执行了
from cal import mul #将cal模块中的mul成员进行导入#调用用了cal模块中的add函数
result = cal.add(1,2)
print(result)
c = mul(3,4)
print(c)#调用了logger模块中的get_logger函数
logger.get_logger()
__name__

__name__是python内置变量,存储的是当前模块名称。

对于很多编程语言来说,程序都必须要有一个入口。像C,C++都有一个main函数作为程序的入口,而Python作为解释性脚本语言,没有一个统一的入口,因为Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。

在刚才的案例中三个模块都打印一次__name__

#cal.py
def add(x,y):return x + ydef mul(x,y):return x * yprint('这是cal模块文件,__name__内置变量的值为:',__name__)#logger.py
def get_logger():print('打印日志!')print('这是logger模块文件,__name__内置变量的值为:',__name__)#main.py:作为执行文件
import cal #导入了cal模块
import logger #导入和logger模块print('main文件的__name__这个内置变量为:',__name__)

结果为:

这是cal模块文件,__name__内置变量的值为: cal
这是logger模块文件,__name__内置变量的值为: logger
main文件的__name__这个内置变量为: __main__

通过结果发现__name__只有在执行模块中打印__main__,在其他导入模块中打印各自模块的名称。

所以,__name__可以有以下作用:

  • 利用__name__=="__main__"声明程序入口。
  • 可以对导入的模块进行功能测试

什么是包

当一个项目中模块越来越多,维护和开发不是那么高效的时候,我们可以引入一种比模块更高级语法:包。

包是对相关功能的模块py文件的组织方式。

包可以理解为文件夹,更确切的说,是一个包含__init__文件的文件夹。

导入包的语法
  1. import 包名[.模块名 [as 别名]]
  2. from 包名 import 模块名 [as 别名]
  3. from 包名.模块名 import 成员名 [as 别名]

案例:将上面案例中的cal .py文件放到utils包中管理,logger.py放到logger包中管理。

-- demomain.py  #执行文件-- m_log #包__init__.pylogger.py #存储在logger包中的一个模块
from m_log import logger
logger.get_logger() #调用了logger模块中的get_logger函数

常见模块

time模块

三种时间形式

在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:

(1) 时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

(2) 格式化的时间字符串(Format String): ‘1988-03-16’

(3) 元组(struct_time) :struct_time元组共有9个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

# <1> 时间戳>>> import time
>>> time.time()     
1493136727.099066# <2> 时间字符串
>>> time.strftime("%Y-%m-%d %X") #%Y:年 %m:月 %d:天 %X:时分秒
'2017-04-26 00:32:18'#<3> 程序暂定固定的时间
import time
print('正在下载数据......')
time.sleep(2) #程序暂定n秒
print('下载成功!')

小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的

import time
#计算一组程序执行的耗时
start = time.time()
#测试代码
num = 0
for i in range(10000000):num += 1
print(num)
##############################
print('总耗时:',time.time()-start)

random模块

>>> import random
>>> random.random()      # 大于0且小于1之间的小数
0.7664338663654585
>>> random.randint(1,5)  # 大于等于1且小于等于5之间的整数
2
>>> random.randrange(1,3) # 大于等于1且小于3之间的整数
1
>>> random.choice([1,'23',[4,5]])  # 返回列表中的随机一个元素
1
>>> random.sample([1,'23',[4,5]],2) # 列表元素任意2个随机组合
[[4, 5], '23']
>>> random.uniform(1,3) #大于1小于3的小数
1.6270147180533838
>>> item=[1,3,5,7,9]
>>> random.shuffle(item) # 直接将原来的列表元素打乱次序,不会返回一个新列表
>>> item
[5, 1, 3, 7, 9]

随机验证码案例:

import random
def v_code():code = '' #存储验证码数据for i in range(5):num = random.randint(0,9) #产生了一个随机的个位数alf = chr(random.randint(65,90)) #随机产生了一个字母add = random.choice([num,alf]) #随机从列表中选择一个元素code = ''.join([code,str(add)])return codecode_text = v_code()
print(code_text)

os模块

os模块是与操作系统交互的一个接口

import osos.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  # 改变当前脚本工作目录;相当于shell下cd
os.curdir   # 返回当前目录: ('.')
os.pardir  # 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')   # ***可生成多层递归目录
os.removedirs('dirname1')    # ***若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    #*** 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    # *** 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    # ***列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  #*** 删除一个文件
os.rename("oldname","newname")  #*** 重命名文件/目录
os.stat('path/filename') #  获取文件/目录信息
os.sep    # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    # 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep    # 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  # 运行shell命令,直接显示
os.environ  # 获取系统环境变量
os.path.abspath(path)  # ***返回path规范化的绝对路径
os.path.split(path)  # 将path分割成目录和文件名二元组返回
os.path.dirname(path)  # 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) #  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) #  ***如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)  # 如果path是绝对路径,返回True
os.path.isfile(path)  # ***如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  # ***如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  # 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path)  # 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) # ***返回path的大小

序列化模块:json

序列化: 将python中的字典,列表对象转换成指定形式字符串

反序列化:将指定格式的字符串转换成字典,列表对象

  • 基本使用

  • import json
    dic = {'hobby':['football','pingpang','smoke'],'age':20,'score':97.6,'name':'zhangsan'
    }
    #序列化:将字典对象转换成了json格式的字符串
    r = json.dumps(dic)
    print(r)
    
    import jsonstr = '{"hobby": ["football", "pingpang", "smoke"], "age": 20, "score": 97.6, "name": "zhangsan"}'
    #反序列化:将字符串转换成了字典对象
    dic = json.loads(str)
    print(dic)
    
    #持久化存储字典
    import json
    dic = {'hobby':['football','pingpang','smoke'],'age':20,'score':97.6,'name':'zhangsan'
    }
    fp = open('./dic.json','a')
    #dump首先将dic字典进行序列化,然后将序列化后的结果写入到了fp表示的文件中
    json.dump(dic,fp)
    fp.close()
    
    import json
    fp = open('./dic.json','r')
    #load将文件中的字符串数据进行读取,且将其转换成字典类型
    dic = json.load(fp)
    print(dic)
    fp.close()
    

正则模块

  • 什么是正则表达式?

    • 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(例如,*,+,?等)。
    • 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
  • 常用的正则标识

  • 单字符:. : 除换行以外所有字符[] :[aoe] [a-w] 匹配集合中任意一个字符\d :数字  [0-9]数量修饰:* : 任意多次  >=0+ : 至少1次   >=1? : 可有可无  0次或者1次{m} :固定m次 hello{3,}{m,} :至少m次{m,n} :m-n次
    边界:$ : 以某某结尾 ^ : 以某某开头
    分组:(ab)  
    贪婪模式: .*
    非贪婪(惰性)模式: .*?
  • 正则在python中的使用

    • 基于re模块进行正则匹配操作

    • 主要使用re模块中的findall进行指定规则的匹配

      • findall(str,rule)
        • str表示即将进行匹配的原始字符串数据
        • rule表示指定规则的正则表达式
        • findall返回的是列表,列表中存储匹配到的指定内容
    • 练习

    • import re#提取170
      string = '我喜欢身高为170的女孩'
      ex = '\d+'
      result = re.findall(ex,string)
      print(result[0])
      #####################################################################
      #提取出http://和https://
      key='http://www.baidu.com and https://boob.com'
      ex = 'https?://'
      result = re.findall(ex,key)
      print(result)
      #####################################################################
      import re
      #提取出hello
      key='lalala<hTml>hello</HtMl>hahah' #输出<hTml>hello</HtMl>
      ex = '<hTml>.*</HtMl>'
      result = re.findall(ex,key)
      print(result)#####################################################################
      #提取出hit.
      key='bobo@hit.edu.com'#想要匹配到hit.
      # ex = 'h.*\.' #贪婪模式
      ex = 'h.*?\.' #?将正则的贪婪模式调整为非贪婪模式。默认下为贪婪模式
      result = re.findall(ex,key)
      print(result)
      #####################################################################
      #匹配sas和saas
      key='saas and sas and saaas'
      ex = 'sa{1,2}s'
      result = re.findall(ex,key)
      print(result)
      #####################################################################
      key = '你好我的手机号是13222222222你记住了吗'
      ex = '1[3,5,7,8,9]\d{9}'
      result = re.findall(ex,key)
      print(result)
      

这篇关于2024-10.python包与模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912755

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(