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

news2024/11/25 12:40: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/80243.html

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

相关文章

软件安全测试-BurpSuite使用详解

1.BurpSuite简介 Burp Suite 是用于攻击web 应用程序的集成平台,它包含了许多Burp工具,这些不同的burp工具通过协同工作,有效的分享信息,支持以某种工具中的信息为基础供另一种工具使用的方式发起攻击。 它主要用来做安全性渗透测…

我将 9 个 ChatGPT 账号接入微信,我现在整个人都麻了...

大家好,我是米开朗基杨。最近大家都被 ChatGPT 刷屏了,这家伙真是上天入地无所不能,不管什么问题都能解答,而且答案的质量非常高,完全不像机器人。于是乎我冒出个想法:如果把 ChatGPT 接入微信是什么感觉&a…

二维码介绍

二维码介绍 二维码(2-dimensional bar code、二维条码)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1…

repo的安装和使用

前言 Android 采用 Gerrit 提供代码评审服务,并且开发了一个客户端工具 repo,实现多仓库管理。Git 的开发者对服务端的 Git 源码做了扩展,使得基于 Git(cgit)的代码平台可以很容易引入新的集中式工作流。同样 git-rep…

概率统计·参数估计【矩估计、极大似然估计、无偏性、有效性、相合性】

点估计 设总体的分布函数形式已知,但它的一个或多个参数为未知,借助于总体的一个样本来估计总体未知参数的值的问题称为点估计问题 矩估计 这个还是看例子会比较好理解一些 例 先μ1E(x),μ2E(x2)有几个未知参数就列几次方的期望&#xff…

CSS -- 01. CSS基础

文章目录CSS基础1 CSS简介1.1 HTML的局限性1.2 CSS介绍1.3 CSS语法规范1.4 CSS代码风格2 CSS基础选择器2.1 选择器的分类2.2 标签选择器2.3 **类选择器**2.4 id选择器2.5 通配符选择器2.6 基础选择器总结3 CSS字体属性3.1 字体系列3.2 字体大小3.3 字体粗细3.4 文字样式3.5 字体…

[附源码]JAVA毕业设计医药垃圾分类管理系统(系统+LW)

[附源码]JAVA毕业设计医药垃圾分类管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

Day827.安全性、活跃性以及性能问题 -Java 并发编程实战

安全性、活跃性以及性能问题 Hi,我是阿昌,今天学习记录的是关于安全性、活跃性以及性能问题的内容。 并发编程中需要注意的问题有很多,主要有三个方面,分别是: 安全性问题活跃性问题性能问题 一、安全性问题 相信一…

论文讲解p2p4

本人水平有限,很多地方可能有说错或者理解错的地方请指出,谢谢谅解 一.原始电路图 1.简介:本电路是从1977年一篇电荷重新分配的理念进化而来,论文如下: All-MOS charge redistribution analog-to-digital conversion techniques. --JAMES L. McCREARY 2.因为从一开始充电过…

Java使用H2数据库全方式汇总

H2是轻量级数据库, 可以不需要安装就可以运行,对于快速学习和演示比较适用。关于H2的基本内容可以参考: H2 数据库简介 。 本篇快速介绍H2数据库在各种类型的Java应用中的使用, 包括: Java 项目Java Web 项目Spring B…

《域渗透攻防指南》签名版预售来啦

千呼万唤始出来!终于,在广大粉丝翘首期盼下,国内首本专门讲述域内攻防的书籍《域渗透攻防指南》在2022年最后一个月和大家见面了。为了回馈粉丝的等待,让粉丝早日拿到心仪的书,特此联合机械工业出版社弄了签名版书预售…

GLAD:部分相干光模拟

概述 一个理想的单色点光源发射的光是完全相干光。但实际物理光源不是点源,总是具有一定的空间尺度并包含众多辐射单元,其发出的光也非严格的单色光,其光谱具有一定宽度,这种光即部分相干光。产生部分相干光主要有三种方法: …

Python中常用的内置函数集合

这篇文章主要介绍了Python中常用的内置函数,主要介绍内容有map()、filter()、all()、int()等更多相关函数,需要的小伙伴可以看看。 一、map() map(func,iterable),其中func为函数名,可为lambda匿名函数,iterable为可迭…

全栈Jmeter接口测试(二):jmeter组件元件介绍,利用取样器中http发送请求

JMeter 的主要测试组件总结如下: 1. 测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器 2. 线程组代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的 请求内容在Sampler中定义,它被线程组包含…

Camtasia Studio2023电脑屏幕录制软件免费版

TechSmith Camtasia Studio2023免费的屏幕录像视频编辑软件,最专业的电脑屏幕录制及编辑软件!这款专业录屏与视频创作大型软件包含屏幕录像、视频编辑、视频菜单制作、视频录音配音、视频发布等系列强大功能。 全新的Camtasia 2023 让您用更短的时间创…

【图像隐写】GBT+SVD数字水印嵌入与提取【含Matlab源码 1668期】

⛄一、SVD数字水印简介 理论知识参考文献:基于DWT和SVD的彩色图像数字水印算法研究 一种基于DWT-SVD的图像数字水印算法 ⛄二、部分源代码 clc close all clear %% Input images Iimread(‘Lena.jpg’); Iimresize(I,[512,512]); logorandsrc(8,8,[0,1]); figur…

青春不过,几次世界杯,足球让我明白,努力的方向

人生就像足球,你不会永远进球,但会一直跑在路上!直到遇到足球,我的人生彻底改变,我很记得我第一个足球的样子,在我心里,它就像一颗糖果 ——梅西⚽️ 随着2022卡塔尔世界杯的开赛,各…

GitHub上架即巅峰,《Spring Cloud微服务架构实战》标星已超30k

有人调侃我们说: 程序员不如送外卖。送外卖是搬运食物,自己是搬运代码,都不产出新的东西……透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险……想跳槽,但是更高的平台难进&a…

R 两组样本t检验 wilcoxon检验、卡方、fisher精确检验

一般统计方法R实现 文章目录一、读入数据二、连续性变量1.正态性和方差齐性检验2.描述统计量3.独立样本t检验和wilcoxon秩和检验三、四格表卡方或fisher精确检验(OR【95%CI】)1.计算各组频数和相对频率2.整理数据进行检验总结一、读入数据 library(read…

#Linux杂记# grep 查找命令常用选项大全(一)

今天,难得好天气,过去阴雨绵绵几天,确实干什么都没多少心劲。 对于Linux 指令,其实工作中用的也就那么多,但是真正用的很6的,确实给我们工作效率带来极大提高。 -i:在搜索的时候忽略大小写。 …