Python学习基础笔记四十四——模块

news2024/9/21 16:39:44

1、看一个例子:

创建一个demo.py文件:

print('in demo.py')


def hello():
    print('in hello function')

然后我们在另外一个文件中import这个demo文件:

import demo


# 调用demo.py文件中的hello()函数
demo.hello()

注意,demo后面没有py。 

运行,产生结果:

模块:就是包含了Python定义和声明的文件,文件名就是模块名称加上.py的后缀。

import加载的模块分为4个通用类别:

1)使用python编写的代码(.py文件)

2)已被编译为共享库或DLL的C或C++扩展;

3)包好一组模块的包;

4)使用C编写并链接到python解释器的内置模块;

2、为什么使用模块?

我们退出python解释器,然后再重新进入,之前定义的函数或变量都将丢失,因此我们通常将程序写到文件中便可永久地保存下来,需要的时候就通过python test.py的方式去执行,此时test.py被称为脚本script。

随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分为一个个的文件,这样程序的结构更清晰,方便管理。这样,我们不仅仅可以将这些文件当脚本去执行,还可以把他们当作模块来导入到其他的模块中,实现了功能的重复利用。

3、如何使用模块:

import语句。

1)模块可以包含执行的语句和函数的定义。它们只在模块名第一次遇到import语句的时候才被执行,import语句可以在程序中的任意位置使用,可针对同一个模块import多次,为了防止重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象的一次引用,不会再重新执行模块中的语句。

import sys

print(sys.modules)

 2)我们可以从sys.modules中找到当前已加载的模块,sys.module是一个字典,内部包含模块名和模块对象的映射, 改字典决定了导入模块时是否要重新导入。

3)名称空间:每个模块都有自己的名称空间,定义在这个模块中的函数,把这个模块的命名空间当作全局名称空间,这样,我们在编写自己的模块的时候,就不用担心我们定义在自己模块中的全局变量会在被导入时,与使用者全局变量冲突。

4、import文件做的完整流程:

1)先从sys.modules里查看是否已经被导入;

2)如果没有被导入,就依据sys.path路径取寻找路径;

3)找到了就导入;

2)创建模块的命名空间;

3)执行文件,把文件的名字都放到命名空间中;

5、为模块起别名:

import time as t

print(t.time())

别名的应用场景:

#mysql.py
def sqlparse():
    print('from mysql sqlparse')
#oracle.py
def sqlparse():
    print('from oracle sqlparse')

#test.py
db_type=input('>>: ')
if db_type == 'mysql':
    import mysql as db
elif db_type == 'oracle':
    import oracle as db

db.sqlparse() 
复制代码

示例用法1

 为已经导入的模块起别名的方式对编写可扩展的代码很有用,假设有两个模块xmlreader.py和csvreader.py,它们都定义了函数read_data(filename):用来从文件中读取一些数据,但采用不同的输入格式。可以编写代码来选择性地挑选读取模块,例如

if file_format == 'xml':
     import xmlreader as reader
elif file_format == 'csv':
     import csvreader as reader
data=reader.read_date(filename)

提高了代码的兼容性。

注意的是:重命名之后,原来的module的名称就不能使用了,只能使用重命名的名称。

6、一行导入多个模块:

import time os re

我们在实际工作中,不建议这么使用。建议是分开写,以后注释也非常方便,代码也非常方便阅读。

在文件的开头部分,将所有的导入模块都列出来。

编码规则,导入模块也分先后顺序:

1)导入内置模块;

2)扩展的模块;例如:django模块

3)自定义的模块;

7、from...import...

1)import my_module, 会将源文件的名称空间my_module带到当前的名称空间中,使用时必须是my_module.名字的方式。

而frome语句相当于import, 也会创建新的命名空间,但是将my_module中的名字直接导入到当前的命名空间中,在当前的命名空间中,直接使用函数名字就可以了。

这两种方式各有千秋。

#测试一:导入的函数read1,执行时仍然回到my_module.py中寻找全局变量money
#demo.py
from my_module import read1
money=1000
read1()
'''
执行结果:
from the my_module.py
spam->read1->money 1000
'''

#测试二:导入的函数read2,执行时需要调用read1(),仍然回到my_module.py中找read1()
#demo.py
from my_module import read2
def read1():
    print('==========')
read2()

'''
执行结果:
from the my_module.py
my_module->read2 calling read1
my_module->read1->money 1000
'''

2)如果有重名的read1和read2, 那么会有覆盖的效果。

我们使用from * import read1, 那在本地的命名空间中全局就能使用read1, 但是,如果我们在本地定义了一个read1函数,就不能在本地命名空间中使用到这个read1函数了,会有一个覆盖的效果。

3)from demo import money, 这是一个变量。

需要特别强调的一点:python中的变量赋值不是一种存储操作,而只是一种绑定关系。

4)from demo import *   这种方式不太安全,可能会覆盖掉你之前已定义的名字,可读性极差,在交互环境中导入是没有问题的。

# demo.py
print('in demo.py')

money = 100


def hello():
    return 'in hello function', 100

# 01homework.py
__all__ = ['money']     # 这个地方做了限制,只能有money这个变量, 这个__all__只跟这个*有关联

from demo import *

print(money)
ret = read()           # 在pycharm中,read有红色的波浪线显示read函数名无效
print(ret)

结果:

 5)也支持重命名:

from demo import read as r

6)支持导入多行:

from demo import (read1,
                  read2,
                  money)

7)如果在demo.py文件中的变量名字前加_, 即_money, 则from demo import *, 则_money变量不能被导入。

总结:

所有的模块导入,都应该尽量写在代码的开头部位。顺序:内置模块、拓展模块、自定义模块。

import 模块名:

模块名.变量名和本地的同名变量名不会发生冲突

import 模块名 as 重命名的模块名, 提高代码的兼容性,完成相同的功能,使用相同的名字,例子:数据库和文件

import 模块名1 模块名2 模块名3   不推荐这种写法

from 模块名 import 变量名:

直接使用变量名,就可以完成操作

如果本文件中有相同的变量名就发生冲突,这个要注意的。

from 模块名 import 变量名 as 重命名的变量名

from 模块名 import 变量名1 变量名2 变量名3

from 模块名 import * 将模块中的所有变量名都放到内存中。你都不知道模块中有哪些名字,容易导致冲突。

from 模块名 import * 和__all__是一对。没有这个变量,会导入所有的名字,如果有all,只导入,只导入all列表中的变量。

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

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

相关文章

Linux系统网络编程——第二十节 多路复用之epoll 模型

目录 epoll相关系统调用 1、epoll_create: 2、epoll_ctl() 3、epoll_wait epoll模型原理 epoll的使用场景 各位好,博主新建了个公众号《自学编程村》,拉到底部即可看到,有情趣可以关注看看哈哈,关注后还可以加博主…

Redis原理篇

目录Redis数据结构动态字符串SDS整数集合Intset键值型Dict压缩链表 ZipList快速链表QuickList跳表SkipList对象RedisObjectRedis网络模型Redis通信协议-RESP协议Redis内存回收过期key处理内存淘汰策略Redis数据结构 动态字符串SDS Redis构建了一种新的字符串结构,…

从C#5.0说起:再次总结C#异步调用方法发展史

本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法。 .NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢? 其实,我们抛开.NET环境看线程同步,无非是执行两种操…

软件测试基础知识总览【纯知识,建议收藏慢慢学】

1. 软件测试定义 首先要明确测试的定义,所谓测试,就是以检验产品是否满足需求为目标。 而软件测试,自然是为了发现软件(产品)的缺陷而运行软件(产品) 比较标准的软件测试的定义是:在规定的条件下对程序进行操作,以发现错误,对软件质量进行评估。 IEE…

算法总结,不断更新

文章目录摩尔投票法DFS算法BFS算法题源来自于力扣网 摩尔投票法 适用场景 如何在选票无序的情况下,选出获胜者。 例题: 找出数组中,出现次数超过总数一半的数字(出现次数 > n/2)。 输入:[1,1,3,2,4,6,…

10000字吐血总结+24张图带你彻底弄懂线程池

大家好。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现,池化技术的核心思…

MVC|JAVA|SSM框架计算机硬件评测交流平台的开发和实现

收藏点赞不迷路 关注作者有好处 文末获取源码 项目编号:BS-PT-070 一,项目简介 计算机硬件在社会上有很多广泛的发烧友,他们急需一个发布专业硬件测评数据的平台并进行交流互动的社区。本次开发实现的计算机硬件交流平台就是作为一个专业的…

Android序列化之Parcel源码分析(2)

文章目录1.Parcel.java2.Parcelable和Parcel的关系3.Parcel写入数据源码分析3.1.java层Parcel创建3.2.native层Parcel创建3.3写入IBinder接口标识符3.4写入String数据4.Parcel读取数据源码分析4.1获取IBinder接口标识符4.2读取String数据1.Parcel.java Android可以通过Parcel进…

【OpenCV学习】第15课:处理卷积边缘问题

仅自学做笔记用,后续有错误会更改 (卷积的概念可以看看第14课) 理论 卷积边缘问题:从下图最右方的结果可以看出,卷积操作之后, 剩余的绿色像素部分, 我们是没有处理到的 那么如何处理这个问题呢&#xf…

论文3:查找文献在指定期刊的引用格式

文章目录说明:1.谷歌学术搜索(可以用一些国内的镜像),并点击被引用次数2.勾选在引用文章中搜索,并在搜索框搜索指定期刊的关键词3.这里指定期刊是RAL即IEEE Robotics and Automation Letters4.任意点开上图中的一篇文章…

支付宝当面付网站对接支付教程

有很多人会开支付宝当面付但是不会配置它老会出现一下情况 第二种情况如下: 如果遇到以上情况可以按照我的步骤就可以解决 详细步骤: 一、应用APPID获取方法 1.打开网站:https://openhome.alipay.com/platform/developerIndex.htm&#x…

Canal配置多个实例以及将Mysql指定表的binlog导入指定的Kafka的Topic

Canal配置多个实例以及将Mysql指定表的binlog导入指定的Kafka的Topic 进入Canal的conf目录 复制模板配置文件 cp -r example/ Ordercp -r example/ Orderdetail修改canal.propertieswenjain vim canal.properties修改内容如下,指定输出模式为kafka canal.serverM…

【元胞自动机】心房颤动/扑动模型研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

(附源码)ssm学校疫情服务平台 毕业设计 291202

ssm学校疫情服务平台 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对学校疫情服务平台等问…

【数电实验】触发器及其应用

实验三 触发器及其应用 一 实验目的 1 了解触发器的触发方式(上升沿触发、下降沿出发)及其触发特点; 2 测试常用触发器的逻辑功能; 3 掌握用触发器设计同步时序逻辑电路的方法。 二 实验内容 1 测试双D触发器74HC74的逻辑功能…

手工编译konsole备忘

背景 系统自带的终端弱爆了,本来想编译深度终端的,但DTK风格的程序在非DDE桌面(应该是dde_kwin这个窗管的问题)巨难看,无意中添加了Konsole,发现已经有我需要使用的右键打开当前目录文件管理器的功能。 …

Go context.Context的学习

一、前言 Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。 context翻译成中文是”上下文”,即它可以控制一组呈树状结构的goroutine&a…

java计算机毕业设计ssm疫情期间校园车辆入校预约管理服务系统1171a(附源码、数据库)

java计算机毕业设计ssm疫情期间校园车辆入校预约管理服务系统1171a(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe…

没有二十年功力,写不出 Thread.sleep(0) 这一行“看似无用”的代码

这篇文章要从一个奇怪的注释说起,就是下面这张图: 我们可以不用管具体的代码逻辑,只是单单看这个 for 循环。 在循环里面,专门有个变量 j,来记录当前循环次数。 第一次循环以及往后每 1000 次循环之后,进…

ssm+vue基本微信小程序的校园二手商城系统 计算机毕业设计

在当今社会的高速发展过程中,产生的劳动力越来越大,提高人们的生活水平和质量,尤其计算机科技的进步,数据和信息以人兴化为本的目的,给人们提供优质的服务,其中网上购买二手商品尤其突出,使我们…