模块基础

什么是模块

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

  • 自定义模块:如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件
  • 第三方模块:已被编译为共享库或DLL的C或C++扩展,如requests
  • 内置模块:使用C编写并链接到python解释器的内置模块,如time
  • 包:把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)

为什么要用模块

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

如何用模块

使用import或者from...import...导入模块

import模块名

import time首次导入模块发生了3件事:

  1. 以模块为准创造一个time模块的名称空间
  2. 使用python解释器运行对应的文件,将执行过程中产生的名字都丢到time模块的名称空间
  3. 在当前执行文件中会有一个time变量指向time模块的名称空间

模块的重复导入会直接引用之前创造好的结果,不会重复执行模块的文件,即重复导入会发生:spam=spam=模块名称空间的内存地址

from模块名import具体的功能

from...import...首次导入模块发生了3件事:

  1. 以模块为准创造一个模块的名称空间
  2. 使用python解释器运行对应的文件,将执行过程中产生的名字都丢到模块的名称空间
  3. 在当前执行文件的名称空间中拿到一个名字,该名字直接指向模块中的某一个名字,意味着可以不用加任何前缀而直接使用(from time import sleep:在当前文件中会有一个sleep变量指向time模块名称空间中的sleep)
  • 优点:不用加前缀,代码更加精简
  • 缺点:容易与当前执行文件中名称空间中的名字冲突

导入文件内所有的功能:

# spam.py

__all__ = ['money', 'read1']  # 只允许导入'money'和'read1'
# run.py
from spam import * # 导入spam.py内的所有功能,但会受限制于__all__

import和from...import...的异同

相同点:

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

不同点

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

模块的重命名规范

重命名:import module as x

PEP8规范:模块应该分开导入;先导入内置模块,再导入第三方模块,最后导入自定义模块;模块要在程序开头导入

循环导入问题

什么循环导入

# m1.py
from m2 import y
x = 10 # m2.py
from m1 import x
y = 20

为什么会有循环导入问题:

  1. mi文件需要导入m2文件的y
  2. m2文件需要导入m1文件的x
  3. 代码自上而下运行,m1需要m2的y,然后会去m2的名称空间找到y,但是找到y前,需要运行m2的代码,m2的代码第一句是去找m1的x,然后又回去运行m1的代码,m1的第一行代码又去寻找m2的y
  4. 就是说m1只能运行第一行,m2也只能运行第一行,所以出现了循环导入问题

解决方法一

# m1.py
x = 10
from m2 import y # m2.py
y = 20
from m1 import x
  • 但是这样做,对于所有的变量都需要这样做,才能解决所有问题所以是治标不治本的

解决方法二

# m1.py
def f1():
from m2 import y
x = 10 f1() # m2.py
def f2():
from m1 import x
y = 20 f2()

名字的执行顺序是:内置(python解释器启动的时候)—>全局(文件执行的时候)——>局部(函数调用的时候)

模块的搜索路径

  1. 去内存中找
# test.py
import m1 # 从m1.py文件中导入的,然后会生成m1模块的名称空间
import time # 删除m1.py文件,m1模块的名称空间仍然存在 time.sleep(10) import m1 # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的
  1. 去内置模块中找
# time.py
print('from time') # test.py
import time # 无任何打印,所以他先去内置模块中找了
  1. 去环境变量中找
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() # 运行两次,结果为‘from f1’‘from f1’
  • __name__
# m1.py
def f1():
print('from f1') if __name__ == '__main__': # __name__在m1.py被当做模块导入时是模块名,作为执行文件时是'__main__'
f1() # test.py
import m1 m1.f1() # 运行两次,结果为‘from f1’

pyhon模块的更多相关文章

  1. pyhon 模块与库

    引用“http://www.iplaypython.com/module/” 引用“http://codingnow.cn/language/265.html” Python模块是什么? 玩蛇网:一个 ...

  2. pyhon 模块 IP/端口 扫描

    用到了python-nmap模块(注意是 python-nmap模块 不是nmap模块 且不要安装nmap模块!!!!) windows 中还需要下载一个 nmap 软件: 下载地址: https:/ ...

  3. pyhon模块之日志模块

    #Auther Bob#--*--coding:utf-8--*-- import logging #python一共有5个级别的日志,debug.info.warning.error.critica ...

  4. python logging 模块的应用

    对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟悉的应用为何不工作.有时候,你甚至不知道系统运行,是否跟原始设计一致. 在线运行的应用就是黑盒子,需要被跟踪监控.最简单也最重要的方式就是记录日志. ...

  5. 一篇文章教你如何用 Python 记录日志

    前言: 这篇文章是我copy别人的,但是个人认为讲的真的很细致,有原理有实例,不仅仅只教你如何使用日志更会叫你知道日志的原理,真的非常棒,虽然文章很长,也许你不会认认真真读完, 但是当你遇到问题时这篇 ...

  6. Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结

    一.正则表达式 正则表达式为我们提供了抓取数据的快捷方式.虽然该正则表达式更容易适应未来变化,但又存在难以构造.可读性差的问题.当在爬京东网的时候,正则表达式如下图所示: 此外 ,我们都知道,网页时常 ...

  7. Github开源人脸识别项目face_recognition

    Github开源人脸识别项目face_recognition 原文:https://www.jianshu.com/p/0b37452be63e 译者注: 本项目face_recognition是一个 ...

  8. Python网络爬虫四大选择器用法原理总结

    前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式.BeautifulSoup.Xpath.CSS选择器分别抓取京东网的商品信息.今天小编来给大家总结一下这四个选择器,让大家更加深刻 ...

  9. Pyhon安装media模块

    都是教科书惹的祸,它没有说清楚.media看着很标准,其实不是python自带的库.需要安装第三方软件后才能用. 在这里http://pythonhosted.org/PyGraphics/insta ...

随机推荐

  1. oracle事务处理及实例演示jdbc操作批量删除

    事务 作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成.当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个非常好的应用. 对于事务的基本性质在还有一篇中有所叙述:SQ ...

  2. python模块之 paramiko(转载)

    paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. 1 基于用户名和密码的 sshclient 方式登录 # 建立一个s ...

  3. Android系统之路(初识MTK) ------ OTA打包ROM安装系统img等到ZIP

    在做OTA升级包的时候,我编译了好多次都没过.老是IO异常.刚開始以为是我 make 的错误.后来多次检查 Error 发现是我的配置信息写错了,与驱动project师一起检查源代码, 改动配置信息后 ...

  4. kafka 生产者消费者 api接口

    生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Keyed ...

  5. js jquery验证上传文件的格式和大小

    // 验证附件格式和大小 function confirmData() { var flag = true; var message = ""; var errorSize = & ...

  6. ADB无法启动

    一般就是5037端口被占用,各种手机助手鼓捣的 1.CMD下查看端口是否被占用 netstat -ano|findstr "5037" 截图不上了,我的是820进程,360手机助手 ...

  7. CANopen——总线基本知识

    1. 总线标准 2. 获取索引和子索引 2fh,2bh,23h,40h等,是不是对应cs的不同值: 主站1280h的对象字典?1280h-sub2,得到client的COB-ID值: 根据收到的m-& ...

  8. LightTable的结构(二)

    这节主要研究下object的一个属性,behaviors 定义一个behavior需要提供name,trigger,reaction (behavior ::on-close-destroy :tri ...

  9. werkzeug 详解

    首先,先向大家介绍一下什么是 werkzeug,Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库.这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架, ...

  10. Patrik 音乐会的等待 单调栈的迷茫回忆

    STL 一定要学好 一定要学好,一定要学好!!! 题目链接:https://www.luogu.org/problemnew/show/P1823 我们需要单向查找:用单调栈: 思路:维护一个身高单调 ...