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应用程序执行环境,主要用于解决以下问题:

l为平坦的命名空间加入有层次的组织结构
l允许程序员把有联系的模块组合到一起
l允许分发者使用目录结构而不是一大堆混乱的文件
l帮助解决有冲突的模块名称

包也使用句点属性标识来访问它们的元素,使用标准的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使用名称空间的概念存储对象,这个名称空间就是对象作用的区域,不同对象存在于不同的作用域。下面是不同对象的作用域规则:

p  每个模块就是一个全局作用域。
p  每次调用一个函数就创建一个局部作用域。
p  函数内的赋值对象属局部作用域,除非使用global关键字进行声明
 

名字解析的规则。

LGB (Local  Global  Built-in)

l  大多数名字引用在三个作用域中查找:先局部(Local),次之全局(Global),再次之内置(Built-in)。
l  如想在局部作用域中改变全局作用域的对象,必须使用global关键字。'global'声明把赋值的名字映射到一个包含它的模块的作用域中。
 

单个模块中的全局变量与局部变量:

>>> 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) - 模块的更多相关文章

  1. python基础——第三方模块

    python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的.  如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了.  如果你正在使用Window ...

  2. python基础——使用模块

    python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...

  3. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  4. python 基础之 模块

    Python 基础之模块 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文 ...

  5. 【Python之路】第六篇--Python基础之模块

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  6. 周末班:Python基础之模块

    什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写 ...

  7. python基础-各模块文章导航

    python基础学习日志day5-各模块文章导航 python基础学习日志day5---模块使用 http://www.cnblogs.com/lixiang1013/p/6832475.html p ...

  8. python基础--导入模块

    一,import的使用1, 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块中的功能一个模块就是包含了一组功能的python文件,例如demo.py 可以通过import来使用这个文件定义d ...

  9. python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  10. 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)

    一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...

随机推荐

  1. 20145233《网络对抗》Exp8 Web基础

    20145233<网络对抗>Exp8 Web基础 实验问题思考 什么是表单? 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框.隐藏域 ...

  2. MIPS rev.1 指令参数

    由于MIPS各个版本之间的操作数会变,如果出现无法识别的情况 需要根据官方的MIPS instruction手册逐条核对,此处的版本为Rev.1 //******MIPS-55*********// ...

  3. Partition--分区切换2

    有分区表TB2和TB2_History CREATE TABLE TB2( ID  BIGINT IDENTITY(1,1) PRIMARY KEY, C1 NVARCHAR(200))ON[ps_T ...

  4. MongoDB基础知识记录

    MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...

  5. SCPO2015 小凸玩矩阵

    题目链接:戳我 二分答案+最大流. 看到第K大的数的最小值是多少,我们想到二分,把他转化为最大数最小问题--二分一个数x,如果有>=n-k+1个数不比它大,那么它就应当不大于当前数,否则应当大于 ...

  6. Django-01Django简介

    1 MVC与MTV模型 MVCWeb服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业 ...

  7. Windows下使用DOS命令进入MySQL数据库

    先要配置环境变量 MYSQL_HOME : D:\mysql-8.0.11-winx64 Path:%MYSQL_HOME%\bin 1)新建MYSQL_HOME变量,并配置:C:\Program F ...

  8. HTML-★★★★★表单★★★★★

    表单 <form id="" name="" method="post/get" action="负责处理的服务端" ...

  9. Kettle配合Windows执行计划实现定时实行作业

    一般作业做好后需要做成定时任务,Kettle可以借助Windows的执行计划来完成.那么可以通过写批处理的方式让执行计划来调用. 其中Kitchen和Pan都可以做定时执行,一个是针对作业,一个是针对 ...

  10. HTML中title前面小图标和网站收藏现实的图标

    网站上的logo实际上是一个“favicon.ico”图片.实现步骤:第一步:制作favicon.ico,大小为16*16毫米:第二步:将“favicon.ico”放到项目的根路径下. 第三步:在所有 ...