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

  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. 【转】【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    原文地址:http://www.cnblogs.com/baiboy/p/orc3.html 阅读目录 目录 RAC 工作原理和相关组件 ClusterWare 架构 RAC 软件结构 集群注册(OC ...

  2. WEBGL学习【十】运动模型

    <!DOCTYPE HTML> <html lang="en"> <head> <title>LWEBGL6.2, Animated ...

  3. select的option触发事件

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. LCIS 最长公共上升子序列问题DP算法及优化

    一. 知识简介 学习 LCIS 的预备知识: 动态规划基本思想, LCS, LIS 经典问题:给出有 n 个元素的数组 a[] , m 个元素的数组 b[] ,求出它们的最长上升公共子序列的长度. 例 ...

  5. 51nod1072 - 威佐夫游戏【威佐夫博弈】

    有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...

  6. idea 解决git冲突

    1.提交本地代码到本地仓库 2.啦取远程代码 不进行merge 3.冲突文件会显示   >>> head  ===== 4.删除  >>> head  ===== ...

  7. Nginx 安装配置证书,设置HTTPS站点

    详细配置如下: server { listen 80; server_name shwww.net www.shwww.net; return 301 https://www.shwww.net$re ...

  8. @PostConstruct 和 @PreDestroy 指定初始化和销毁方法

    通过实现 @PostConstruct 和 @PreDestroy 注解,也可以指定 bean 的初始化和销毁方法 一.Student 类 public class Student{ public S ...

  9. rabbitMQ学习笔记(五) 消息路由

    生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉. 这时候就可以对消息进行过滤了. 在消费者端设置好需要接收的消息类型. 如果不使用默认的E ...

  10. Python Study (05)装饰器

    装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一 ...