Python中的模块和包
1.Python中的模块和包
模块:Module,把所有的代码划分到不同的文件中,每个文件称为一个“模块”——便于分工协作;同时模块内数据只能在当前模块中使用,从而防止全局污染
CommonJS/Node.js中模块: 导出:module.exports = ... 导入:const x = require('./x') |
ES6中的模块: 导出:export class Emp{ } 导入:import {Emp} from './x'
导出:export default class Emp{ } 导入:import Emp from './x' |
Python中的模块: 导出:不需要,默认情况下所有成员都可以被其它模块导入 导入形式1:import m1 #m1就代表./m1.py文件模块 导入形式2:from m1 import age #age就是m1模块中的内部全局变量 |
注意:
①第一次导入某个模块会自动在内存中创建该模块对应的对象,会在内存中留下这份拷贝,后续如果还有针对同一个模块文件的导入,则不再执行该文件,直接从内存中取出之前的缓存对象——即每个模块对象都是“单例的(Singleton)”
②模块不需要导出内部成员——内部的全局变量就是模块的成员属性,全局函数就是模块的成员方法
③Python内部约定:启动模块的名称(__name__)为'__main__';非启动模块的名称就是文件名称(去掉.py)。利用此特性,可以执行特定的单元测试代码:
if(__name__ == '__main__'):
#此处放置单元测试代码
④如果项目中的模块太多了,可以把多个模块文件放置在同一个目录下,这样的目录称为“package——包”;例如:“用户包”、“商品包”、“购物车包”...
假设有: user/login.py,则启动文件可以如下导入
导入包下的模块: import user.login as ul
导入包下的模块中的成员: from user.login import uname
⑤如果想在包中执行一些初始化代码,可以放在 __init__.py 的文件中——只要该包中任何模块被导入,都会执行且仅执行一次该初始化文件
CommonJS中有package的概念 —— 用于盛放多个模块文件 Python中也有package的概念; ES6中没有package概念!! |
2.Python官方提供的函数和对象
提示:官方提供的函数和对象都放置在特定的包或模块中;
手册:https://docs.python.org/zh-cn/3/library/index.html
①datetime模块
该模块提供了三个class:date/time/datetime
from datatime import date, time, datetime
获取当前系统日期时间:
dt = datetime.now()
把日期时间格式化为特殊的字符串:
s1 = dt.strftime( '%Y-%m-%d %H:%M:%S' )
------------------------------------------------
y = dt.year
m = dt.month
d = dt.day #不是date
h = dt.hour
mi = dt.minute
s = dt.second
把日期时间转换为长整数(0表示1970-1-1 0:0:0)——称为时间戳:
num = dt.timestamp( )
把长整数转换为日期时间对象:
dt = datetime.fromtimestamp( num )
②math模块
import math
获取PI的值:
math.pi
上下取整:
math.ceil( ) / math.floor( )
三角函数:
math.sin( deg )
注意:JS中还有Math.max()/min()/round()/abs()几个函数Python中是全局函数;JS中的Math.random()函数Python是一个独立的模块
③random模块
import random
生成0~1间的随机小数:
n = random.random( )
生成min~max间的随机整数:
n = random.randrange(min, max, step)
从字符串数组中随机取出一个元素:
e = random.choice( myList )
随机打乱一个数组:
random.shuffle( myList ) #直接修改原始列表
④os.path模块
提示:Python中没有类似Node.js中的__dirname
获取当前路径对应的绝对路径名:
import os.path
p = os.path.abspath( './' )
⑤json模块
import json
把dict对象转换为JSON格式的字符串——称为“序列化”:
//JS:str = JSON.stringify( obj )
str = json.dumps( obj )
把JSON格式的字符串解析为dict对象——称为“反序列化”:
//JS: obj = JSON.parse( str )
obj = json.loads( str )
⑥http.client模块
模拟浏览器向指定的URL发起HTTP请求(GET/POST/...)
作用:爬虫程序、服务器端代理
import http.client
conn = http.client.HTTPConnection('www.codeboy.com') #创建连接
conn.request('GET', '/index.html') #发起请求
res = conn.getresponse( ) #得到响应消息
body = res.read( ) #读取响应主体
面试题:跨域的解决方案?各自的利弊? ①JSONP: 只能发起GET请求,且服务器端修改代码 ②CORS: 修改服务器端代码,生成特别响应消息头部 ③服务器端请求代理方案:让前端服务器代替客户端浏览器向后端服务器发请求 |
|
⑦http.server模块
创建HTTP服务器的方法: 1)Node.js原生方案http 2)Node.js第三方框架:Express 3)Python原生方案http.server 4)Python第三方框架:Django |
3.Pip工具的使用——Python第三方包/模块下载工具
Node.js官方提供了很多模块,业界还有更多的第三方模块,默认托管在npmjs.com上,可以使用NPM(Node Package Manager)工具下载和维护第三方模块;
类似的,Python官方提供了很多模块,业界还有更多的第三方模块,默认托管在pypi.org上,可以使用PIP(Package Installer for Python)工具下载和维护第三方模块。
PIP常用的命令:
pip list #列出已经安装的所有模块
pip show 模块名 #显示指定模块的详情
pip install 模块名 #下载并安装指定模块
pip install --upgrade 模块名 #升级指定的模块
pip uninstall 模块名 #卸载指定模块
提示:PIP默认安装的模块全部安装在 c:\users\web\appdata\local\programs\python\python38-32\lib\site-packages |