从普通的面条型代码,到函数型代码,其实是在做什么?

  1. 封装代码,一个函数差不多2-40行代码,实现一个小功能
  2. 让不同功能的代码独立开来

代码发展史:

面条版 --》函数版--》文件版--》文件夹版--》微服务(把大的项目拆分成多个小项目)

而文件版,在Python中叫做模块

  • 为什么要有模块?

  • 模块可以放很多个函数,然后把大量的函数分割成多个文件,每一个模块都具有很大的功能

模块

  • 模块就是拿来主义,简化操作,让我们不要进行重复开发相同的功能

模块的分类

  1. 自定义模块,自己写的
  2. 第三方库,需要自己去下载,如requests
  3. 内置模块,直接用就行了,如time
  4. 文件夹版,在Python中叫做包

一般使用import和from...import...导入模块

# spam.py
print('welcome to spam.py') def f1():
print('from f1')

import 与 from...import

# test.py
import time 1. 打开time文件
2. 使用Python解释器运行time文件,然后把解释文件内的名字放入模块time的名称空间,会运行文件中所有的代码
3. test.py中会有一个time变量指向time模块的名称空间,如果导入方式为`import time as t`,则是t变量指向time模块的名称空间
* 指向整个time文件,会把整个time文件都放入内存空间中,要用什么拿什么
优点:time里面有的方法全部拿出来
缺点:占用内存比较大,必须得通过time.出来
# test.py

from time import sleep

1. 打开time文件
2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间,**同样运行所有的代码**
3. test.py中会有sleep变量指向time模块名称空间中的sleep,如果导入方式为`from time import sleep, localtime`,则是有一个sleep变量和一个locatime变量指向time模块名称空间中的sleep和localtime,`from time import *`同理,是有time中所有名字的变量
* 变量名直接指向A中的方法名,并没有指向A,是去A中把f1拿出来
* 一个是拿他的东西,另一个是拿他的店
优点:直接使用sleep就可以了
缺点:只能拿到sleep,如果该文件定义了sleep参数,则会冲突
### 导入多个模块
import spam, time, os 推荐下面的方法
import spam
import time
import os

循环导入问题

  • 两个文件互相查找
# m1.py
from m2 import y
x = 1
print(y) # m2.py
from m1 import x
y = 2
print(x)

为什么会有循环导入问题

  1. 代码自上而下运行,m1需要m2的y,所以会去m2的名称空间中找y,但是在找y前,会运行m2的代码
  2. 而m2的代码第一句又是去找m1的x,所以就冲突报错了
  3. 也就是说m1和m2都只是运行了第一行,就出现了循环导入问题

解决方案一

# m1.py
x = 10
from m2 import y
print(y) # m2.py
y = 20
from m1 import x
print(x)
  • 但是这样做,很复杂,并且需要提前定义,得到的结果也并非是我们想要的,治标不治本

解决方案二

# m1.py
def f1():
from m2 import y
print(y)
x = 1 f1() # m2.py
def f2():
from m1 import x
print(x)
y = 2 f2()
  • 利用的是名字的执行(定义)顺序:内置(Python解释器启动的时候)--》全局(文件执行的时候)--》局部(函数调用的时候)

  • 利用局部名称永远在全局名称后定义的原理,在调用函数前,变量已经被定义好了

模块的搜索路径

1.去内存中找

# test.py
import m1 # 从m1.py文件中导入的,然后会生成m1模块的名称空间
import time # 删除m1.py文件,m1模块的名称空间仍然存在 time.sleep(10) import m1 # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的

2.去内置模块中找

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

3.去环境变量中找

import sys

print(sys.path)     # 打印当前父目录下环境变量中的包
# b/a/m1.py
# b/test.py import m1 # 报错 sys.path.append('b/a') # 把这个目录添加到环境变量中
import m1

Python文件的两种用途

  1. 模块文件,被当做模块给导入,有多个
  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() # test.py
import m1 m1.f1() # 运行一次

day21 模块的更多相关文章

  1. day21.模块和包

    博客整理来源:http://www.cnblogs.com/Eva-J/articles/7292109.html 模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件 ...

  2. day21 模块 异常处理

    常用模块:http://www.cnblogs.com/Eva-J/articles/7228075.html 今日概要: #time # —— 时间:时间戳 字符串 结构化时间 #collectio ...

  3. Python day21模块介绍4(logging模块,configparser模块)

    1.日志等级从上往下依次降低 logging.basicConfig(#日志报错打印的基础配置 level=logging.DEBUG, filename="logger.log" ...

  4. day21 模块与包+软件开发目录规范

    目录 一.导入模块的两种方式 二.模块搜索的路径的优先级 三.循环导入 四.区分py文件的两种用途 五.编写一个规范的模板 五.包 1 什么是包 2 为什么要有包 3 包的相关使用 3.1 在当前文件 ...

  5. python的内置模块xml模块方法 xml解析 详解以及使用

    一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...

  6. python之常用模块4

    pyinotify模块 pip3 install pyinotify pyinotify提供的事件: 事件标志 事件含义 IN_ACCESS 被监控项目或者被监控目录中的文件被访问,比如一个文件被读取 ...

  7. python的内置模块之os模块方法详解以及使用

    1.getcwd() 获取当前工作路径 import os print(os.getcwd()) C:\python35\python3.exe D:/pyproject/day21模块/os模块.p ...

  8. python的内置模块random随机模块方法详解以及使用案例(五位数随机验证码的实现)

    1.random(self): Get the next random number in the range [0.0, 1.0) 取0到1直接的随机浮点数 import random print( ...

  9. python的内置模块time和datetime的方法详解以及使用(python内的time和datetime时间格式)

    time内置模块的方法 1.time() 时间戳 time() -> floating point number  浮点数 Return the current time in seconds ...

随机推荐

  1. 5G开启百亿“机器人”时代 安全与标准仍待统一

    5G开启百亿“机器人”时代 安全与标准仍待统一 5G将会给物联网产业带来滚雪球效应,这将是数以百亿计“机器人”之间的网络. 在5G的助推下,物联网应用正在加速落地. 6月12日,CES Asia 20 ...

  2. Disconf入门指南(1)

    Disconf简介 参考: https://github.com/knightliao/disconf/wiki/TutorialSummary 在一个分布式环境中,同类型的服务往往会部署很多实例.这 ...

  3. 探索Python的多态是怎么实现的

    多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为. 对于其他如C++的语言,多态是通过在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来 ...

  4. STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)

    一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...

  5. Git学习总结(4)——我的Git忽略文件

    *.bak *.txt *.vm .gitignore #svn .svn/ # built application files *.apk *.ap_ # files for the dex VM ...

  6. redis 在 Linux 和 Windows 上的安装配置

    最近需要在服务器上安装 redis,虽然只是一个小事情,但这个过程中也遇到了不少的问题,所以做一个总结,也希望能给到其他人一些帮助. 本文记录了 linux 系统和 windows 系统的 redis ...

  7. SQL优化-标量子查询(数据仓库设计的隐患-标量子查询)

    项目数据库集群出现了大规模节点宕机问题.经查询,问题在于几张表被锁.主要问题在于近期得几个项目在数据库SQL编写时大量使用了标量子查询. 为确定为题确实是由于数据表访问量超过单节点限制,做了一些测试. ...

  8. MySQL 存储

    1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 ...

  9. 4种方法让SpringMVC接收多个对象

    问题背景: 我要在一个表单里同一时候一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该怎样处理? 第1种方法:表单提交,以字段数组接收: 第2 ...

  10. 【UML】UML世界的构成

    UML概述 全名:Unified Modeling Language 中文名:统一建模语言 发展历程:"始于1997年一个OMG标准.它是一个支持模型化和软件系统开发的图形化语言,为软件开发 ...