【Python教程】05.模块与API

时间:2024-04-12 20:21:41

大纲

Python环境:我们回到第一次课上没有说到的 venv 这个文件夹。

【Python教程】05.模块与API

这个文件夹其实就是这个项目所使用的 Python环境目录 。项目实际执行的python在venv目录下。

为什么不是我们安装Python时的目录?

Pycharm在默认创建项目时会根据我们安装的Python创建一个 虚拟环境 在项目下。

这个虚拟环境是这个 项目专用 的,是 干净 的,可以 不受 其他项目的 影响 。

干净 要表达的是 最原始 的Python环境。

互不影响 的作用体现在多个项目对环境的 依赖 不同,甚至可能 冲突 。

我们也可以选择安装的原始环境进行开发。

【Python教程】05.模块与API

包【 Package 】就是环境依赖中最主要的内容。

包其实就是一个 程序目录 ,在这个目录下包含了 许多模块 ,方便我们调用。

如上次课就使用到了一个 re 模块就是Python自带包里的一个模块。

Python 自带包 ,在安装了Python后就可以直接使用。

除了自带包,我们还要使用到 第三方包 。

大量的第三方包是支撑Python开发的重要一环。现在几乎所有的开发领域都可以使用Python。

Pycharm中的包管理

:进入配置

File

=>

Settings 

【Python教程】05.模块与API

选择 Project code > Project Interpreter 进入包管理

【Python教程】05.模块与API

包管理界面

【Python教程】05.模块与API

已安装的包显示了 包的名称 , 当前版本 【Version】,以及 最新的版本 【Lastest version】。

默认 情况下会有 pip 和 setuptools 两个包,这两个是 Python 用来 管理包的包 ,必须存在。

添加包:点击加号【 + 】

【Python教程】05.模块与API

我们输入 requests 【一个用于请求的包】。

选择正确的包后,点击

Install Package 

进行安装

【Python教程】05.模块与API

安装成功

【Python教程】05.模块与API

【Python教程】05.模块与API

我们就看到了requests包,这时你会发现还多了很多的包。

这些包时requests包里需要调用的包【 依赖包 】,要使用requests也必须安装这些包。

国内源:在安装时,你可能会觉得速度很慢,这时我们就要使用国内源。

国内源就是设在国内的服务器,访问速度比默认的要快。【默认服务器在国外】

在安装包页面,点击

Manage Repositories 

【Python教程】05.模块与API

默认的地址就是 https://pypi.python.org/simple

我们点击加号【 + 】,添加源。

添加源:输入地址,我选择了阿里的源。

【Python教程】05.模块与API

再次搜索包就会出现两个,选择阿里源下载就比较快。

【Python教程】05.模块与API

几个常用的国内源

清华: https://pypi.tuna.tsinghua.ed...

阿里云: https://mirrors.aliyun.com/py...

中国科技大学 https://pypi.mirrors.ustc.edu...

豆瓣: https://pypi.douban.com/simple

模块就是一个 Python文件 。文件中包含 方法和类 ,或者其他内容。

我们之前所写的程序都是在一个文件中实现,其实这也是一个模块。

为了实现 代码复用 ,我们会将方法和类放到模块中去,并由另一个执行文件来调用。

创建一个模块:我们编写一个 utils 工具模块。

创建 utils.py 文件,写入两个方法。与之前没有任何的不同。

def warning(content): print('【warning】{}'.format(content)) def error(content): print('【error】{}'.format(content))

模块调用: import 、 from 。

import utils utils.warning('s') utils.error('ss')

import 后跟上 模块名 ,就完成了模块的导入。

然后我们就可以 通过模块名调用 到该方法。

另一种方式是 from导入 ,特点是导入后不需要用模块名调用,直接使用方法或类。

from … import 表示从某个模块中导入方法或类。

from utils import * warning('s') error('ss')

星号【 * 】代表导入 所有 的方法或类。

from utils import warning warning('ss')

或者 直接指定 要导入的方法或类,多个用 逗号隔开 。

from utils import warning, error

创建包:通过创建包,将模块集合起来管理。

右键

=>

New

=>

Python Package 

【Python教程】05.模块与API

我们创建一个api模块。

【Python教程】05.模块与API

创建好的包显示为

【Python教程】05.模块与API

包下面默认有个 __init__.py 文件,是Python用来 标识 该目录为包的。

我们在api包下创建几个模块,来编写我们下面要学习的API请求功能。

在编写API之前,我们先学习使用一个常用的 内置模块 【时间】: datetime 。

时间模块是用来处理时间的Python自带的包。我们可以方便的对时间进行操作。

导入包:从datetime包中导入datetime模块

from datetime import datetime

时间模块在导入上一般使用from的模式,这样在调用时比较简单。

由于在时间处理上一般都用该包,所以一般也不会有同名模块造成的冲突。

获取当前时间:使用datetime模块下的 now 方法获得当前时间。

now = datetime.now() print('现在时间是' + str(now))

输出 【Python教程】05.模块与API

时间信息:我们获得了时间,但是打印时并不是我们想要的格式。

通过获取时间的年、月、日、时、分、秒、毫秒等信息,来组合我们要的时间。

year = now.year # 年 month = now.month # 月 day = now.day # 日 hour = now.hour # 时 minute = now.minute # 分 second = now.second # 秒 microsecond = now.microsecond # 毫秒 t = int(now.timestamp()) # 时间戳

时间戳 是一个10位的数字,代表了从1970年1月1日0点开始所经历的秒数,是开发过程中常用的计量方式。

自定义格式:

print(str(year) + '-' + str(month) + '-' + str(day)) print('{}-{}-{}'.format(year, month, day))

时间格式化: strftime 。时间的格式化与字符串不同,使用 百分号% 起头的 标准替换符 。

【Python教程】05.模块与API

import locale locale.setlocale(locale.LC_CTYPE, 'chinese') # 解决中文问题 print(now.strftime('%Y年%m月%d日 第%W周 星期%w'))

时间创建:一种方式我们可以通过 反格式化 【 strptime 】来进行。

date = datetime.strptime('2019年3月16日', '%Y年%m月%d日') print(date)

datetime 的 strptime 方法第一个参数是 要转换的时间 ,第二个参数是 时间格式 。

try: birthday = input('输入你的生日(例:2019-03-16)? ') birthday = datetime.strptime(birthday, '%Y-%m-%d') print(birthday) except Exception as e: print('时间格式输入错误')

对象创建:对象创建是另一种时间创建方式,是 面向对象 的编程方式。面向对象的内容,下次课会详细介绍。

datetime 其实是一个  ,可以通过直接创建来生成。

birthday = datetime(year=2019, month=3, day=16)

如上的代码,直接调用datetime类,就可以创建出 时间对象 。

通过 control 键,我们可以进入其所调用的具体方法内容。

【Python教程】05.模块与API

__init__ 就是调用的类 构造方法 , self 暂时不管,后面的参数就是该方法的参数。

我们就可以创建任意时间了。

时间计算: timedelta 。

除了 datetime 模块,我们还需要引入 timedetla 模块。

from datetime import datetime, timedelta

计算使用加减号进行。

yesterday = now - timedelta(days=1) # 昨天,减去一天 delta = now - yesterday # 时间 print(delta.days) # 相差几天

timedelta 的参数还有 weeks 、 seconds 、 minutes 、 hours 等。

API请求是开发过程常用的一个功能。我们使用刚刚安装的 requests 包来完成。

实例:时间模块中,我们只能知道某一天是周几来判断是不是放假。

实际中我们还需要知道某天是不是放假的需求。这时我们就需要API的帮助了。

我们选择了 聚合数据 【 https://www.juhe.cn/ 】这个第三方平台的免费API进行讲解。

万年历 【 https://www.juhe.cn/docs/api/... 】就是我们要使用的API。

注册、认证、申请该API成功后。

【Python教程】05.模块与API

【Python教程】05.模块与API

我们可以在【 测试 】中进行该接口的调试,或者使用 Postman 进行。

【Python教程】05.模块与API

调试完成后我们就可以开始写代码了。

模块编写:

先导入需要的包,并定义两个变量 聚合平台的URL地址 和 申请到的appkey 。

from datetime import datetime # 时间包 import requests # 请求包 appkey = 'xxxxxxxxxxxxxxxxx' # 申请到的appkey juhe_url = 'http://v.juhe.cn/’ # 聚合数据的网址

requests的基本使用:

respone = requests.get(url=url, headers=headers, params=params) # get请求 respone = requests.post(url=url, headers=headers, data=params) # post请求

params 和 data 都是 字典 类型,表示两种请求中的 参数 。 headers 也是 字典 ,表示http 请求头 。

编写方法:

def calendar_day(date=datetime.now()): url = juhe_url + 'calendar/day' params = { 'date': date.strftime('%Y-%m-%d'), 'key': appkey } response = requests.get(url=url, params=params) if response.status_code == 200: # 请求成功 return response.content # 返回结果 else: return None # 请求失败

在请求完成后, response.status_code 是请求返回的状态码, 200 表示请求正常。 response.content 是返回内容。

当状态码不是200时,返回空值 None 表示 请求失败 。

返回的内容是 JSON 形式,我们暂时还无法直接使用。

JSON:该接口返回内容就是 json 。

{ "reason":"Success", "result":{ "data":{ "holiday":"元旦", "avoid":"伐木.纳畜.破", "animalsYear":"兔", "desc":"2012年1月1日", "weekday":"星期日", "suit":"祭祀.开光.理发", "lunarYear":"辛卯年", "lunar":"腊月初八", "year-month":"2012-1", "date":"2012-1-1" } }, "error_code":0 }

Json是一种 数据格式 ,用于 数据的传输 。

其与Python的字典列表组合的结构是一样的。

所以我们可以将 json 和 python 格式 互相转换 。

import json # json格式转换为python格式 data = json.loads(content) print(data) # python格式转换为json格式 content2 = json.dumps(data) print(content2)

解析JSON:

return json.loads(response.content)

或者使用封装好的方法 response.json 也很方便。

return response.json()

调用该模块:编写了一个is_holiday方法来判断

from api import juhe # 从api包导入juhe模块 from datetime import datetime def is_holiday(date=datetime.now()): info = juhe.calendar_day(date) # 获得数据 if info is not None and info['reason'] == 'Success': # 验证数据正确 result = info['result'] if 'holiday' in result: return True # 有holiday时,表示时假日 else: return False return None

1、选择一个API进行请求模块的练习。

2、对于is_holiday这个方法,我们免费的请求次数只有每天100次,

假设我们的用户可能有很多,每天的请求量远不止100次。

我们现在只需要今天的数据,如何可以使我们不付费?