2018-11-21 孙小北

Python入门之模块

Python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言,本节主要总结Python入门之模块,Python模块的安装与使用。

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。类似于Java里面的包和C#里面的动态链接库。

在使用Python时,我们经常需要用到很多第三方库,例如,Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。用pip一个一个安装费时费力,还需要考虑兼容性。直接使用Anaconda,简单省事。

Anaconda安装模块库

查看所有已安装模块库

conda list

查看package信息

conda search numpy

安装package

conda install numpy

指定版本安装

conda install numpy-1.9.2

更新package

conda update numpy

删除package

conda remove numpy

使用模块库

import 语句

只需在另一个源文件里执行 import 语句,语法如下:

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

注:一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

# coding:utf-8

import numpy as np

a = np.array([1, 2, 3])
print(a)

自定义模块

很多时候,我们想把自己代码作为模块,以便下次使用或者分享自己的源码,可以编写成.py文件。

例:斐波那契(fibonacci)数列模块

1)编写fibo.py模块,保存为fibo.py

# 求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模块

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 这个名称是没有定义的)。

from fibo import fib, fib2

print(fib(100))

输出:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

from... import *语句:

 from fibo import *

把一个模块的所有内容全都导入到当前的命名空间,这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不建议过多使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

注: 模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。所以,模块的作者可以放心大胆的在模块内部使用这些全局变量,而不用担心把其他用户的全局变量搞花。

模块是可以导入其他模块的。在一个模块(或者脚本,或者其他地方)的最前面使用 import 来导入一个模块,当然这只是一个惯例,而不是强制的。被导入的模块的名称将被放入当前操作的模块的符号表中。

每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。__name__ 与 __main__ 底下是双下划线。

dir() 函数

内置的函数 dir() 可以找到模块内定义的所有名称。

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这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。

通常我们并不主张使用*这种方法来导入模块,因为这种方法经常会导致代码的可读性降低。不过这样倒的确是可以省去不少敲键的功夫.

编辑:孙小北

本文地址: http://www.xiaowangyun.com/wyblog/detail/?id=1010

版权归属: www.xiaowangyun.com   转载时请以链接形式注明出处

物以类聚

最新评论

2017-10-06

一辈子不长,只有珍惜了,才不至于后悔。

2017-10-06

懂得感恩,才能走得更远。

标签云

归档

取消

感谢您的支持,您的每一次打赏都是一次鼓励!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦