day21 模块
从普通的面条型代码,到函数型代码,其实是在做什么?
- 封装代码,一个函数差不多2-40行代码,实现一个小功能
- 让不同功能的代码独立开来
代码发展史:
面条版 --》函数版--》文件版--》文件夹版--》微服务(把大的项目拆分成多个小项目)
而文件版,在Python中叫做模块
为什么要有模块?
模块可以放很多个函数,然后把大量的函数分割成多个文件,每一个模块都具有很大的功能
模块
- 模块就是拿来主义,简化操作,让我们不要进行重复开发相同的功能
模块的分类
- 自定义模块,自己写的
- 第三方库,需要自己去下载,如requests
- 内置模块,直接用就行了,如time
- 文件夹版,在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)
为什么会有循环导入问题
- 代码自上而下运行,m1需要m2的y,所以会去m2的名称空间中找y,但是在找y前,会运行m2的代码
- 而m2的代码第一句又是去找m1的x,所以就冲突报错了
- 也就是说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文件的两种用途
- 模块文件,被当做模块给导入,有多个
- 运行文件,被当做执行文件执行,只能有一个
- 搜索路径以执行文件为基准
# 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 模块的更多相关文章
- day21.模块和包
博客整理来源:http://www.cnblogs.com/Eva-J/articles/7292109.html 模块 1.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件 ...
- day21 模块 异常处理
常用模块:http://www.cnblogs.com/Eva-J/articles/7228075.html 今日概要: #time # —— 时间:时间戳 字符串 结构化时间 #collectio ...
- Python day21模块介绍4(logging模块,configparser模块)
1.日志等级从上往下依次降低 logging.basicConfig(#日志报错打印的基础配置 level=logging.DEBUG, filename="logger.log" ...
- day21 模块与包+软件开发目录规范
目录 一.导入模块的两种方式 二.模块搜索的路径的优先级 三.循环导入 四.区分py文件的两种用途 五.编写一个规范的模板 五.包 1 什么是包 2 为什么要有包 3 包的相关使用 3.1 在当前文件 ...
- python的内置模块xml模块方法 xml解析 详解以及使用
一.XML介绍 xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml xml跟html都属于是标签语言 我们主要学 ...
- python之常用模块4
pyinotify模块 pip3 install pyinotify pyinotify提供的事件: 事件标志 事件含义 IN_ACCESS 被监控项目或者被监控目录中的文件被访问,比如一个文件被读取 ...
- python的内置模块之os模块方法详解以及使用
1.getcwd() 获取当前工作路径 import os print(os.getcwd()) C:\python35\python3.exe D:/pyproject/day21模块/os模块.p ...
- python的内置模块random随机模块方法详解以及使用案例(五位数随机验证码的实现)
1.random(self): Get the next random number in the range [0.0, 1.0) 取0到1直接的随机浮点数 import random print( ...
- python的内置模块time和datetime的方法详解以及使用(python内的time和datetime时间格式)
time内置模块的方法 1.time() 时间戳 time() -> floating point number 浮点数 Return the current time in seconds ...
随机推荐
- PHP迭代器的内部执行过程
下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理.先来看一个官方的例子: class myIterator implements Iterator { private ...
- linux部署.net core api并且实现上传图片
为了体验.net在linux上运行,所以使用HttpClient东借西抄做了一个简单的api上传功能. 第一步,简单的上传功能: public class UploadHelper { private ...
- Scalable Web Architecture and Distributed Systems
转自:http://aosabook.org/en/distsys.html Scalable Web Architecture and Distributed Systems Kate Matsud ...
- web内置对象
内置对象,宿主对象,自定义对象的区别? 内置对象: 系统所提供的对象:Object,Array,Math,Date等等. 宿主对象: JS所运行的环境提 ...
- MVC基于Struts2的CRUD,java+bean+struts
1,所需jar包,将jar包导入lib中 2,项目目录结构 3,struts.xml <?xml version="1.0" encoding="UTF-8&quo ...
- Python爬虫基础--爬取车模照片
import urllib from urllib import request, parse from lxml import etree class CarModel: def __init__( ...
- Python面向对象----多态和鸭子类型
1. C#中多态实现的条件是 继承, 重写以及父类指向子类. 但是在弱类型Python里面, 实现多态的条件就显得很简洁, 只需要在子类中实现父类相同名称的方法即可. 2. 鸭子类型的解释: 若一个类 ...
- MySQL 存储
1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 ...
- 完整的html+css+javascript实现跟随鼠标移动显示选中效果
1,显示效果: 2,html结构 <div class="process_list-lpu"> <div class="process_line&quo ...
- 关于excel导入、导出(POI)
当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中, ...