7月18日python学习计划 ——模块与引入模块

2017-07-18  测试窝初学者 

模块

之前的学习中我们多数是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。
为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。


引入模块的作用
最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。


Import
模块定义好后,我们可以使用 import 语句来引入模块,语法如下:


import module1[, module2[,... moduleN]


例如:


例1:
想调用Linux或Windows系统命令,可通过调用os模块
import os    #调用os模块
os.system('cmd')    #打开任务管理器


例2:
#!/usr/bin/python3# Filename: test1.py
def print_func( name ):
    print ("Hello : ", name)
    return


test2.py 引入 test1 模块:
#!/usr/bin/python3  # Filename: test2.py
 # 导入模块import test1

import test1
 # 现在可以调用模块里包含的函数了
test1.print_func("testwo")


以上实例输出结果:
$ python3 test2.py
Hello :  testwo


注意:

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


import导入模块做的事:

1.产生新的名称空间
2.以新建的名称空间为全局名称空间,执行文件的代码
3.拿到一个模块名test1,指向test1.py产生的名称空间


From…import 语句
Python 的 from 语句让你从模块中导入一个指定的方法或函数等到当前命名空间中。语法如下:
from modname import name1[, name2[, ... nameN]]


例如,要导入模块 fib 的 fibonacci 函数,可以使用如下语句:
from fib import fibonacci


这个声明不会把整个 fib 模块导入到当前的命名空间中,它只会将 fib 里的 fibonacci 单个引入到执行这个声明的模块的全局符号表。


注意:

使用From…import*语句,可以把一个模块的所有内容全都导入到当前的命名空间。但是为了避免方法名和当前变量名冲突,不建议使用此方法导入模块。


搜索路径
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
1、当前目录
2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。


如果导入的模块不存在,Python解释器会报 ImportError 错误:
>>> import something
Traceback (most recent call last):
  File "", line 1, in
ImportError: No module named something


命名空间和作用域
变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。
一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。
因此,如果要给函数内的全局变量赋值,必须使用 global 语句。
global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。


例如,我们在全局命名空间里定义一个变量 Money。我们再在函数内给变量 Money 赋值,然后 Python 会假定 Money 是一个局部变量。然而,我们并没有在访问前声明一个局部变量 Money,结果就是会出现一个 UnboundLocalError 的错误。取消 global 语句的注释就能解决这个问题。


#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
Money = 2000
def AddMoney():
   # 想改正代码就取消以下注释:
   # global Money
   Money = Money + 1
 
print Money
AddMoney()
print Money


学习视频将上传到QQq群,群号:316016449

若有问题欢迎交流指正~


205°/2028 人阅读/3 条评论 发表评论

邓智群  2017-07-18


王少文  2017-07-18

蛮好的


小窝  2017-07-19

关注


登录 后发表评论