python基础---模块与包

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

1、模块导入方法


常见的场景:

一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀,导入模块可以实现功能的重复利用


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

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

已被编译为共享库或DLLCC++扩展

包好一组模块的包

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

 

a. import语句

python 内置了很多模块,比如ossystime等,也可以是自定义模块、模块包、C扩展等,使用import无法区分导入的模块类型

import 模块名      

例如:导入spam.py

import spam(不含.py

导入多个模块:

import os,time,sys

 

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

 

每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

 

导入模块干了哪些事:
执行源文件
以一个源文件的全局名称空间
在当前位置拿到一个模块名,指向2创建的名称空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#测试一:money与spam.money不冲突
#test.py
import  spam
money = 10
print (spam.money)
 
输出:
from  the spam.py
1000
  
#测试二:read1与spam.read1不冲突
#test.py
import  spam
def  read1():
      print ( '========' )
spam.read1()
 
输出:
from  the spam.py
spam - >read1 - >money1000
 
#测试三:执行spam.change()操作的全局变量money仍然是spam中的
#test.py
import  spam
money = 1
spam.change()
print (money)
 
输出:
from  the spam.py
1

 

模块别名功能


练习:

有两钟sql模块mysqloracle,根据用户的输入,选择不同的sql功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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()

 

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

1
2
3
4
5
if  file_format  = =  'xml' :
     import  xmlreader asreader
elif  file_format  = =  'csv' :
     import  csvreader asreader
data = reader.read_date(filename)


 

b. from…import语句

from 模块名  import 模块名中的方法

例如:from spamimport money,read1,read2,change

 

如果模块中的方法太多,可以使用:

from spam import  *     (不推荐使用,容易与执行文件的命名空间冲突)

__all__=['money','x']      #from spam import * 有用,之后导入moneyx方法
_money=1000             #from spam import * 有用,不会导入这个方法

 

对比import spam,会将源文件的名称空间'spam'带到当前名称空间中,使用时必须是spam.名字的方式,而from 语句相当于import,也会创建新的名称空间,但是将spam中的名字直接导入到当前的名称空间中,在当前名称空间中,直接使用名字就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#spam.py
print ( 'from the spam.py' )
 
money = 0
def  read1():
     print ( 'spam->read1->money' ,money)
 
def  read2():
     print ( 'spam->read2 calling read' )
     read1()
 
def  change():
     global  money
     money = 0 
  
# 执行文件
from  spam  import  money,read1,read2,change
money = 0
print (money)
print (read1)
 
输出:
from  the spam.py                     #首先执行spam.py
0                       #仍然是当前执行文件的命名空间中的money
<function read1 at  0x00000000026DE950 >

优点:使用源文件内的名字时无需加前缀,使用方便

缺点:容易与当前文件的名称空间内的名字混淆

 

c. 模块搜索路径

模块只在第一次导入时才会执行,之后的导入都是直接引用内存已经存在的结果
import sys
print('spam' in sys.modules)            #存放的是已经加载到内的模块

注意:自定义的模块名一定不要与python自带的模块名重名

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

1
2
3
4
5
6
7
8
9
import  time
import  importlib
 
import  spam            #导入模块会把硬盘中的模块内容加载到内存中
time.sleep( 20 )
import  spam            #再次导入会直接从内存中查找,忽略硬盘中模块内容
print (spam.money)
importlib. reload (spam)          #会重新加载模块(只在测试环境使用)
print (spam.money)

 

import sys

print(sys.path)              #模块的搜索路径

sys.path从以下位置初始化

    1  执行文件所在的当前目录

    2  PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)

    3  依赖安装时默认指定的

加入模块路径:

1
2
3
4
import  sys
print (sys.path)
sys.path.insert( 0 ,r '要添加的模块路径' )        #插入模块路径
sys.path.append(r '要添加的模块路径' )          #追加模块路径


 

d. 区分python文件的两种用途

文件当做脚本(执行文件)运行时__name__等于__main__
文件当做模块被加载运行时__name__等于模块名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# m1.py
import  os,sys
x = 1
def  func1():
     print ( 'from m1' )
def  func2():
     print ( 'from m2' )
def  func3():
     print ( 'from m3' )
# print(__name__)
#文件当做脚本运行时__name__等于__main__
#文件当做模块被加载运行时__name__等于模块名
if  __name__  = =  '__main__' :
     #当做脚本使用时才执行
     func1()
     func2()
     func3() 
# run.py
  
import  m1             #导入m1模块
m1.func3()

 

e. 

python3中创建文件夹会自动创建__init__.py

python2中创建包需要手动创建__init__.py

无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

强调:

 1. python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

 2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块

    3.凡是在导入时带点的,点的左边都必须是一个包

本文转自lyndon博客51CTO博客,原文链接http://blog.51cto.com/lyndon/1953171如需转载请自行联系原作者


迟到的栋子

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
90
分享
相关文章
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
287 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
186 62
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
95 7
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
187 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
40 8
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
28 4
|
4月前
|
Python Internet 模块
Python Internet 模块。
147 74
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
161 63
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等