使用迭代器接收数据并自动停止
假设有一个 Redis 集合,里面有 N 条数据,你不停从里面lpop
数据,直到某一条数据的值为'Stop'
字符串为止(已知里面必有一条数据为'Stop'
字符串,但其位置不知道)。
假设有一个 Redis 集合,里面有 N 条数据,你不停从里面lpop
数据,直到某一条数据的值为'Stop'
字符串为止(已知里面必有一条数据为'Stop'
字符串,但其位置不知道)。
我们平时导入第三方模块的时候,一般使用的是import
关键字,例如:
1 | import scrapy |
但是如果各位同学看过 Scrapy 的settings.py
文件,就会发现里面会通过字符串的方式来指定pipeline 和 middleware,例如:
1 | DOWNLOADER_MIDDLEWARES = { |
我们知道,这里的Test.middlewares.ExceptionRetryMiddleware
实际上对应了根目录下面的Test
文件夹里面的middlewares.py
文件中的ExceptionRetryMiddleware
类。那么 Scrapy 是如何根据这个字符串,导入这个类的呢?
请大家猜一猜下面这段代码的运行效果:
1 | import random |
你是不是以为这段代码运行以后,结果如下图所示?
但实际上,我可以让输出结果根据我的意愿随意变动,例如像下面这个 gif ,所有输出结果都是我:
你可以先不要往下看,放下手机,自己写一下代码,试一试 如何才能实现 gif 中的效果。
在我们使用 Python 查询 MongoDB 的时候,一般会使用MongoDB 的集合(collection)对象的 find()
方法或者find_one()
方法:
1 | import pymongo |
其中,find()
方法返回的是一个游标对象,我们可以直接对这个对象进行迭代,从而按顺序获取每一条数据。
你的代码是如何被炫技毁掉的?
Jupyter 是数据分析领域非常有名的开发环境,使用 Jupyter 写数据分析相关的代码会大大节约开发时间。
设想这样一个场景:别的部门的同事传给你一个数据分析的模块,用于实现对数据的高级分析。模块里面有上百个函数。
原来我们在 Python 中写日志,使用的是 Python 自带的 logging 模块,要实现既在终端输出,又能写文件,并且日志文件还能 rotate ,代码需要十多行:
1 | import logging |
那有没有什么简单好用,for human
的写日志方案呢?
有这样一个业务场景:
我有100篇故事,放在 MongoDB 里面。我做了一个 web 接口,每次请求返回一篇故事。希望能够实现:
每次请求返回的故事都不一样,在100次请求里面,每篇故事都需要返回。直到100篇故事全部返回完成。第101次与第1次相同,第102次与第2次相同……
在我们日常使用 Python 时,大家可能有这样一种认识:
True
,a is b 不一定为 True
True
,则 a == b 一定为 True
1 | >>> a = 'abc!' |
这是因为 ==
只比较值,而 is
同时比较值和内存地址。简单来说:你左手边有一个人,右手边有一个人,两个人长得一模一样,那么左手边的人==右手边的人
;你左手边有一个人,一分钟以后这个人走到了你的右手边,那么刚才左手边的人 is 现在右手边的人
但凡事总有意外,情况下面的代码:
为什么会出现这种情况?a is b
为 True,a == b
却为 False
。
你可以先停在这里,猜一下a 和 b 里面的值到底是什么东西。
现在来揭开答案,我们来网上看两行:
a 和 b 的值为♂
,它的意思是Not a Number
,非数。
♂
与任何数,包括它自己比较,结果都是 False,这是IEEE-754规定的:
Python 在实现这个数据的时候,根据 IEEE-754的要求,也做了限制:
相关的文档地址详见 Python 的 math 库
所以,这里 a == b 为 False,是一种特殊情况。并不是 Python 出现了错误。
当我们使用 Elasticsearch-py 批量插入数据到 ES 的时候,我们常常使用它的 helpers
模块里面的bulk
函数。其使用方法如下:
1 | from elasticsearch import helpers, Elasticsearch |
但这种方式有一个问题,它默认相当于upsert
操作。如果_id
对应的文档已经在 ES 里面了,那么数据会被更新。如果_id
对应的文档不在 ES 中,那么就插入。