总览
7:30~7:35 学习打卡
年兽走了…
8:30~11:30 学习Python
Python
今天主要看了一下python的函数式编程。
因为python变量没有类型,它可以指向任何对象,包括函数。所以,函数可以被看作是变量一样(类似于c里面的函数指针)。
闭包函数
基于python的特性,python可以非常方便的实现 闭包函数 。
什么是闭包? ,当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。
装饰器
如果我们想增加扩展一个函数的功能,但是不改变该函数函数的代码,我们怎么实现?,可以利用 装饰器(decorator)。
装饰器的思想就像是,在原本完美的一个东西上面添加一些装饰物品,达到锦上添花的效果。
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数:
def log(func):
def wrapper():
print('call %s():' % func.__name__)
return func()
return wrapper
def now():
print('2021-2-20')
now = log(now)
这样的话,如果我们调用now():
execute now():
2015-3-25
我们并没有改变now函数的代码,但是我们达到了扩展的功能。
Python装饰器的语法糖
如果我们要用log函数装饰now函数,我们可以这样写:
now = log(now)
但是python有更加便于理解的写法:
def log(func):
def wrapper():
print('call %s():' % func.__name__)
return func()
return wrapper
@log()
def now():
print('2021-2-20')
这样可以清楚的知道log函数是一个装饰器,用来装饰now函数。
像这种简化代码的语法规则,大家喜欢叫它语法糖。
12:00~19:00 Nonebot2框架
Nontbot2是基于异步协议的一个Python聊天机器人框架,结合之前学了一点的go-cqhttp,两者一起可以实现QQ聊天机器人的功能。
关于go-cqhttp和Nonebot2的安装和配置官方文档有详细介绍。
天气查询
下面是这些天完成的一个查天气的一个小功能(weather),以python包的形式编写的:
weather包结构:
__init__.py文件:
from nonebot import on_command
from nonebot.rule import to_me
from nonebot.typing import T_State
from nonebot.adapters import Bot, Event
from .data_source import get_weather_of_city
weather = on_command(
'weather',
aliases={'天气', '天气预报', '查天气'},
# rule=to_me(),
priority=5
)
@weather.handle()
async def handle_first_receive(bot: Bot, event: Event, state: T_State):
args = str(event.get_message()).strip() # 首次发送命令时跟随的参数,例:/天气 上海,则args为上海
if args:
state["city"] = args # 如果用户发送了参数则直接赋值
@weather.got("city", prompt="你想查询哪个城市的天气呢?")
async def handle_city(bot: Bot, event: Event, state: T_State):
city = state["city"]
# if city not in ["上海", "北京"]:
# await weather.reject("你想查询的城市暂不支持,请重新输入!")
city_weather = await get_weather_of_city(city)
await weather.finish(city_weather)
调用天气API
data_source.py文件:
from aiohttp import ClientSession
async def get_weather_of_city(city: str) -> str:
#API地址
url = 'https://www.tianqiapi.com/api'
#请求参数
payload = '?version=v61&appid=18563822&appsecret=eziD3wIu&city='+city
async with ClientSession() as sess:
async with sess.post(url+payload) as response:
res_payload = await response.json()
# print(res_payload)
date = str(res_payload['date']).split(sep='-')
res = f"今天是{date[0]}年{date[1]}月{date[2]}号,{res_payload['week']}\n" +\
f"{res_payload['city']}天气:{res_payload['wea']}\n当前温度:{res_payload['tem']}°\n" +\
f"{res_payload['air_tips']}\n" +\
f"上次天气更新时间:{res_payload['update_time']}"
return res
data_source.py是用来获取天气信息的,信息来源于一个免费提供天气API的网站:
天气API