Python、模块

import的使用

>>> import math
>>> r=5
>>> print('半径为5的元周长为:%.2f'%(math.pi*r*2))
半径为5的元周长为:31.42

上面的程序使用了import语句。import math意思是从Python标准库中引入math.py模块,这是Python中定义的引入模块的方法。import的标准语法如下:
import module [,module1,module2,module3…]
表示一个import可以导入多个模块,每个模块之间用逗号隔开。
如果导入模块,就会获取模块中的所有对象,如果指定导入某个对象就只能的得到该对象。

>>> from math import pi       #只引入math中的pi
>>> print(pi)
3.141592653589793
>>> from math import *        #将math中的所有对象全部引入
>>> print(pi)
3.141592653589793
>>> print(sin(90))
0.8939966636005579
>>> print(cos(180))
-0.5984600690578581
>>> 
>>> import math as m          #起别名,给模块取别名
>>> m.pi
3.141592653589793
>>> from math import pi as p  #给模块中的函数起别名
>>> p
3.141592653589793

模块的基本使用

当我们使用python引入某个模块后,python解释器时怎么样找到对应的文件的呢?这就涉及到python的搜索路径,搜索路径时由一系列目录名组成的,python解释器依次从这些目录中去寻找所引入的模块。搜索路径是在python编译或安装的时候确定的,安装新的库应该也会修改。
python解释器搜索模块位置的顺序如下:
(1)搜索当前目录,如果不在当前目录,python则搜索在shell变量PYTHONPATH下的每个目录。
(2)如果都找不到,python则会继续查看默认路径。
搜索路径被存储在sys模块中的path变量我们可以通过代码来验证,具体如下

>>> import sys
>>> print(sys.path)
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\idlelib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

了解了搜索路径的概念,就可以在脚本中修改sys.path来引入一些不在搜索路径中的模块。现在,在解释器的当前目录或者sys.path中的一个目录里面来创建一个fibo.py的文件,示例代码如下:
1 # 斐波那契(fibonacci)数列模块
2 def fib(n):  # 定义到 n 的斐波那契数列
3   a, b = 0, 1
4   while b < n:
5     print(b, end=’ ')
6     a, b = b, a+b
7   print()
8 def fib2(n): # 返回到n的斐波那契数列
9   result = []
10  a, b = 0, 1
11  while b < n:
12    result.append(b)
13    a, b = b, a+b
14  return result
然后进入Python解释器,使用下面的命令导入这个模块:
import fibo
这样做并没有把直接定义在fibo中的函数名称写入到当前符号表里,只是把模块fibo的名字写到了那里。可以使用模块名称来访问函数,示例代码如下:
import fibo
fibo.fib(1000)
fibo.fib2(100)
fibo.name

>> from  fibo  import fib2
>>> fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

>>> import fibo
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

模块的制作

在python中,每个python文件都可以作为一个模块,模块的名字就是文件的名称。假设有一个文件add.py,它定义了函数add(),如下:

def add(a,b):
    return a+b

此时如果想要main.py文件中使用add.py文件,可以使用from add import add,注意第一个add是文件名,第二个是函数名。示例如下:

>>> import add                            #import+文件名 
>>> add.add(3,4)
7
>>> add.(3,4)
SyntaxError: invalid syntax
>>> from add import add                   #from +文件名+import+函数名
>>> add(5,6)
11

一般在实际的开发过程中,开发人员都会在py文件中添加一些测试信息。为了解决测试代码这个问题,python提供了一个__name__属性。每个模块都有一个__name__属性,当其值为’main’时,表明该模块自身在运行,否则是被引用。因此,如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以通过判断__name__属性的值来实现。接下来,对add.py文件进行修改,测试上述说法是否正确,示例代码如下:
def add(a,b):  
return a+b
#用来测试
if name==‘main’:  
ret=add(12,22)  
print(‘int test.py file,__name__is %s’%name)
再次执行main.py文件,会发现print()函数中的打印不出来,这说明此次是被引用了,而不是该模块自身运行。

python中的包

为了组织好模块,通常会将多个模块放在一个包。包是Python模块文件所在的目录,且该目录下必须存在__init__.py文件(文件内容可以为空)。常见的包结构如下:
package_a
├── init.py
├── module_a1.py
└── module_a2.pypackage_b
├── init.py
├── module_b1.py
└── module_b2.py
main.py

此时,如果main.py想要引用package_a中的模块module_a1,可以使用下列语句实现:
from package_a import module_a1
import package_a.module_a1
如果package_a包中的module_a1 模块需要引用另一个模块package_b,那么默认情况下,Python是找不到package_b模块的。除非在package_a包中的__init__.py文件中添加“sys.path.append(’…/’)”此行代码,并且在package_a包的所有模块中都添加“* import _init”这句代码即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值