模块

模块

什么是模块

  模块:就是一系列功能的结合体   这么说呢,因为模块是将很多的工具放在一起,也就是说,将很多的函数放在一个大的箱子里面,组成的一个工具箱。

模块的三种来源

  1 内置的      python解释器自带的       已经包装好的     

    ps:虽然是内置的模块,但是也不能不导入直接使用 ,换个方法吧       比如在吃饭的时候,你不自己使用筷子,筷子能把饭自己夹起来给你啊

  2 第三方的   就是其他人写的  但是大家觉得还不错    使用率较高的

       3 自定义的    自己写的    自己在自己的功能里需要用到的  自己进行包装

模块的四种表现形式

  1 使用python写的py文件,就是一个模块,一个py文件就可以称为一个模块

  2 已经被编译为共享库或者DLL的C或C++扩展(我也不知道啥意思,知道怎么用就行)

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

     包:一系列py文件的结合体

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

为什么要使用模块

  1 体现出调包的特点:python的特点还记得是什么吗?胶水语言和调包侠,使用模块  说白了就是用已经写好具有一定功能的函数被,那内置的可以用,其他人写好的不是也能用吗,这就提现出python的掉包的好处了,不管什么,先去搂个模版,拿来改吧改吧,(不管你之前写的多NB, 不过,现在是我的了)典型的拿来主义,废话,没个近路那还行,不过学习之路还是不能走捷径的,这样可以极大提高开发效率

  2 使用自定义模块,程序很大的时候,使用面向过程编程,固然可以,但是为什么要自己为难自己呢,所以,对自己的程序进行一个好的规划,再写之前就将功能分开,同样的功能放在同一个py文件下,自己也好找,改起来也方便。使用的时候还能直接调用。nice。否则每一个功能使用前都要登录的话,难道100个功能就写100次登陆吗。反正我不干。

使用模块

  最重要的一点就是将执行文件和被导入文件区分开,自己都不知道自己的程序这么启动(在小姐姐面前多尴尬)。接下来就说说这么导入模块

import导入模块

使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字

首先,我们先来创建几个文件试试怎么搞,

import md1    #  这就是导入模块方式

money = 9999

def read1():
    print('from run read1')
# 访问模块中的名字指向的值
# print(md.money)  # 使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字




# md.read1()
# md.read2()
# print(md.change)

md1.change()
print(money)
print(md1.money)
run.py(文件1)
print('from the md1.py')   # 就是看看程序运行之后是不是成功导入了
money = 1000
def read1():
  print('md',money)
def read2():
  print('md模块')
  read1()
def change():
  global money
  money = 0
md.py(文件2)

文件创建好并且写好之后,在run.py运行之后发现居然运行的是md.py文件里面的代码,这说明你已经成功的将模块导入并且能成功的使用了。

  右键运行run.py文件首先会创建一个run.py的名称空间
    首次导入模块(md1.py)(******)
      1.执行md.py文件
      2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
      3.在执行文件中产生一个指向名称空间的名字(md)

这不是骚操作   还有点low

import
os import os import os import os import os 有个传说是一行代码100块 但是这样子 你觉得行吗 行(因为不会报错啊) 但是 多次导入不会再执行模块文件,会沿用第一次导入的成果(******)

还有注意,在程序运行的时候之前学的东西依旧是按照他自己的执行顺序

  1.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码)

  2.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变

使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字

  1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
  2.你如果想访问模块中名字 必须用模块名.名字的方式

第一种  规范形式
import os
import time
import md


第二种    也可以这么写  但是不推荐
import os time md

前提是导入的时候写在文件的开头

特殊情况或者只是在特定的情况下使用也可以在使用之前导入,节省内存
模块导入

from...import...导入模块

会先创建run1.py的名称空间
  首次导入md1.py模块
    1.运行md1.py
    2.将产生的名字存放到md1.py名称空间中
    3.直接拿到指向模块md1.py名称空间中某个值的名字


利用from...import...句式
  缺点:
    1.访问模块中的名字不需要加模块名前缀
    2.在访问模块中的名字可能会与当前执行文件中的名字冲突

写法

  from 模块名 import 名字

  ps  这里的名字可以使用   *    代替   这样子就可以直接将模块中的所有名字全部加载过来,但是不推荐这么写,在使用一个陌生的模块时候,你会直接知道里面的内容吗,当然不会。所以这个技巧记住,但是尽量别使用 


循环导入问题及解决思路

from dir1.dir import m1

m1.f1()
run.py
print('正在导入m1')
from m2 import y  # 首次导入m2

x = 'm1'
m1.py
print('正在导入m2')
from m1 import x  # 第二次导m1

y = 'm2'
m2.py

创建好之后运行run文件。发现了一个问题。是不是形成一个死循环了,因为在运行的时候,使用from导如之后 根本没有进行下面的代码,之后在m2文件同样,导入之后代码是没有走到的,所以就成了一个循环导入,怎么解决呢

  方式1   将导入模块的哪一行代码放在最后,两个文件都放在最后

##### m1.py 文件

print('正在导入m1')
x = 'm1'
from m2 import y  # 首次导入m2


##### m2.py  文件


print('正在导入m2')

y = 'm2'
from m1 import x  # 第二次导m1

##### run.py文件


from dir1.dir import m1

m1.f1()
这样就能解除刚才的循环导入

  方式2 以函数的形式解决

######### m1.py

print('正在导入m1')
def f1():
  from dir1.dir.m2 import y,f2
  print('m1.f1>>>y:',y)
  f2()
x = 'm1'


########## m2.py

print('正在导入m2')
def f2():
  from dir1.dir.m1 import x
  print('m2.f2>>>x:',x)
y = 'm2'

########### run.py文件


from dir1.dir import m1

m1.f1()

__name__的用法

print(__name__)  #  __main__

打印结果是__main__

# print(__name__)
# 当文件被当做执行文件执行的时候__name__打印的结果是__main__
# 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)

快捷方法
main 按Tab键盘
if __name__ == '__main__':
 

模块的查找顺序

模块的查找顺序

  1:先从内存中找

  2:内存中没有去内存里面找

  3:最后在环境变量里找     

    sys.path(环境变量)      

相对导入和绝对导入

相对导入:(相对路径)相对于目前所在的文件的目录路径,然后在哪里,与当前所在文件进行对比的

绝对导入:(绝对路径)就是在计算机中,当前文件的绝对目录   D:Python项目day14dir1   这样的,从盘开始一个一个文件都有的,最后到这个文件

ps:

  . :一个点是当前目录

  ..:两个是上一级目录

  ...:三个是上上一级目录

  以此类推,文件层数多的根据自己的层数点    (.)    

软件开发目录规范

 这个就厉害了,感觉写了这么几天的代码,虽然还是low的不行,但是有了这个  软件开发目录规范  之后,自己的代码看起来又那么一点点高大上了!!!

 这里用ATM作为案例来写一下,首先新建一个新的项目      

                                                  开始文件就这么写,别问我为什么

原文地址:https://www.cnblogs.com/xuzhaolong/p/11197066.html