Python入门之模块
Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言,本节主要总结Python入门之模块,Python模块的安装与使用。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。类似于Java里面的包和C#里面的动态链接库。
在使用Python时,我们经常需要用到很多第三方库,例如,Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。用pip一个一个安装费时费力,还需要考虑兼容性。直接使用Anaconda,简单省事。
Anaconda安装模块库
查看所有已安装模块库
代码语言:javascript复制conda list
查看package信息
代码语言:javascript复制conda search numpy
安装package
代码语言:javascript复制conda install numpy
指定版本安装
代码语言:javascript复制conda install numpy-1.9.2
更新package
代码语言:javascript复制conda update numpy
删除package
代码语言:javascript复制conda remove numpy
使用模块库
import 语句
只需在另一个源文件里执行 import 语句,语法如下:
代码语言:javascript复制import module1[, module2[,... moduleN]
注:一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
代码语言:javascript复制# coding:utf-8
import numpy as np
a = np.array([1, 2, 3])
print(a)
自定义模块
很多时候,我们想把自己代码作为模块,以便下次使用或者分享自己的源码,可以编写成.py文件。
例:斐波那契(fibonacci)数列模块
1)编写fibo.py模块,保存为fibo.py
代码语言:javascript复制# 求n以内的斐波那契数列
def fib(n):
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a b
return result
# 求第m个斐波那契数 第n项(从0开始,第0项为0)
def fib2(m):
result = [0, 1]
a, b = 0, 1
if m <= 0:
return 0
for i in range(2, m 1):
result.append(result[i-1] result[i-2])
return result[m]
在另外一个脚本里引用fibo模块
代码语言:javascript复制import fibo as fb
result = fb.fib(100)
print(result)
result2 = fb.fib2(7)
print(result2)
输出:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
13
from … import 语句
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,这种导入的方法不会把被导入的模块的名称放在当前的字符表中(所以在这个例子里面,fibo 这个名称是没有定义的)。
代码语言:javascript复制from fibo import fib, fib2
print(fib(100))
输出:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
from... import *语句:
代码语言:javascript复制 from fibo import *
把一个模块的所有内容全都导入到当前的命名空间,这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不建议过多使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。
注: 模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。所以,模块的作者可以放心大胆的在模块内部使用这些全局变量,而不用担心把其他用户的全局变量搞花。
模块是可以导入其他模块的。在一个模块(或者脚本,或者其他地方)的最前面使用 import 来导入一个模块,当然这只是一个惯例,而不是强制的。被导入的模块的名称将被放入当前操作的模块的符号表中。
每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。__name__ 与 __main__ 底下是双下划线。
dir() 函数
内置的函数 dir() 可以找到模块内定义的所有名称。
代码语言:javascript复制import fibo
dir(fibo)
输出:['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']
标准模块
Python 本身带着一些标准的模块库。
包
包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。
在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。
目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。
注意当使用from package import item这种形式的时候,对应的item既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。
import语法会首先把item当作一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,恭喜,一个:exc:ImportError 异常被抛出了。
反之,如果使用形如import item.subitem.subsubitem这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。
通常我们并不主张使用*这种方法来导入模块,因为这种方法经常会导致代码的可读性降低。不过这样倒的确是可以省去不少敲键的功夫.