模块:
一个文件内随着代码量越来越多,代码就越来越难以维护,这个文件基本就废了。为了解决文件难以维护的问题,可以把很多相似功能的函数分组,分别放到不同的文件中去,这样每个文件所包含的内容相对较少,而且对每一个文件的大致功能可以用文件名来体现。很多编程语言都是这么来组织代码结构的。一个.py文件就是一个模块。
这种多模块形式的优点:
1.提高代码的可维护型。因为每个模块对应一个功能,如果测试出哪个功能出错,直接可以找到相对应的模块。
2.提高了代码的复用度。因为一个模块里面的功能单一,是会被很多地方需要的,可以被多个地方引用。如果模块过大,内容太杂,那么被其他程序需要的可能性大大降低。
3.避免函数名和变量名的冲突。随着文件的增多,每个模块的内容减少,函数和变量同名的几率变小,不容易冲突。
4.它们同时可以引用其他的模块(内置模块,三方模块,自定义模块):
内置模块:系统已经包含的。例如:os ,math,random,time。
三方模块:别人已经写好的模块。
自定义模块:自己写的模块。
使用标准库中的模块:
import sys #系统模块
常用的sys属性:
sys.argv属性:
在python执行到一个脚本时,例如:python test.py
若在CMD窗口输入:python test.py a b c
则sys.argv[0]='test.py'
sys.argv[1]='a'
sys.argv[2]='b'
sys.argv[3]='c'
这些argv变量可以在test.py文件里面访问。
sys.path属性:自动查找所需模块路径的列表。
本人电脑从上到下搜所的路径顺序为:
'C:\Users\yuliang\Desktop\Project',
'E:\python3\python36.zip',
'E:\python3\DLLs',
'E:\python3\lib',
'E:\python3',
'E:\python3\lib\site-packages',
'E:\python3\lib\site-packages\win32',
'E:\python3\lib\site-packages\win32\lib',
'E:\python3\lib\site-packages\Pythonwin']
引入模块的三种方式:
例如:已经定义好了一个.py文件test.py,这个自定义模块的名称为test。
def sayname(name):
print('your name is %s' %name)
def sayage(age)
print('you age is %d' %age)
def sayfavor(favor):
print('you favor is %s' %favor)
第一种:
#若有其它.py模块需要这个test模块,则可以将test.py文件复制到.py文件所在的文件夹中。
在其它模块引入字定义模块test:
格式: import module1[,module2[,module3[......,modulen]]]
例子:import time,random,os
import test.py #一个模块只会被引入一次,不管执行多少次import。防止模块重复引入。
使用模块中的内容:
格式:模块名.函数/变量名
例如:test.sayname('bob')
第二种:
from ....import语句
#从模块中导入一个指定的部分到命名空间
格式 :from module1 import name1[,name2[,……namen]]
例如:
from test import sayname,sayage
sayname('bob') #这种引入方式不用写模块名
sayage(18) #相当于把这两个函数定义到本.py文件中。
sayfavor('basketball') #没有引入这个函数,会报错。
注意:程序内容中的函数可以将模块中的同名函数覆盖。
第三种:
from module import * (不推荐使用)=from module import module
#作用:把一个模块中的所有内容全部都导入到当前的命名空间。
sayname('bob')
sayage(18)
sayfavor('basketball') #都不会报错。
注意:程序内容中的函数可以将模块中的同名函数覆盖。
__name__属性:
#模块就是一个.py文件,一个模块被另一个程序引入。若不想让模块中的某些代码执行,可以用__name__属性使程序仅调用模块中的一部分。当__name__='__main__'时,表示模块自身在执行,当前文件为程序的入口文件。如果文件当模块使用,那么__name__='模块名'
包:
如果不同的人编写的模块同名,为了解决模块同名的冲突,引入了按目录来组织模块的方法,称为包。如果目录相同,为该目录再套一个不同名字的目录。
特点:引入了包以后,只要顶层的包不与其他包发生冲突,那么模块都不会相互发生冲突。
例如:使用自定义的包:
有一个文件叫test.py
内容为:def say():
print('lalala')
将这个test.py外面包上a文件夹,在a文件夹下新建__init__.py文件(文件不需要加上什么内容,加这个__init__.py文件是为了让python识别这是一个包,防止一些滥竽充数的文件被误认为包),那么a文件就是一个包。
有另外一个文件也叫test.py
内容为:def say():
print('pipipi')
将这个test.py外面包上b文件夹,在b文件夹下新建__init__.py文件(文件不需要加上什么内容,加这个__init__.py文件是为了让python识别这是一个包,防止一些滥竽充数的文件被误认为包),那么b文件就是一个包。
注意:若a文件夹和b文件夹同名,则a,b文件夹分别套上一个不同名的文件夹即可,当然也要加上__init__.py
引入包:
import a.test
import b.test
a.test.say()
b.test.say()
下载第三方的包:
windows:勾选了pip和add python to path,自动配置了环境变量。
mac,windows自带python,无需安装。
#要安装三方模块,需要知道模块的名字。
例如:pip install Pillow #表示安装模块Pillow(强大的图像处理工具库)
#windows如果报错,则输入pip insatll --upgrade pip
补充:linux,mac同时存在2.x和3.x版本,输入python,pip默认为2.x版本,若想使用3.x版本,则应该用指令python2和pip3