Chapter 20 Python包

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!

文章目录

  • 前言
  • 一、自定义包
    • 1. 什么是Python包?
    • 2. 目录结构
    • 3. 导入方式
    • 4. `__all__`变量
  • 二、第三方包
    • 1. 什么是第三方包?
    • 2. 安装第三方包


前言

在 Python 中,包是组织代码的重要方式,它使得代码的管理和复用变得更加高效和简洁。本文详细讲解了 Python 包的概念和使用以及如何利用第三方包扩展 Python 的功能和特性。


本篇文章参考:黑马程序员

一、自定义包

1. 什么是Python包?

思考:在Python编程中,通过导入外部模块可以扩展代码的功能。但是,如果Python的模块过多,可能会造成一定的混乱,我们应该如何管理呢?
答:可使用Python包的结构和管理方式来有效组织和管理这些模块。

Python包(Package)是一种组织和管理Python模块的方式。

2. 目录结构

一个Python包实际上是一个包含多个模块的目录。包的目录下必须包含一个特殊的文件,通常是__init__.py,这个文件可以是空的,也可以包含初始化代码,用于标识该文件夹是Python的包,而非普通的文件夹。
在这里插入图片描述
在这里插入图片描述

3. 导入方式

通过点号.语法来导入特定的模块或子包。

方式一:
import 包名.模块名
包名.模块名.目标

方式二:
from 包名 import 模块名
模块名.目标

方式三:
from 包名.模块名 import 目标
目标

方式四:
from 包名.模块名 import *
模块名.目标

例如:
新建一个my_package包,并在包下定义两个模块my_module1.py和my_module1.py。
在这里插入图片描述
在模块my_module1.py输入如下代码:

def info_print1():print("我是模块1的功能函数代码")

在模块my_module2.py输入如下代码:

def info_print2():print("我是模块2的功能函数代码")

导入自定义的包中的模块并使用

"""
方式一:
import 包名.模块名
包名.模块名.目标
"""
import my_package.my_module1
import my_package.my_module2my_package.my_module1.info_print1()
my_package.my_module2.info_print2()

输出结果:
我是模块1的功能函数代码
我是模块2的功能函数代码

"""
方式二:
from 包名 import 模块名
模块名.目标
"""
from my_package import my_module1
from my_package import my_module2
my_module1.info_print1()
my_module2.info_print2()

输出结果:
我是模块1的功能函数代码
我是模块2的功能函数代码

"""
方式三:
from 包名.模块名 import 目标
目标
"""
from my_package.my_module1 import info_print1
from my_package.my_module2 import info_print2
info_print1()
info_print2()

输出结果:
我是模块1的功能函数代码
我是模块2的功能函数代码

"""
方式四:
from 包名.模块名 import *
模块名.目标
"""
from my_package import *
my_module1.info_print1()
my_module2.info_print2()

输出结果:
我是模块1的功能函数代码
我是模块2的功能函数代码

4. __all__变量

通过在 __init__.py 中定义 __all__ 变量,可控制 import * 能够导入的内容。

在模块 __init__.py 中输入如下代码:

__all__=['my_module1']

通过__all__变量控制import*

from my_package import *
my_module1.info_print1()
my_module2.info_print2()   # my_module1没有被包含在 __all__ 中,会报错

输出结果:
我是模块1的功能函数代码
NameError: name ‘my_module2’ is not defined. Did you mean: ‘my_module1’?

注意:
__all__变量针对的是 from 包名.模块名 import *这种导入方式,对import xxx 这种导入方式无效。

二、第三方包

1. 什么是第三方包?

通过前面的学习我们知道,包可以包含多个Python模块,而每个模块又内含多个的功能。因此,我们可以将一个包视为一组相关功能的集合。

在 Python 中,第三方包指的是由社区或个人开发并发布的,不是 Python 标准库的包。这些包可以为开发者提供各种额外的功能和特性,从而扩展 Python 的基本功能,如:

领域常用包
科学计算NumPy
数据分析Pandas
大数据计算PySpark、Apache Flink
图形可视化Matplotlib、Pyecharts
人工智能TensorFlow

这些第三方的包,极大的丰富了Python的生态,提高了开发效率。但是由于是第三方,所以Python没有内置,我们需要安装它们才可导入使用。

2. 安装第三方包

①pip安装

命令格式:
pip install 包名称

Win+R 打开运行对话框,在对话框中输入cmd并回车进入命令提示符。
在这里插入图片描述
输入pip install 包名称即可通过网络快速安装第三方包。
例如,安装NumPy包:
在这里插入图片描述
由于pip是连接的国外的网站进行包的下载,所以有时候下载速度很慢。
我们可以通过如下命令,让其连接国内的网站进行包的安装:

命令格式:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称

https://pypi.tuna.tsinghua.edu.cn/simple 是清华大学提供的一个网站,可供pip程序下载第三方包。
例如,安装Pandas包:
在这里插入图片描述

②Pycharm安装
PyCharm也提供了安装第三方包的功能。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
如果下载速度很慢,可其连接国内的网站(https://pypi.tuna.tsinghua.edu.cn/simple)进行包的安装。
在这里插入图片描述

【例题】

str_util.py:

# 字符串相关工具
def str_reverse(s):"""功能:将字符串反转:param s:将被反转的字符串:return:反转后的字符串"""return s[::-1]# 字符串相关工具
def substr(s,x,y):"""功能:按照给定下标完成给定字符串的切片:param s:即将被切片的字符串:param x:切片的开始下标:param y:切片的结束下标:return:切片完成后的字符串"""return s[x:y]# 测试功能
if __name__ == '__main__':print(str_reverse("Hello"))print(substr("Python",1,3))

输出结果:
olleH
yt

file_util.py:

# 文件处理相关工具
def print_file_info(file_name):"""功能:将给定路径的文件内容输出到控制台中:param file_name:即将读取的文件路径:return:None"""f1=None   #设置初始值try:f1=open(file_name,"r",encoding="UTF-8")content=f1.read()print("文件全部内容如下:")print(content)except Exception as e:print(f"程序出现异常,原因为{e}")finally:# 如果f1为None,执行f1.close()会引发AttributeError异常# 因此设置判断 if f1: 确保在关闭文件之前,f1 确实指向一个非 None 的有效文件对象,避免潜在的错误。if f1:   # 如果变量为None,表示False,不会执行f1.close()f1.close()def append_to_file(file_name, data):"""功能:将指定的数据追加到指定的文件中:param file_name:指定的文件路径:param data:指定的数据:return:None"""f2=open(file_name,"a",encoding="UTF-8")f2.write(data)f2.write("\n")f2.close()if __name__ == '__main__':print_file_info("D:/test.txt")append_to_file("D:/test.txt", "Hello Python!!!")append_to_file("D:/test.txt", "Hello World!!!")

新建一个test.txt文本文件并输入如下内容:
在这里插入图片描述

输出结果:
文件全部内容如下:
Hello python!
Hello everyone!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP反序列化漏洞

一.PHP的序列化和反序列化 (1).作用 PHP的序列化和反序列化是PHP中用于存储或传输PHP的值的一个过程。序列化是将变量转换为可存储或传输的字符串的过程,而反序列化则是将这些字符串转换回PHP变量的过程。这两个过程在PHP开发中非常有用&am…

vue element-ui日期控件传参

前端&#xff1a;Vue element-ui <el-form-item label"过期时间" :rules"[ { required: true, message: 请选择过期时间, trigger: blur }]"><el-date-picker v-model"form.expireTime" type"date" format"yyyy-MM-dd&…

Linux--序列化与反序列化

序列化 序列化是指将数据结构或对象状态转换成可以存储或传输的格式的过程。在序列化过程中&#xff0c;对象的状态信息被转换为可以保持或传输的格式&#xff08;如二进制、XML、JSON等&#xff09;。序列化后的数据可以被写入到文件、数据库、内存缓冲区中&#xff0c;或者通…

当年很流行,现在已经淘汰的Java技术,请不要学了!【建议收藏】

在Java技术的发展历程中&#xff0c;确实有一些曾经流行但现在已经被淘汰或不再推荐使用的技术。了解这些技术可以帮助你避免学习过时的知识&#xff0c;从而更高效地提升自己的技能。 以下是一些曾经流行但现在已经不太推荐学习的Java技术&#xff1a; 1. Servlet 2.x&#x…

谷粒商城实战笔记-71-商品服务-API-属性分组-前端组件抽取父子组件交互

文章目录 一&#xff0c;一次性创建所有的菜单二&#xff0c;开发属性分组界面1&#xff0c;左侧三级分类树形组件2&#xff0c;右侧分组列表3&#xff0c;左右两部分通信3.1 子组件发送数据3.2&#xff0c;父组件接收数据 Vue的父子组件通信父组件向子组件传递数据子组件向父组…

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中&#xff0c;有介绍过前端触发的通知服务。 【odoo】右上角的提示&#xff08;通知服务&#xff09; 此文章则介绍后端触发方法。 内容 直接上代码&#xff1a;但是前提一定是按钮触发&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; def bu…

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读 fixture 是 pytest 中一个非常重要的模块&#xff0c;可以让代码更加简洁。 fixture 的 autouse 为 True 可以自动化加载 fixture。 如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办&#xff1f;可不可以只运行一次初始化方法&#xff1f; 答&#xf…

17.延迟队列

介绍 延迟队列&#xff0c;队列内部是有序的&#xff0c;延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中&#xff0c;消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺&#xff0c;如果十天内没…

【Ant Design Vue的更新日志】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 以下是Ant Design Vue的更新日志 版本1.7.0(发布日期:2023年4月) …

TCP/IP协议——使用Socket套接字实现

目录 Socket 使用Socket实现TCP客户端和服务器的过程 使用Socket搭建TCP服务器 线程优化 向客户端发送消息 连接的断开 客户端主动断开 服务端主动断开 服务器完整的程序 使用Socket编写客户端程序连接TCP服务器 Socket Socket是一种网络通信协议&#xff0c;它允许…

渗透测试:筑牢网络安全的坚固防线

在当今这个互联网高度发达的时代&#xff0c;网络安全已成为维护社会稳定和经济发展的重要基石。随着互联网的普及&#xff0c;网络攻击手段日益复杂多变&#xff0c;各类安全威胁层出不穷。为了有效应对这些挑战&#xff0c;渗透测试作为一种重要的安全测试与评估方法&#xf…

arduino程序-数字输出-学用led(led电路及相关函数)(基础知识)

arduino程序-数字输出-学用led&#xff08;led电路及相关函数&#xff09;&#xff08;基础知识&#xff09; 1-10 数字输出1-学用ledLED发光二极管LED电压特性电阻 1-11 数字输出arduino控制LEDLed与arduino连接电路图高电平及低电平含义 1-10 数字输出1-学用led 元器件初步介…

关于 AGGLIGATOR(猛禽)网络宽频聚合器

AGGLIGATOR 是一个用于多个链路UDP/IP带宽聚合的工具软件&#xff0c;类似MTCP的作用&#xff0c;不过它是针对UDP/IP宽频聚合的。 举个例子&#xff1a; 中国大陆有三台公网服务器&#xff0c;中国香港有一台大带宽服务器。 那么&#xff1a; AGGLIGATOR 允许中国大陆的客户…

Day7-指针专题二

1. 字符指针与字符串 C语言通过使用字符数组来处理字符串 通常&#xff0c;我们把char数据类型的指针变量称为字符指针变量。字符指针变量与字符数组有着密切关系&#xff0c;它也被用来处理字符串 初始化字符指针是把内存中字符串的首地址赋予指针&#xff0c;并不是把该字符串…

独占电脑资源来执行一个应用

1. 背景 在人工智能时代&#xff0c;随着神经网络的发展&#xff0c;训练人工智能模型需要越来越多的硬件资源&#xff0c;例如&#xff0c;利用10万条棋局数据、使用一台PC电脑、完整地训练一次确定性神经网络五子棋模型&#xff0c;需要花费一年半的时间。随着训练数据的增长…

<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?

前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe)&#xff1a; 命名管道(FIFO)&#xff1a; 消息队列(MQ)&#xff1a; 信号量(semaphore)&#xff1a; 共享内存(shared memory)&#xff1a; 信号(signal)&#xff1a; 内存映射(mapped memory)&#xff1a; 内存映射和共享内存的区…

NFTScan 正式上线 ERC404 浏览器和 NFT API 数据服务

近日&#xff0c;NFTScan 团队正式对外发布了 ERC404 浏览器&#xff0c;将为 ERC404 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;帮助用户更方便地访问和分析 ERC404 相关的 NFT 数据&#xff0…

git使用总结

概述 简介 Git是一种代码托管技术&#xff0c;很多代码托管平台也是基于Git来实现的。 Git可以帮我们做到很多的事情&#xff0c;比如代码的版本控制&#xff0c;分支管理等。 网址 git官网&#xff1a;https://git-scm.com/ 版本控制系统【VCS】 可以完整保存项目的快照&#…