Python基础(8) - 模块
Python
模块的物理形式就是文件;一个文件对应一个模块。文件名就是模块名+.py
模块定义了自己独有的命名空间。在其定义的属性,函数,类都隶属于该空间。
通过import关键字我们可以导入模块:
import module1,[module2,[…moduleN]]
也可以使用多行导入的方式:
import module1[
:
Import moduleN]
两种方式在性能上没有差别,但是多行导入从可读性上来讲更加清晰
推荐的import语句导入模块顺序:
python标准库àpython第三方库à应用程序自定义模块
如果解释器执行到import语句,如果在搜索路径中找到了指定的模块,就会加载它。
一个模块在第一次导入时加载并执行(顶层代码),后续再被导入时不会再执行。
如果在一个模块的顶层导入的模块,该模块具有Global的作用域,如果我们是在函数内部导入的,则具有Local的作用域。
导入的模块必须在搜索的路径中,如果没有则会抛出找不到该模块的异常。搜索路径为sys模块中的path属性。该path属性是一个列表。如果我们的模块路径不在该列表中,我们要加入到该列表。
>>> import sys
>>> sys.path
['', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Py
thon27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\Python27\\lib\\site-packages\\wx-2.8-msw-ansi']
>>>
>>> sys.path.append('C:\\Windows')
>>> sys.path
['', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Py
thon27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\Python27\\lib\\site-packages\\wx-2.8-msw-ansi', 'C:\\Windows']
>>>
from module import name1,[name2,[…nameN]]
通过上述语句可以导入一个模块的属性,把其引入到当前的命名空间中。
这样我们在使用这些属性时就不需要再加入模块名了。如果想导入该模块的所有属性。则使用如下语句:
from module import *
但对于上面的语句我们不建议使用,因为它污染了当前的命名空间,很可能会覆盖当前命名空间中已有的名称
更标准的多行导入语句格式如下:
from module import (name1,name2...nameN)
扩展的import语句:as,可以解决导入的模块或模块属性命名冲突的问题,或者名称太长的问题
import module as …
from module import name as …
globals()和locals():分别返回调用者全局和局部命名空间的字典。在全局命名空间下,两者返回相同的字典,因为这是的局部命名空间就是全局空间。
包:
包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的python应用程序执行环境,主要用于解决以下问题:
包也使用句点属性标识来访问它们的元素,使用标准的import和from-import语句导入包中的模块。
每个包目录下都必须有一个__init__.py文件,在导入包时被执行。它控制着包的导入行为,可以是空文件,此时仅仅导入包而不做任何其他事情。但如果需要预导入一些模块,就需要在__init__.py中编码实现。
使用from … import *的方式导入包时,在__init__.py中可以通过__all__指定本包中哪
些模块需要被导入
举例:
Sound/__init__.py是一个空文件, 则:
>>> from Sound import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'pywin', 'sys']
在Sound/__init__.py中, 写一行:
__all__ = ['Effects', 'Filters']
则:
>>> from Sound import *
>>> dir()
['Effects', 'Filters', '__builtins__', '__doc__', '__name__', '__package__', 'pywin', 'sys']
警惕导入循环:
a.py代码:
from b import impModule
b.py代码:
import a
def impModule():
print "iimpModule() called”
impModule()
b.py代码修改后:
def impModule():
import a
print "iimpModule() called”
impModule()
Python使用名称空间的概念存储对象,这个名称空间就是对象作用的区域,不同对象存在于不同的作用域。下面是不同对象的作用域规则:
名字解析的规则。
LGB (Local Global Built-in)
单个模块中的全局变量与局部变量:
>>> g = 123
>>> def func():
... g = 'a'
... return g
...
>>> func()
'a'
func 函数中局部变量g隐藏了全局变量
>>> g = 123
>>> def func():
... global g
... g = 4
... print g
...
>>> func()
4
>>> print g
4
>>>
>>> g = 123
>>> def func():
... k = g
... print g,k
... g = 4
...
>>> func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in func
UnboundLocalError: local variable 'g' referenced before assignment
>>>
Python运行代码时是先编译的。对g 赋值,就成了局部变量。
跨模块的作用域:
#imptee.py代码:
foo = "abc"
def show():
print "foo from imptee:%s"%foo
#impter.py代码:
from imptee import foo,show
show()
foo = 123
print "foo from impter:%s"%foo
show()
猜猜执行impter.py的结果?
在impter.py中,foo实际上是该模块的局部变量,foo = 123不会改变imptee.py中的foo
再想一下,如何改变imptee.py中的foo?
#impter.py代码:
import imptee
imptee.show()
imptee.foo = 123
print "foo from impter:%s"%imptee.foo
imptee.show()
Python基础(8) - 模块的更多相关文章
- python基础——第三方模块
python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的. 如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了. 如果你正在使用Window ...
- python基础——使用模块
python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...
- 二十五. Python基础(25)--模块和包
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
- python 基础之 模块
Python 基础之模块 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文 ...
- 【Python之路】第六篇--Python基础之模块
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- 周末班:Python基础之模块
什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写 ...
- python基础-各模块文章导航
python基础学习日志day5-各模块文章导航 python基础学习日志day5---模块使用 http://www.cnblogs.com/lixiang1013/p/6832475.html p ...
- python基础--导入模块
一,import的使用1, 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块中的功能一个模块就是包含了一组功能的python文件,例如demo.py 可以通过import来使用这个文件定义d ...
- python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)
一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...
随机推荐
- /Date(1512551901709+0800)/转换
var convertDT=function(dt) { dt.replace(/Date\([\d+]+\)/, function (a) { eval('d = new ' + a) }); al ...
- DEV 之 有些控件不允许拖动。
DEV 之 有些控件不允许拖动. 设置一个参数即可解决问题
- django model项目外操作
方法1: python manage.py shell 然后import对应的model并操作 方法2: 新建py脚本 import sys import os pwd = os.path.dirna ...
- centos7 minimal 安装mysql
CentOS 7.3.1611 安装 MySQL 2017年06月08日 23:02:08 阅读数:250 依赖 MySQL 依赖 libaio,所以先要安装 libaio yum search ...
- 构建针对 iOS 和 Android 的原生扩展
第一部分:音量控制入门 http://www.adobe.com/cn/devnet/air/articles/building-ane-ios-android-pt1.html 第二部分: 开发 A ...
- css中设置background属性
属性解释 background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个设置项: backgrou ...
- Struts2框架action路径问题心得----》页面url请求怎么找action
Struts2 页面url请求怎么找action Struts2 页面url请求如何找action 1.我们使用最原始的方法去查找action,不同注解. struts.xml文件先配置 <!- ...
- Quartz.Net_表达式参考说明
字段名 允许的值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日 1-31 , - * ? / L W C 月 1-12 , - * / ...
- CRS无法随操作系统自动启动
1.环境说明 一套RedHat7.5上安装的11.2.0.4 RAC,进行正常的系统维护,重启主机后发现GI集群一直无法启动. 2.问题分析 (1).查看GI集群的OHASD进程的日志,发现操作系 ...
- MySQL中optimize的作用
MySQL执行命令delete语句时,如果包括where条件,并不会真正的把数据从表中删除,而是将数据转换成了碎片,通过下面的命令可以查看表中的碎片数量和索引等信息: mysql > show ...