1 模块与包

1.1 模块的定义

什么是模块

模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

为什么使用模块

在退出python解释器然后重新进入,之前定义的函数或者变量都将丢失,因此我们通常将程序写在文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时的test.py被称为脚本。

我们通常将程分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。

1.2 如何使用模块

1.2.1 import

模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,他们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

#spam.py
import spam#只在第一次导入时才执行spam.py内代码,此处的显示效果是只打印一次
当然其他的顶级代码也都被执行了,只不过没有显示效果
import spam
import spam
import spam
>>
from the spam.py

可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

每个模块都是一个独立的名称空间,定义在这个模块中的函数,吧这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

money=1222#全局定义变量money
from spam import money,read1#调用spam模块
print(money)
>>
from the spam.py
1000#打印spam模块中变量money

在名称空间中绑定money

#test.py
import spam
def resd1():
print("---->")
spam.read1()#调用spam的属性
>>
from the spam.py
spam->read1->money 1000

导入模块可以同时导入多个,用逗号隔开

import sys,os,re

在名称空间中赋值read1,read1函数则不能够被调用

 

总结:首次导入模块时会做三件事

(1)     为源文件创建新的名称空间,用来存放源文件中定义的名字

(2)     基于创建的名称空间执行模块

(3)     创建名字(如spam)来引用该名称空间,文件名.名字的操作,都是以创建名字的文件为准

模块别名使用

import spam as sm#把spam模块重新起名sm
print(sm.money)#相当于print(spam.money)
>>
from the spam.py
1000

为已经导入的模块起别名的方式对编写可扩展的代码很有用,假设两个模块都定义了同一个函数,但是采用不同的输入格式。可以编写代码来选择性的挑选读取模块

 if file_format == 'xml':
import xmlreader as reader
elif file_format == 'csv':
import csvreader as reader
data=reader.read_date(filename)

 

1.2.2 from import

对比import spam,会将源文件的名称空间带到当前名称空间中,使用时必须是spam.名字的方式

而from语句相当于import,也会创建新的名称空间,直接使用名字就可以

from spam import money,read1
read1()
>>
from the spam.py
spam->read1->money 1000

如果当前有重命名read1,那么就会有覆盖效果

from spam import money,read1
def read1():
print("--->")
read1()
>>
from the spam.py
--->

from语句中也可以使用别名

from spam import read1 as read

也可以导入多行

 from spam import (read1,
read2,
money)

from spam import *

把spam中所有的不是以下划线开头的名字都导入到当前位置。

缺点:不知道*导入的什么名字,很可能会覆盖掉之前定义的名字

可读性极其的

可以用__all__来控制*

执行read1时没有问题

执行read2时报错

Python不支持重新加载或卸载之前导入的模块

1.3 把模块当做脚本执行

调用模块  则不会被使用

1.4模块的搜索路径

查找模块的顺序是:内存中已经加载的模块-à内置模块-àsys.path路径中包含的模块

注意:自定义的模块名不应该与系统内置模块重名

 

1.5编译python文件

只有导入模块  import

from  import

才会产生pyc文件  模块被加载时增加速度

python之模块4的更多相关文章

  1. Python标准模块--threading

    1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...

  2. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  3. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  4. Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  5. python基础-模块

    一.模块介绍                                                                                              ...

  6. python 安装模块

    python安装模块的方法很多,在此仅介绍一种,不需要安装其他附带的pip等,python安装完之后,配置环境变量,我由于中英文分号原因,环境变量始终没能配置成功汗. 1:下载模块的压缩文件解压到任意 ...

  7. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

  8. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  9. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  10. Python Paramiko模块与MySQL数据库操作

    Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...

随机推荐

  1. Java 集合Collection与List的详解

    1.什么是集合 存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式. 集合的出现就是为了持有对象.集合中可以存储任意类型的 ...

  2. Busybox制作ARM(iTOP4412) 根文件系统

    本记录来源与自身操作过程. 1.制作环境 PC环境:外部Winows8.1 内部则为vmware11+ubuntu12.04 嵌入式设备:iTOP4412 交叉工具:arm-none-linux-gn ...

  3. flink--DateSet开发--简单入门

    开发流程 1. 获得一个execution environment, 2. 加载/创建初始数据, 3. 指定这些数据的转换, 4. 指定将计算结果放在哪里, 5. 触发程序执行 例子: object ...

  4. day10.函数升级

    1.写函数,接受n个数字,求这些参数数字的和.(动态传参) def summ(*args): all = 0 for i in args: all = all + i return all ret = ...

  5. 分布式配置hadoop2.5.0 2.6.x

    1. sudo vim /etc/hostname 在master的机器上,改成     master 在slave上写  slave01,02,03...... 配置好后重启. 2. sudo vi ...

  6. BZOJ4589 Hard Nim FWT 快速幂 博弈

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...

  7. BZOJ1911 [Apio2010]特别行动队 - 动态规划 - 斜率优化

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 UPD(2018-04-01):用Latex重打了公式…… 题意概括 把一个整数序列划分成任意连续的段,使得划分出 ...

  8. 场景/故事/story——寻物者发布消息场景、寻失主发布消息场景、消息展示场景、登录网站场景

    1.背景:(1)典型用户:吴昭[主要]  尤迅[次要] 王丛[次要] 佑豪[次要](2)用户的需求/迫切需要解决的问题a.吴昭:经常在校园各个地方各个时间段,丢失物品需要寻找.b.吴昭:偶尔浏览一下最 ...

  9. day 58 bootstrap -part1

    我们的bootstrap主要使用都是官网里面的内容,官网里面的都整理得很完备,有需要的时候就直接去里面找即可, 关于这个bootstrap,我所理解的就是,我们前面所学的那些,从html开始一直到后面 ...

  10. gradle根据不同渠道设置不同的开屏启动页

    需求:根据不同渠道,app的开屏启动页不一样 思路:因为app的启动页是在清单文件配置的,而清单文件最后是要和main里面的清单文件合并的,所以每个渠道都要配一个清单文件,在里面设置 然后在Andro ...