陕西网站建设托管,seo优,行业网站排行榜,wordpress防止发表重复标题的文章Python3 模块-1
在前面的几个章节中我们基本上是用 python 解释器来编程#xff0c;如果你从 Python 解释器退出再进入#xff0c;那么你定义的所有的方法和变量就都消失了。
为此 Python 提供了一个办法#xff0c;把这些定义存放在文件中#xff0c;为一些脚本或者交互…Python3 模块-1
在前面的几个章节中我们基本上是用 python 解释器来编程如果你从 Python 解释器退出再进入那么你定义的所有的方法和变量就都消失了。
为此 Python 提供了一个办法把这些定义存放在文件中为一些脚本或者交互式的解释器实例使用这个文件被称为模块。
模块是一个包含所有你定义的函数和变量的文件其后缀名是.py。模块可以被别的程序引入以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
下面是一个使用 python 标准库中模块的例子。
#!/usr/bin/python3
# 文件名: using_sys.pyimport sysprint(命令行参数如下:)
for i in sys.argv:print(i)print(\n\nPython 路径为, sys.path, \n)执行结果如下所示
$ python using_sys.py 参数1参数2
命令行参数如下:
using_sys.py
参数1
参数2Python路径为[/root,/usr/lib/python3.4,/usr/lib/python3.4/plat-x86_64-linux-gnu,/usr/lib/python3.4/lib-dynload,/usr/local/lib/python3.4/dist-packages,/usr/lib/python3/dist-packages]1、import sys 引入 python 标准库中的 sys.py 模块这是引入某一模块的方法。2、sys.argv 是一个包含命令行参数的列表。3、sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。 import 语句
想使用 Python 源文件只需在另一个源文件里执行 import 语句语法如下
import module1[, module2[,... moduleN]当解释器遇到 import 语句如果模块在当前的搜索路径就会被导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 support需要把命令放在脚本的顶端
## support.py 文件代码#!/usr/bin/python3
# Filename: support.pydef print_func( par ):print (Hello : , par)returntest.py 引入 support 模块
#!/usr/bin/python3
# Filename: test.py# 导入模块
import support# 现在可以调用模块里包含的函数了
support.print_func(Runoob)以上实例输出结果
$ python3 test.py
Hello:Runoob下载代码
一个模块只会被导入一次不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。
当我们使用 import 语句的时候Python 解释器是怎样找到对应的文件的呢
这就涉及到 Python 的搜索路径搜索路径是由一系列目录名组成的Python 解释器就依次从这些目录中去寻找所引入的模块。
这看起来很像环境变量事实上也可以通过定义环境变量的方式来确定搜索路径。
搜索路径是在 Python 编译或安装的时候确定的安装新的库应该也会修改。搜索路径被存储在 sys 模块中的 path 变量做一个简单的实验在交互式解释器中输入以下代码
import syssys.path
[,/usr/lib/python3.4,/usr/lib/python3.4/plat-x86_64-linux-gnu,/usr/lib/python3.4/lib-dynload,/usr/local/lib/python3.4/dist-packages,/usr/lib/python3/dist-packages]sys.path 输出是一个列表其中第一项是空串 ‘’代表当前目录若是从一个脚本中打印出来的话可以更清楚地看出是哪个目录亦即我们执行python解释器的目录对于脚本的话就是运行的脚本所在的目录。
因此若像我一样在当前目录下存在与要引入模块同名的文件就会把要引入的模块屏蔽掉。
了解了搜索路径的概念就可以在脚本中修改sys.path来引入一些不在搜索路径中的模块。
现在在解释器的当前目录或者 sys.path 中的一个目录里面来创建一个fibo.py的文件代码如下
# 斐波那契(fibonacci)数列模块def fib(n): # 定义到 n 的斐波那契数列a, b 0, 1while b n:print(b, end )a, b b, abprint()def fib2(n): # 返回到 n 的斐波那契数列result []a, b 0, 1while b n:result.append(b)a, b b, abreturn result然后进入Python解释器使用下面的命令导入这个模块
import fibo这样做并没有把直接定义在fibo中的函数名称写入到当前符号表里只是把模块fibo的名字写到了那里。
可以使用模块名称来访问函数
fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]fibo.__name__
fibo如果你打算经常使用一个函数你可以把它赋给一个本地的名称 fib fibo.fibfib(500)
1123581321345589144233377from … import 语句
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中语法如下
from modname import name1[, name2[,... nameN]]例如要导入模块 fibo 的 fib 函数使用如下语句
from fibo import fib, fib2fib(500)
1123581321345589144233377这个声明不会把整个fibo模块导入到当前的命名空间中它只会将fibo里的fib函数引入进来。 from … import * 语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的只需使用如下声明
from modname import*这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。 深入模块
模块除了方法定义还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
每个模块有各自独立的符号表在模块内部为所有的函数当作全局符号表来使用。
所以模块的作者可以放心大胆的在模块内部使用这些全局变量而不用担心把其他用户的全局变量搞混。
从另一个方面当你确实知道你在做什么的话你也可以通过 modname.itemname 这样的表示法来访问模块内的函数。
模块是可以导入其他模块的。在一个模块或者脚本或者其他地方的最前面使用 import 来导入一个模块当然这只是一个惯例而不是强制的。被导入的模块的名称将被放入当前操作的模块的符号表中。
还有一种导入的方法可以使用 import 直接把模块内函数变量的名称导入到当前操作模块。比如:
from fibo import fib, fib2fib(500)
1123581321345589144233377这种导入的方法不会把被导入的模块的名称放在当前的字符表中所以在这个例子里面fibo 这个名称是没有定义的。
这还有一种方法可以一次性的把模块中的所有函数变量名称都导入到当前模块的字符表:
from fibo import*fib(500)
1123581321345589144233377这将把所有的名字都导入进来但是那些由单一下划线_开头的名字不在此例。大多数情况 Python程序员不使用这种方法因为引入的其它来源的命名很可能覆盖了已有的定义。 __name__属性
一个模块被另一个程序第一次引入时其主程序将运行。如果我们想在模块被引入时模块中的某一程序块不执行我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
#!/usr/bin/python3
# Filename: using_name.pyif __name__ __main__:print(程序自身在运行)
else:print(我来自另一模块)运行输出如下
$ python using_name.py
程序自身在运行$ python
import using_name
我来自另一模块说明 每个模块都有一个__name__属性当其值是’main’时表明该模块自身在运行否则是被引入。
说明name 与 main 底下是双下划线 _ _ 是这样去掉中间的那个空格。