1 python中的模塊
在python中有一個(gè)概念叫做模塊,這個(gè)和C語(yǔ)言中的頭文件以及JAVA中的JAVA包很類(lèi)似,比如在PYTHON中要調(diào)用sqrt函數(shù),必須 用import關(guān)鍵字引入math這個(gè)模塊。
通俗點(diǎn),模塊就好比是工具包,要想使用這個(gè)工具包中的工具(就好比函數(shù)),就必須導(dǎo)入這個(gè)模塊。
import
在python中用關(guān)鍵字import來(lái)引入某個(gè)模塊,比如要引入模塊math,就可以文件開(kāi)始的地方使用import math來(lái)引入。
import module1,module2...
在調(diào)用math模塊中的函數(shù)時(shí),必須 這樣引用
模塊名.函數(shù)名
import random
print(random.randint(0,5))
from ...import...
Python的from語(yǔ)句讓你從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中:
from modulename import name[,name2...]
例如,要導(dǎo)入模塊fib的fibonacci函數(shù):
from fib import Fibonacci
注意:不會(huì)把整 個(gè)fib模塊導(dǎo)入到當(dāng)前的命名空間中,它中會(huì)將fib里的fibonacci單個(gè)引入。
from random import randint
print(randint(0,9))# 直接寫(xiě)方法名
from...import*
把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間,只需要如下聲明:
from modname import *
注意:這提供了一個(gè)簡(jiǎn)單的方法來(lái)導(dǎo)入一個(gè)模塊中的所有項(xiàng)目,然而這種聲明不該被過(guò)多使用,因?yàn)椴煌K可能存在一樣的方法名字,導(dǎo)致后面導(dǎo)入的模塊的方法覆蓋了前面模塊的同名方法。
as
給導(dǎo)入的模塊重新命名
import random as rd
print(rd.randint(0,5))
查看包的代碼:
>>> import random
>>> random.__file__
'D:\Program Files\Python\Python37\lib\random.py'
定義自己的模塊
在python中,每個(gè)python文件都可以作為一個(gè)模塊,模塊的名字就是文件的名字。
例,調(diào)用自定義模塊
1. 編寫(xiě)一個(gè)module1.py的模塊
# 寫(xiě)一個(gè)工具方法,判斷字符 是否為null,當(dāng)字符串為none為null,還有''還為null,還有' '也為null
def isnull( str ):
if not str:
return True
elif str.strip() == '':
return True
else:
return False
def test1():
print("……中的test1方法……")
2. 調(diào)用自己編寫(xiě)的模塊(main.py)
import module1
a = 'a'
print(module1.isnull(a))
module1.test1()
from module1 import isnull,test1
a = 'a'
print(isnull(a))
test1()
模塊的測(cè)試和模塊中的__all__
可以根據(jù)__name__變量的結(jié)果 能夠判斷出,是直接執(zhí)行的python腳本還是被引入執(zhí)行的,從而能夠有選擇性的執(zhí)行代碼
# 寫(xiě)一個(gè)工具方法,判斷字符 是否為null,當(dāng)字符串為none為null,還有''還為null,還有' '也為null
__all__=['isnull'] # 表示被引用的方法,在from module1 import *有效,
def isnull( str ):
if not str:
return True
elif str.strip() == '':
return True
else:
return False
def test1():
print("……中的test1方法……")
# print(isnull(" ")) # 這行雖然是測(cè)試代碼,但只要被當(dāng)作模塊被導(dǎo)入就會(huì)自動(dòng)執(zhí)行
#print(__name__)
if __name__=='__main__': #由python解釋器主動(dòng)執(zhí)行該模塊代碼,測(cè)試時(shí)執(zhí)行,當(dāng)被當(dāng)作模塊調(diào)用時(shí),以下代碼不執(zhí)行
print(isnull(" "))
2 python中的包
引入包,包就是一個(gè)目錄,把多個(gè)py文件放到同一個(gè)文件夾下。
執(zhí)行順序:當(dāng)前目錄-》python系統(tǒng)目錄
Ø 使用” import文件夾.模塊 “ 的方式導(dǎo)入,python3可以導(dǎo)入,python2不行
Ø 使用”from 文件夾 import 模塊 “的方式導(dǎo)入,python3可以導(dǎo)入,python2不行
Ø 在包的文件夾上創(chuàng)建__init__.py文件,雖然 文件內(nèi)容沒(méi)有,但是python2可以用了。在python2中,有一個(gè)目錄,并且目錄下有一個(gè)__init__.py文件,才認(rèn)為是包。
有__init__.py文件在python3中沒(méi)有錯(cuò),以后均在包的目錄上新建一個(gè)__init__.py文件。
Ø 在__init__.py文件中寫(xiě)入
from . import 模塊1
from . import 模塊2
那么可以使用“import 文件夾” 導(dǎo)入,也可以使用” from 文件夾 import 模塊”的方式導(dǎo)入
#encoding=UTF-8
'''
import my_package.module1 # python3,引入包中的模塊,方法1
a = 'a'
print(my_package.module1.isnull(a))
from my_package import module1 # python3,引入包中的模塊,方法1
a = 'a'
print(module1.isnull(a))
'''
import my_package # 引入包中的模塊,方法3 在包目錄下的__init__.py文件 寫(xiě)代碼from . import 模塊1
a = 'a'
print(my_package.module1.isnull(a))
模塊/包的發(fā)布
1. 發(fā)布的模塊/包的目錄結(jié)構(gòu):
[root@localhost test_pub]# tree
.
├── my_package #要發(fā)布的包名
│ ├── __init__.py
│ ├── module1.py #待發(fā)布的模塊1
│ ├── module2.py
│ └── __pycache__
│ ├── __init__.cpython-37.pyc #.pyc是自解碼文件
│ ├── module1.cpython-37.pyc
│ └── module2.cpython-37.pyc
└── setup.py # 與包同級(jí)
2. 編輯setup.py文件
py_modules需要指明所需包含的py文件
from distutils.core import setup
#setup(name='壓縮包的名字',version='1.0',description='描述',author='作者',py_modules=['suba.aa','suba.bb'])
setup(name='my_pub',version='3.7',description='沒(méi)有',author='me',py_modules=['my_package.module1','my_package.module2'])
3. 構(gòu)建模塊
python setup.py build
4. 生成發(fā)布?jí)嚎s包
python setup.py sdist
模塊/包的安裝、使用
1. 安裝的方式
找到模塊的壓縮包-》解決-》進(jìn)入文件夾-》執(zhí)行命令”python setup.py install”
注意:如果在install的時(shí)候,執(zhí)行目錄安裝,可以使用”python setup.py install –prefix 安裝路徑
2. 模塊的引入
在程序中,使用 “from import ”即可完成對(duì)安裝的模塊的使用
from 模塊名 import 模塊名或*
1. 導(dǎo)入模塊的路徑設(shè)置
Ø 查看模塊搜索路徑
Ø 添加搜索路徑
Ø 重新導(dǎo)入模塊
from imp import *
reload(模塊名)
2. 查看已經(jīng)安裝的模塊help()
3. 模塊內(nèi)定義的所有名稱(chēng)dir()函數(shù)
dir()函數(shù)能夠返回由對(duì)象所定義的名稱(chēng)列表,例如:這一對(duì)象是一模塊,則dir()函數(shù)可以找到模塊內(nèi)定義的所有名稱(chēng)(含函數(shù)、類(lèi)、變量),以一個(gè)字符串列表的形式返回
dir()是有參數(shù)的,如果參數(shù)是模塊名稱(chēng)(當(dāng)然參數(shù)也可以是類(lèi),函數(shù)等),那么將返回這一指定模塊的名稱(chēng)列表。如果沒(méi)有參數(shù),那么函數(shù)將返回當(dāng)前文件(即當(dāng)前模塊的名稱(chēng)列表):比如你在test2.py下指定dir(test),那么返回test模塊的名稱(chēng)列表,如果是dir(),那么返回test2.py名稱(chēng)列表
4. 循環(huán)導(dǎo)入,兩個(gè)模塊互相導(dǎo)入