python 模块简单来说就是一个.py文件,程序的目的是运行,而模块的目的是供其他程序导入并且使用。
模块也有对象,每个模块对象都有一个特殊属性:__dict__
,这是一个包含模块符号表的字典。
import importable
import imporable1,imporable2
import importabl as name #重命名
import 语句并不是需要模块对象或直接操作模块对象,它仅仅是需要导入模块的定义。
from os import path
from importable import object
from importable import object as name
from importable import (object1,obj2,...,obj3)
from importable import* #可能会有名称冲突
如果使用最后那种格式,则将导入所有的非私有的对象,或者变量all中存放的名称列表。
导入一个模块时,Python会在sys.path列表中的路径中依次搜索该模块,我的sys.path路径如下:
path = [
'/home/jiayongqiang/Downloads/deb package/pycharm-community-2017.3.4/helpers',
'/usr/lib/python35.zip',
'/usr/lib/python3.5',
'/usr/lib/python3.5/plat-x86_64-linux-gnu',
'/usr/lib/python3.5/lib-dynload',
'/home/jiayongqiang/PycharmProjects/demo1/venv/lib/python3.5/site-packages',
'/home/jiayongqiang/PycharmProjects/demo1/venv/lib/python3.5/site-packages/setuptools-28.8.0-py3.5.egg',
'/home/jiayongqiang/PycharmProjects/demo1/venv/lib/python3.5/site-packages/pip-9.0.1-py3.5.egg',
]
如果自定义的模块和内置模块名称相同,那么会先使用自定义的模块,从而会导致一些问题,因此在自定义模块名时,不能和内置模块或其他Python库中的名称相同。
一般内置模块使用小写字母命名,所以自定义模块第一个字母大写,可以避免
可以在命令行使用如下命令检测是否内置有对应名称的模块,抛出异常则说明没有:
$ python -c "import sys"
$ python -c "import CustomModule"
Traceback (most recent call last):
File "" , line 1, in
ImportError: No module named 'CustomModule'
$
在pytho加载某个模块时,首先会找该模块同名、以.pyo结尾的文件,.pyo文件表示最优化的字节码编译版本,如果不存在该.pyo文件,则查找是否存在.pyc文件,该文件为非优化的字节码编译版本,如果不存在,则会加载.py文件,并将该文件编译成字节码编译文件。因此,无论哪种形式,Python都以字节码编译的形式将文件加载到内存中,从而在解释器执行时,有更快的速度,只需要加载、运行代码,而不是加载、编译、运行。
包是一个目录,包含一组模块和__init__.py
文件,支持多层嵌套。格式如下:
├── MyPackage
│ ├── Basketball.py
│ ├── Football.py
│ └── __init__.py
使用时,通过import导入:
import MyPackage.Football
s = MyPackage.Football.play()
或者重命名简化模块名:
import MyPackage.Football as football
s = football.play()
或者使用from importable import …:
from MyPackage import Football
Football.play()
或者使from importable import*导入,这种导入方式需要在__init__.py
中创建一个__all__
变量存储名称,如:
__all__ =["Basketball","Football"]
再进行导入:
import sys
from MyPackage import *
Football.play()
Python中提供了一些常用内置函数,其中有些已经用的非常多了,在这里进行下总结
any(i)
:如果可迭代类型对象i(下同)中的任一项都为True,则返回True,否则返回False
all(i)
:如果i中的每一项都为True,则返回True,否则返回False
enumerate(i,start)
:常用于for…in…循环中,返回一个枚举对象,该对象也为一个迭代子,每次迭代会返回一个二元组,第一项为迭代次数,第二项为enumerate中的迭代项。索引起始值为0或start(如果指定),如:
>>> l = ["java","python","android"]
>>> for i,j in enumerate(l):
print(i,j)
0 java
1 python
2 android
>>>
len(x)
:返回x的长度,组合类型返回数据项个数,str类型返回字符个数
max(i,key)
:返回i中的最大项
min(i,key)
:返回i中的最小项
range(start,end,step)
:返回一个整数迭代子
reversed(i)
:反转i,并作为一个迭代子返回
sorted(i,key,reversed)
:对i进行排序并返回,key用于提供DSU修饰排序,reversed如果为True,则排序以反序进行。
sum(i,start)
:求和,如果指定start,则加上start值
zip(i1,...,in)
:以一个或多个iterable为参数,返回一个迭代子,该迭代子将返回元组,第一个元组中存放每个iterable的第一个数据项,第二个元组中存放每个iterable的第二个数据项,以此类推,如:
>>> for t in zip(range(4),range(2,24,2),range(3,20,2)):
print(t)
(0, 2, 3)
(1, 4, 5)
(2, 6, 7)
(3, 8, 9)
>>>