day_15 什么是模块 模块的四种形式 为什么要用模块 import和from...import import和from..import..的异同 循环导入问题 模块的搜索路径 Pthon文件的两种用途 pyinstaller库的下载

模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module

模块的四种形式

  1. 自定义模块
  2. 第三方库
  3. 内置模块

为什么要用模块

  1. 用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。
  2. 自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。

import和from...import

import

import导入 , 引用的时候要加前缀

import发生的三件事情:

  1. 生成一个名字为time的名称空间
  2. 运行time.py文件,然后把生成的变量丢入 time的名称空间内
  3. run文件指向 time这个名称空间, time.方法名()

模块的重复导入会直接饮用之前创造好的结果,不会重复执行模块的文件

from...import

from...import导入, 不需要使用前缀

from...import发生的三件事情:

  1. 生成一个名字为time的名称空间
  2. 运行time.py文件,然后把生成的变量丢入 time的名称空间内
  3. run文件指向 import后面的一个(多个)方法名, 所以直接 方法名()

优点:不用加前缀,代码更加精简

缺点:容易与当前执行文件中名称空间的名字冲突

import和from..import..的异同

相同:

  1. 两者都会执行模块对应的文件,两者都会产生模块的名称空间
  2. 两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关

不同:

  1. import需要加前缀;from..import...不需要

循环导入问题

m4.py
from m2 import y
x = 10

# m2.py
from m1 import x
y = 20
  1. 执行m1.py
  2. m1.py运行到from m2 import y,要运行m2.py
  3. m2.py运行到from m1 import x,要运行m1.py
  4. 进入死循环

解决方案

#m1.py
print('from m1.py')

def f1():
    from m2 import x
	print(x)
y='m1'


# m2.py
print('from m2.py')
def f1():
    from m1 import y
    
x='m2'

模块的搜索路径

内存 --> 内置 --> 自定制 --> 环境变量(sys.path)

Pthon文件的两种用途

  1. 脚本,一个文件就是整个程序,用来被执行
  2. 模块文件: 文件中存放着一堆功能,用来被导入使用
if __name__ == '__main__'

在执行文件中运行__name__ == '__main__', 在被当做模块导入的时候__name__ == 模块文件名

__name__是每个文件独有的,当该文件作为执行文件运行时,__name__等于'__main__';当该文件作为模块文件导入时,__name__等于文件名

pyinstaller库的下载

pyinstaller库 可以将.py文件转化 为.EXE执行文件

# pyinstaller –i rose.ico(图片文件,百度转一个) –F rose.py(python文件)
pyinstaller –i rose.ico –F rose.py