模块与包&常用模块

Posted xiaomogula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块与包&常用模块相关的知识,希望对你有一定的参考价值。

一、模块的使用

模块定义:一系列功能的集合体

  分为三大类:1.自定义模块

        2.内置模块(比如 time,os,sys)

        3.第三方模块

模块的表现形式

  1.使用python编写的py文件

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

  3.把一系列模块组织到一起的文件夹(ps:文件夹下有一个__init__.py文件,该文件夹称为包)

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

为什么要用模块:

  1.可以拿来内置、第三方的模块,然后直接使用,这种拿来就用的方式,会极大的提升开发效率

  2.将程序中共用的一些功能组织到一个文件中,然后程序各部分组件可以重用该文件中的功能。

    优点是 减少代码冗余,增强程序的组织结构性与可维护性

怎么用模块:

  一个py文件就是一个模块,如果文件名为modules.py,模块名则为modules

  ps:模块的使用必须搞清楚谁是执行文件,谁是被导入的模块

1、模块的使用之import

技术分享图片
#:coding:utf-8
#modules.py
print(from the modules.py)

money=1000

def read1():
    print(modules模块.read1,money)

def read2():
    print(modules模块.read2)
    read1()

def change():
    global money
    money=0
modules.py
技术分享图片
import modules 

money=111111111111
print(modules.money)
print(modules.read1)
print(modules.read2)
print(modules.change)
modules.money=2222
print(money)###结果为money=111111111111

modules.read1()#modules模块.read1 2222   #这个更改成功modules.money=2222

def read1():#此处定义read1
    print(run.py中的read1)

modules.read1()#执行结果仍为modules模块.read1 2222

money=20000000
modules.change()#此处执行了modules中change函数
print(money)###此处为上述money=20000000
print(modules.money)##结果为0


import modules as spam ##可以as 起个别名
print(spam.money)  #依旧执行成功  结果为0
run.py

 

执行文件:run.py      被导入模块是:modules.py

首次导入模块会发生三件事: 

  1、创建一个模块modules.py的名称空间
  2、执行模块对应的文件modules.py,将产生的名字丢到模块的名称空间中
  3、在当前执行文件的名称空间中拿到一个名字modules,该名字就是指向模块modules.py的名称空间的
  import modules# modules=modules.py名称空间的内存地址

ps

  在当前执行文件中引用模块中的名字语法为:modules.名字,必须加上modules.作为前缀
  modules.名字相当于指名道姓地跟某一个名称空间要名字,根本不会与当前执行文件的名字冲突

 

2、模块的使用之  from   import

技术分享图片
#modules.py
# print(‘from the modules.py‘)

__all__=[money,read1]

money=1000

def read1():
    print(spam模块.read1,money)

def read2():
    print(spam模块.read2)
    read1()

def change():
    global money
    money=0
spam.py
技术分享图片
from spam import money,read1,read2,change
#
def read1():
    print(run.py.read1)

read1()      #  run.py.read1
read2()      #  spam模块.read2  ------------>   spam模块.read1 1000


from spam import money as my
print(my)   #1000

# ===========================================
from spam import * # * 会检索被导入模块中的__all__指定的名字,如果没有该变量那默认导入所有
print(money)  #1000
print(read1)  # <function read1 at 0x0000000001EB1C80>
# print(read2) #会报错
# print(change) #会报错
run.py

 

执行文件:run.py      被导入模块: spam.py

首次导入模块会发生三件事
  1、创建一个模块spam.py的名称空间
  2、执行模块对应的文件spam.py,将产生的名字丢到模块的名称空间中
  3、在当前执行文件的名称空间中拿到一个名字money,该名字就是指向模块spam.py的名称空间的那个money
  from spam import money,read1,read2,change

两种导入方式的对比
相同点:函数的作用域关系在定义阶段就规定死了,与调用位置无关

from import
优点:可以不用加前缀而直接引用名字,更简洁
缺点:容易与当前执行文件中的名字冲突

import
优点:指名道姓跟某一个名称空间要名字,肯定不会与当前名称空间中的名字冲突
缺点:必须加上前缀

 

3、循环导入的问题

技术分享图片
# print(‘正在导入m1‘)
#
# x=‘m1.py‘
#
# from m2 import y
#

print(正在导入m1)

def f1():
    from m2 import y,f2
    print(y)
    f2()

x=m1.py
m1.py
技术分享图片
# print(‘正在导入m2‘)
#
# y=‘m2‘
#
# from m1.py import x


print(正在导入m2)

def f2():
    from m1 import x
    print(x)

y=m2.py
m2.py
###   run.py
# 1、创建m1.py的名称空间
# 2、执行m1.py的代码,将产生的名字丢到m1.py的名称空间中
# 3、在当前执行文件的名称空间中拿到一个名字m1
import m1

m1.f1()

 

4、模块的搜索路径

模块搜索路径优先级:

  内存  --------> 内置的模块 --------> sys.path(环境变量)

 

5、区分python文件的两种用途

一个python文件有两种用途:
  1、可以执行运行:__name__ == ‘__main__‘
  2、可以被当做模块导入:__name__ == ‘模块名‘

if __name__ == __main__:

 

以上是关于模块与包&常用模块的主要内容,如果未能解决你的问题,请参考以下文章

python之基础篇——模块与包

python 12 常用模块与包

Python学习-基础篇4 模块与包与常用模块

python3基础笔记模块与包

三阶段课程——Day05(模块系统:自定义模块内置模块第三方模块;npm与包:包管路工具常用命令package.json包的分类包加载机制全局包)

python-模块与包