模块

1、什么是模块?

模块就是一系列功能的集合体,分为三大类
    I:内置的模块
    II:第三方的模块
    III:自定义的模块
        一个python文件本身就一个模块,文件名m.py,模块名叫m

    ps:模块有四种形式
      1 使用python编写的.py文件

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

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

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

2、为何有用模块

I:内置与第三的模块拿来就用,无需定义,这种拿来主义,可以极大地提升自己的开发效率
II:自定义的模块
    可以将程序的各部分功能提取出来放到一模块中为大家共享使用
    好处是减少了代码冗余,程序组织结构更加清晰

3、如何用模块

3.1、首次导入模块会发生3件事

1、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
2、执行foo.py
3、在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间

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

3.2、引用:

print(foo.x)
print(foo.get)
print(foo.change)
强调1:模块名.名字,是指名道姓地问某一个模块要名字对应的值,不会与当前名称
空间中的名字发生冲突
x=1111111111111
print(x)
print(foo.x)

强调2:无论是查看还是修改操作的都是模块本身,与调用位置无关
import foo

x=3333333333
# foo.get()

foo.change()
print(x)

print(foo.x)
foo.get()

3.3、可以以逗号为分隔符在一行导入多个模块


建议如下所示导入多个模块
import time
import foo
import m

不建议在一行同时导入多个模块
import time,foo,m

3.4、导入模块的规范

I. python内置模块
II. 第三方模块
III. 程序员自定义模块

import time
import sys

import 第三方1
import 第三方2

import 自定义模块1
import 自定义模块2
import 自定义模块3

3.5、import 。。。 as 。。。

import foo as f # f=foo 引入的模块的名字可以用as后面的名字代替
f.get()


import abcdefgadfadfas
#
# abcdefgadfadfas.f1
# abcdefgadfadfas.f2
# abcdefgadfadfas.f3


import abcdefgadfadfas as mmm

mmm.f1
mmm.f2
mmm.f3

3.6、模块是第一类对象

import foo

3.7、自定义模块的命名

应该采用纯小写+下划线的风格

3.8、可以在函数内导入模块

def func():
    import foo

4、from…import…模块导入

4.1、import模块导入与from…import…模块导入对比

import导入模块

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

from…import…模块导入

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

4.2、from … import …导入也发生了三件事

1、产一个模块的名称空间
2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去
3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址

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

from foo import x # x=新地址
print(x)

from foo import x # x=模块foo中值1的内存地址
x=1111

5、模块的搜索路径优先级

无论是import还是from…import在导入模块时都涉及到查找问题
优先级:
1、内存(内置模块)
2、硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块

import sys
sys的值为一个列表,存放了一系列的对文件夹
其中第一个文件夹是当前执行文件所在的文件夹
print(sys.path)# 查看sys中的路径
import foo # 内存中已经有foo了
foo.say()
import time
time.sleep(10)
import foo
foo.say()
了解:sys.modules查看已经加载到内存中的模块
import sys
import foo # foo=模块的内存地址
del foo

def func():
    import foo # foo=模块的内存地址

func()

# print('foo' in sys.modules)
print(sys.modules)


import sys
找foo.py就把foo.py的文件夹添加到环境变量中
sys.path.append(r'foo的地址')
import foo
foo.say()

from foo import say

6、包的使用

包就是一个包含有__init__.py文件的文件夹
包的本质是模块的模块的一种形式,包是用来被当做模块导入

包的调用过程:

1、产生一个名称空间
2、运行包下的__init__.py文件,将运行过程中产生的名字都丢到1的名称空间中
3、在当前执行文件的名称空间中拿到一个名字mmm,mmm指向1的名称空间

环境变量是以执行文件为标准的,所有的被导入的模块或者说后续的其他文件引用
的sys.path都是参照执行文件的sys.path

import sys
sys.path.append('/aaaaaaaaaaaaaaaaaaaaaaaaaa')#添加环境变量
print(sys.path)
#添加包foo路径到环境变量
sys.path.append(r'/Users/linhaifeng/PycharmProjects/s14/day21/aa')
import foo # 调foo下__init__.py
foo.f1()
foo.f2()
foo.f3()
from foo import f1,f2,f3,f4
f1()
f2()
f3()
f4()

import foo
foo.f4()

强调:
1.关于包相关的导入语句也分为import和from … import …两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
凡是在导入时带点的,点的左边都必须是一个包,否则非法。
可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

例如:
from a.b.c.d.e.f import xxx
import a.b.c.d.e.f
其中a、b、c、d、e 都必须是包

2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值