谢乾坤 | Kingname

给时光以生命。

GeneralNewsExtractor以下简称GNE是一个新闻网页通用抽取器,能够在不指定任何抽取规则的情况下,把新闻网站的正文提取出来。

我们来看一下它的基本使用方法。

阅读全文 »

在写 Python 代码时,小括号必定是天天跟我们打交道的符号。无论是函数还是类或是运算优先级都会涉及到大量的小括号。

今天我们来讲讲小括号不为人知的另外两种用法。

阅读全文 »

我们知道,如果我们在 Python 中想把一段数据持久化到硬盘上,最简单的办法就是写文件:

1
2
3
with open('data.txt', 'w', encoding='utf-8') as f:
f.write('username:1234567\n')
f.write('password: 9876543\n')

但这样做有一个弊端,就是在读取数据的时候,我们把整个数据读入内存以后,还需要单独写一段代码,用来区分哪里是username对应的值,哪些是password对应的值。

阅读全文 »

二十几种设计模式中,单例模式是最简单最常用的一种。在其他语言里面实现单例模式要写不少代码,但是在 Python 里面,有一种非常简单的单例模式写法。

阅读全文 »

在上一篇文章中,我们说到了,itertools.tee不是线程安全的,并给出了一个例子,如下图所示:

在两个线程里面同时运行分裂出来的生成器对象,就会导致报错。

阅读全文 »

在上一篇文章中,我们讲到了,使用itertools.tee可以让一个生成器被多次完整遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
import itertools 

g = generator()
g_1, g_2, g_3 = itertools.tee(g, 3)

for row in g_1:
print(row)

for row in g_2:
print(row)

for row in g_3:
print(row)

但是,我们说到itertools.tee有两个弊端,其一,如果分裂出来的多个生成器是按顺序执行的,其中一个完整遍历了再遍历第二个,那么就会导致内存中堆积大量的数据。

要解释这个问题的原因,我们就要理解itertools.tee背后的原理。

阅读全文 »

我们知道,Python 里面的生成器只能被消费一次,例如如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def name_generator():
for name in ['产品经理', 'kingname']:
yield name

def say_hello(g):
print('hello 函数开始运行')
for name in g:
print('hello', name)
print('hello 函数运行完成')

def say_hi(g):
print('hi函数开始运行')
for name in g:
print('hi', name)
print('hi函数运行完成')

names = name_generator()
say_hello(names)
say_hi(names)

运行效果如下图所示:

say_hello函数里面,生成器已经被完整遍历了一次,那么在say_hi里面,就什么数据都拿不到了。

但如果我们用的是列表,就可以多次遍历,如下图所示:

大家注意观察区别。

那么有什么办法,能让生成器被多次完整迭代呢?这个时候就要使用itertools.tee这个函数了。它通过dequeue实现了让生成器多次消费的办法。

阅读全文 »

产品经理中午没有赶上食堂的午饭,于是纠集了一批人一起点外卖。然而正当她要下单时,老板找她有开会,于是她让开发小哥随便帮忙点一份。

产品经理开完会回来以后,发现还剩三份外卖没有人拿,分别是鲱鱼汤、螺蛳粉和大肠刺身。此时开发小哥碰巧不在,产品经理一时不知道哪一份才是自己的。

阅读全文 »

不是因为我高产似那啥。而是因为这些文章是我每天一篇发布在微信公众号上的,然后每隔一段时间整体搬运到博客上面来。

所以还没有关注我微信公众号的同学,请扫描下面的二维码,关注我的公众号,每天一篇原创文章,每天都有新技能 Get。

0%