模块基础小结

模块基础小结

一、为什么要有模块

面条版代码–》函数版代码–》文件版代码(模块)–》文件夹版(包)

代码会变得更加简洁,清晰,模块化

一个模块里会有多个函数,相当于一个大功能细分成多个小功能

  1. 自定义模块
  2. 第三方模块,如requests
  3. 内置模块,如time
  4. 包(文件夹)

二、import 与 from…import…

markdown_add_index.py

import time

1. 打开time文件
2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间
3. test.py中会有一个time变量指向time模块的名称空间,如果导入方式为` import time as t`, 则就是t变量指向time模块的名称空间

from time import sleep

1. 打开time文件
2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间
3. test.py中会有一个sleep变量指向time模块名称空间中的sleep, 如果导入方式为`from time import sleep, localtime`, 则是由一个sleep变量和一个localtime变量指向time模块名称空间中的sleep和localtime

三、循环导入问题

# m1.py
from m2 import y
x = 10

# m2.py
from m1 import x
y = 20

为什么会有循环导入问题:

  1. m1文件需要导入m2文件的y
  2. m2文件需要导入m1文件的x
  3. 代码自上而下运行, m1需要m2的y, 然后会去m2的名称空间找到y, 但是找y前, 需要运行m2的代码, m2的代码第一句是去找m1的x, 然后又回去运行m1的代码, m1的第一行代码又是去寻找m2的y
  4. 就是说m1只能运行第一行, m2也只能运行第一行, 所以出现了循环导入问题

3.1 解决方案一

# m1.py
x = 10
from m2 import y


# m2.py
y = 20
from m1 import x
  • 但是这样做, 对所有的变量都需要这样做, 才能解决问题, 所以治标不治本的

3.2 解决方案二

# m1.py


def f1():
    from m2 import y


x = 10

f1()


# m2.py
def f2():
    from m1 import x


y = 20

f2()

名字的执行顺序: 内置(python解释器启动的时候) -->全局(文件执行的时候) -->局部(函数调用的时候)

四、模块的搜索路径

去内存中找

# test.py
import m1  # 从m1.py文件中导入的,然后会生成m1模块的名称空间
import time

# 删除m1.py文件,m1模块的名称空间仍然存在

time.sleep(10)

import m1  # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的

去内置模块中找

# time.py
print('from time')

# test.py
import time  # 无任何打印,所以他先去内置模块中找了

环境变量中找

import sys

print(sys.path)
# b/a/m1.py

# b/test.py
import m1  # 报错

sys.path.append('b/a')
import m1

五、Python文件的两种用途

模块文件, 被当做模块给导入, 有多个
2.
运行文件, 被当做执行文件执行, 只能有一个

  • 搜索路径以执行文件为基准


# m1.py
def f1():
    print('from f1')


f1()

# test.py
import m1

m1.f1()  # 运行两次
  • _ * name * _


# m1.py
def f1():
    print('from f1')


if __name__ == '__main__':  # __name__在m1.py被当做模块导入时是模块名,作为执行文件时是'__main__'
    f1()

markdown_add_index.py
import m1

m1.f1()  # 运行两次

六、包

  • 模块太大了,合理的分配模块的函数
# m1.py
f1
f2
f3
f4

# m2.py
f1
f2

# m3.py
f3
f4
  • 所以得用文件夹管理,文件夹命名为m1,导入m1就是导入m1中的__init__
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值