python之模块4
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的更多相关文章
- Python标准模块--threading
1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...
- Python的模块引用和查找路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- Python标准模块--logging
1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...
- python基础-模块
一.模块介绍 ...
- python 安装模块
python安装模块的方法很多,在此仅介绍一种,不需要安装其他附带的pip等,python安装完之后,配置环境变量,我由于中英文分号原因,环境变量始终没能配置成功汗. 1:下载模块的压缩文件解压到任意 ...
- python Queue模块
先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...
- python logging模块可能会令人困惑的地方
python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...
- Python引用模块和查找模块路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...
- Python Paramiko模块与MySQL数据库操作
Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...
随机推荐
- 彻底明确怎样设置minSdkVersion和targetSdkVersion
minSdkVersion和targetSdkVersion相信非常多人都不太理解.我在网上也看了很多关于这两者差别的文章,感觉说的都非常模糊.直到我在stackOverFlow看到Android M ...
- 考虑实现一个不抛异常的swap
Effective C++:参考自harttle land 类的swap实现与STL容器是一致的:提供swap成员函数, 并特化std::swap来调用那个成员函数. class Widget { p ...
- windows下面使用nssm设置新的服务实现开机自启等
1.下载: http://nssm.cc/download/?page=download 2.解压: 根据自己的系统选择相应的32bit或者64bit,然后将相应的可执行文件拷贝到系统环境中.配置环境 ...
- skyline添加wfs服务时,弹出错误“no layers were found”!
1.问题描述: 使用TerraExplorer Pro添加ArcGIS Server 10.2发布的WFS服务图层时,弹出如下错误: 2.错误原因: 发布wfs服务前,图层数据源的空间参考未设置,不能 ...
- python3改版后的特征
1.原始数据类型和运算符 # 整数 3 # => 3 # 算术没有什么出乎意料的 1 + 1 # => 2 8 - 1 # => 7 10 * 2 # => 20 # 但是除法 ...
- BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...
- PAT (Basic Level) Practise - 害死人不偿命的(3n+1)猜想
题目链接:https://www.patest.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果 ...
- 关于忘记Jenkins管理员密码的解决办法
一.admin密码未更改情况 1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码: 2.访问Jenkins页面,输入管理员admin,及刚才的密码 ...
- URAL 1989 Subpalindromes (多项式hash) +【线段树】
<题目链接> <转载于 >>> > 题目大意:给你一段字符串,进行两种操作:1.询问[l,r]这个区间中的字符串是否是回文串: 2.更改该字符串中对应下标的 ...
- hdu 3499 flight 【分层图】+【Dijkstra】
<题目链接> 题目大意: 现在给你一些点,这些点之间存在一些有向边,每条边都有对应的边权,有一次机会能够使某条边的边权变为原来的1/2,求从起点到终点的最短距离. 解题分析: 分层图最短路 ...