0
点赞
收藏
分享

微信扫一扫

Python的模块

 1、什么是模块?

模块就是一系列功能的集合体
(1)内置的模块c和c++编写(python解释器已经做好了),只需要研究如何用。
(2)第三方模块 (其他人帮忙写的)
(3)自定义的模块(自己开发的),
python写的
c、c++编写
一个python文件(文件名m.py)本身就是一个模块。模块名叫m
了解:
模块有四种形式:
(1)使用python编写的.py文件
(2)已被编译为共享库或DLL的C或C++扩展(了解)
(3)把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
(4)使用C编程并链接到python解释器的内置模块。
2、为何有模块?
(1)内置与第三方的模块拿来就用,无需自己定义,这种拿来主义,可以极大的提高开发效率。
(2)自定义模块
可以将程序的各部分功能提取出来放到一个模块中,可以为大家共享。
优点:减少了代码的冗余,程序组织结构更加清晰。
3、如何用模块?
导入功能
# 首次导入模块会发生的事?
# 1、执行foo.py文件
# 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中。
# 3、在当前文件中产生一个名字foo,该名字指向步骤2中产生的名称空间。

# 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码。
# import foo

先定义一个foo.py文件

print("模块foo==>")

x = 1
# 函数在定义阶段已经定义好了x
def get():
print(x)

def change():
global x
x = 0
y = 333
z = 444
import foo
# 首次导入模块会发生的事?
# 1、执行foo.py
# 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中。
# 3、在当前文件中产生一个名字foo,该名字指向步骤2中产生的名称空间。

# 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码。
# import foo
# 引用
# 强调1:指名道姓的问某个模块要名字对应的值,名称空间的作用不会与当前名称空间中的名字发生冲突。
# import foo
# print(foo.x)
# print(foo.get)
# print(foo.change)
"""运行结果如下:
模块foo==>
1
<function get at 0x000001FB30359670>
<function change at 0x000001FB30359700>
"""
# x=1111
# print(x) # 1111

# 强调2:无论是查看还是修改操作的都是模块本身,与调用位置无关。
import foo
x = 3333
foo.get() # 当初在foo文件中就定义了get()函数 运行结果是: 1

foo.change()
print(x)
# 可以以逗号为分隔符在一行导入导入多个模块
# import foo,foo1,foo2 # 不建议这么做,代码不清晰

# 4、建议如下方式导入
# import foo
# import foo1
# import foo2


# 5、导入模块的书写规范:按顺序导入
# import 内置模块
# import 第三方模块
# import 自定义模块

# 6、import 。。。as 。。。起一个别名,针对导入的名称过长使用别名
import foo as f # f = foo
f.get()
# 7、模块是第一类对象,指的是模块可以当返回值,当作变量,当作参数,当作容器类型的元素,可以被赋值,

# 8、自定义模块应该采用纯小写+下划线的风格。
# python2中有驼峰式风格,python3全改成了小写风格。

# 9、可以在函数内导入模块
def func():
import foo

 10、from...import....

# import 导入模块在使用必须加前缀'模块.'的优缺点
# 优点:肯定不会与当前名称空间中的名字冲突
# 缺点:加入前缀显得麻烦。

# 可以不加'模块.'前缀吗?使用from
from foo import x # x=模块foo中值0的内存地址
from foo import get
from foo import change

# print(x) # 1
# print(get) # <function get at 0x000002B282459670>
# print(change) # <function change at 0x000002B282459700>

# from...import...导入也发生了三件事
# 1、产生一个模块的名称空间。
# 2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去。
# 3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址

x = 33333333
# print(x)

Python的模块_内存地址

from foo import x  # x=模块foo中值0的内存地址
from foo import get
from foo import change

# x = 33333333
# print(x)

get() # 1

change() # 运行change后查看x是否变化
print(x) # 1
get() # 0
print(x) # 1

 Python的模块_内存地址_02

# from...import...导入模块在使用时也不用加前缀
# 优点:代码更精简
# 缺点:容易与当前名称空间混淆

from foo import x # x=模块foo中值1的内存地址
x = 1111 # 当前名称空间的内存地址
11、
# from...import....:一行导入多个名字(不推荐使用)
# from foo import x,get,change

# *:导入模块中所有名字(大多情况下不使用,容易与当前名称空间里的名字混淆)
# name = 'lsj'
# from foo import name

 

12、了解:__all__
__all__ = ['x','get','change'] # 控制*代表的名字有哪些
# 13、起别名使用as
from foo import get as g
# 14、循环导入问题
# 模块互相导入--垃圾设计
# 准备数据:m1.py和m2.py文件。
# 假设:从m1模块中导入m2,从m2模块中导入m1

import test021_07_m1

# 循环导入不会产生重复创建名称空间
# ImportError: cannot import name 'x' from partially initialized module 'test021_07_m1' (most likely due to a circular import) (D:\pycharm\oldboy_29\day021\test021\test021_07_m1.py)

# 方案一:解决循环导入这种垃圾设计,把变量放到导入的上面。

# 方案二:提出两个模块中的共有部分给第三个模块,这两个模块都跟第三方要。

# 方案三:利用函数在定义阶段不会运行代码的特点# 使用方案二:
# m1的模块print("正在导入m1")

# # x = "这是m1里的x" # 方案一:解决循环导入这种垃圾设计,把变量放到导入的上面
# from test021_07_m2 import y

x = "这是m1里的x"

# m2的模块print("正在导入m1")

# # y = "这是m2里的y" # 方案一:解决循环导入这种垃圾设计,把变量放到导入的上面
# from test021_07_m1 import x
y = "这是m2里的y"

 

# 使用方案三:某个函数需要调用某些功能,导入的时候放到局部内。
# m1的模块
print("正在导入m1")
# 方案三:利用函数在定义阶段不会运行代码的特点
def f1():
from test021_07_m2 import y
print(x)
x = "这是m1里的x"

# m2的模块
print("正在导入m1")
# 方案三:利用函数在定义阶段不会运行代码的特点
def f1():
from test021_07_m1 import x
print(y)
y = "这是m2里的y"

 

# 15、模块查找的优先级:import和from...import...在导入模块时都涉及到查找问题。
# 优先级:
# 1、内存中存在过的,先从内存中查找,(内置模块)
# 2、从硬盘找:按照sys.path中存放的文件的顺序依次查找要导入的模块。(执行文件和导入文件)
# 3、

import foo

from foo import x

import sys
print(sys.path) # 值为一个列表,存放了一系列文件夹,其中第一个文件夹时当前执行文件所在的文件夹

# python中的.zip是文件夹

 

# 16、了解:sys.modules查看已经加载到内存中的模块
# import sys
# print(sys.modules) # 打印查看的modules模块
# print('foo' in sys.modules) # 判断模块是否存在--》False
# print('builtins' in sys.modules) # 判断模块是否存在--》True
#
# # 导入foo模块再次查看
# import foo # foo=模块的内存地址
# print('foo' in sys.modules) # 判断模块是否存在--》True
# print(sys.modules) # ...'D:\\pycharm\\oldboy_29\\day021\\test021\\foo.py'>
#
# del foo # 解除链接
# print(sys.modules) # 但是还有:'D:\\pycharm\\oldboy_29\\day021\\test021\\foo.py'>,这是python的优化机制

 

 

# 当我找一个模块时候
import sys
# 都找不到的时候,添加个文件路径,到环境变量中
sys.path.append(r'D:\pycharm\oldboy_29\day021\test021\a_path\foo.py')

import foo

 

 

 

 

 

 

 

 

 

 

 

 

 


举报

相关推荐

0 条评论