模块基础

什么是模块

模块式一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个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. Swift 1.1语言第7章 函数和闭包

    Swift 1.1语言第7章  函数和闭包 在编程中,随着处理问题的越来越复杂.代码量飞速添加. 当中,大量的代码往往相互反复或者近似反复.假设不採有效方式加以解决.代码将非常难维护. 为了解决问题, ...

  2. jar包和动态链接库

    1 jar包更接近于动态链接库 java在编译的时候,尽管import了其它的jar包,但是它并没有将其它jar包中的源码拷贝到自己的class文件中,它只是使用了jar包中的名字. 而在执行的时候, ...

  3. SpringMVC_RESTRUL_CRUD

    编写POJO Departmet: package org.springmvc.curd.entity; public class Department { private int id; priva ...

  4. spring boot-启动及配置文件

    spring boot启动: 1:默认启动方法 public static void main(String[] args) { SpringApplication.run(UserServiceAp ...

  5. oracle游标的定义使用

    oracle游标的定义使用 2008-02-23 15:12:57|  分类: oracle|字号 订阅 游标中定义的参数只要定义类型,不用定义长度,精度等: 游标使用一: declarecursor ...

  6. bzoj4619

    4619: [Wf2016]Swap Space Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 129  Solved: 54[Submit][Sta ...

  7. sqlserver新加一自增长的列,并且更新为行号

    --查询行号 select row_number()over(order by CHECKTIME )as RowNum,*from CHECKINOUT --更新id列为行号 update CHEC ...

  8. HTML5移动Web开发

    1. 响应式web设计 说到这个,移动开发面对的屏幕尺寸那叫一个丰富,其中安卓阵营就够让人头痛的.我们在PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能正常显示的固定宽度居中 ...

  9. bzoj 1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店【高精度+完全背包】

    居然要用高精度! 懒得operator了,转移是裸的完全背包 #include<iostream> #include<cstdio> using namespace std; ...

  10. swoole多进程处理产生的问题

    以前用swoole的时候,没有涉及到数据库连接,碰到问题没有那么多,后来公司业务原生来写swoole多进程,问题出现很多 1.多进程之间会产生进程隔离,global无效,不能共用一个mysql,red ...