模块基础

什么是模块

模块式一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个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. 免安装版TOMCAT配置及问题解决方法

    前言 本文将介绍下面几点内容: 1.Tomcat的配置过程 2.启动startup过程中遇到的问题的解决 3.假设遇到本文中没有提到的问题怎样解决 配置 计算机右击->属性->高级系统设置 ...

  2. APICloud平台的融云2.0集成

    融云2.0的官方文档地址:http://docs.apicloud.com/端API/开放SDK/rongCloud2 项目须要IM模块,最后还是选择了融云.在iOS原生开发中,融云sdk集成了聊天界 ...

  3. Java中的字节输入出流和字符输入输出流

    Java中的字节输入出流和字符输入输出流 以下哪个流类属于面向字符的输入流( ) A BufferedWriter B FileInputStream C ObjectInputStream D In ...

  4. CCBPM工作流引擎的消息机制与设计

    keyword:ccflowjflow 消息机制流程引擎 自己主动发送短信 发送邮件 发送消息 流程引擎微信连接 消息接口 关于ccbpm: 我们把ccflow jflow两个版本号的工作流引擎统称为 ...

  5. cocos2dx游戏开发学习笔记2-从helloworld開始

    一.新建project 具体安装和新建project的方法在cocos2dx文件夹下的README.md文件里已经有具体说明,这里仅仅做简介. 1.上官网下载cocos2dx-3.0的源代码.http ...

  6. HDU 5371(2015多校7)-Hotaru's problem(Manacher算法求回文串)

    题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...

  7. (转)web会话管理方式

    阅读目录 1. 基于server端session的管理 2. cookie-based的管理方式 3. token-based的管理方式 4. 安全问题 5. 总结 http是无状态的,一次请求结束, ...

  8. MPMoviePlayerController属性方法简介

    属性 说明 @property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 @property (nonatom ...

  9. iOS如何查看静态库.a文件支持的cpu类型

    打开终端: 输入 lipo -info 然后将你要查看的静态库.a 文件找到,拖入 -info 后边.假设路径为A,即为 lipo -info A 回车键,然后就会看到静态库是否支持 armv7,ar ...

  10. luogu 1083 借教室

    题目大意: 有一些教室 我们需要处理接下来n天的借教室信息 其中第i天学校有ri个教室可供租借 共有m份订单 每份订单用三个正整数描述 分别为dj sj tj 表示从第sj天到第tj天租借教室 每天需 ...