分类目录归档:解决方案

Python里Yield关键词的作用

要理解yield的作用,您必须理解生成器是什么。在理解生成器之前,必须先理解迭代器。

迭代器

当您创建一个列表时,您可以逐个读取它的项。逐项读取其项称为迭代:

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

mylist是一个可迭代的对象。当你使用列表解析式时,你创建了一个列表,因此也是一个迭代器:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

所有你可以用”for… in ….”都是迭代器,包括列表、字符串、文件…等等。

这些迭代器非常方便,因为您可以随心所欲地读取它们,但是您将所有的值都存储在内存中,当您有很多值时,这就非常浪费内存了。

生成器

生成器是迭代器,这种迭代器只能迭代一次。生成器不会将所有值都存储在内存中,它们会动态生成这些值:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

它和列表解析式是类似的,只是用()代替了[]。但是,您不能在mygenerator中对i执行第二次,因为生成器只能使用一次:它print(0),然后忘记它,print(1),最后是4。

Yield

yield是一个与return类似的关键字,只是函数将返回一个生成器

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
 <generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

您需要知道的是函数将返回一组只需要读取一次的值,将这个特性理解清楚,用对地方将极大地提高性能,下次我们将介绍在什么时候该用它。

要掌握yield,您必须了解,在调用函数时,在函数体中编写的代码不会运行。函数只返回生成器对象,这有点棘手:-)

然后,您的代码将从每次使用生成器时停止的地方继续。

现在是最难的部分:

for函数第一次调用从函数创建的生成器对象时,它将从头运行函数中的代码,直到达到yield,然后返回循环的第一个值。然后,彼此调用将再次运行您在函数中编写的循环,并返回下一个值,直到没有要返回的值为止,就如我们上面的例子所示。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

你应该用Python3.x而非Python2.x的20个理由

最近小编在知乎上经常遇到这样的问题:《现在开始学习python的话,是学习python2.x还是学习python3.x比较好?》,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助大家消除疑惑,在这里统一告诉大家原因

1. Python3.1,io模块是使用Python语言实现的,比2.x快5~10倍

2. Python3.1,str.format()支持自动编号:

python3.1,str.format()支持自动编号

3. Python 3.1,64位版的int快了27%~55%

4. Python 3.2,对全局解释器锁(GIL)进行了重大升级,显著改进了Python处理多线程的方式

5. python3.3,用C语言重写了decimal模块,比以前快12倍(数据操作)~120倍(高密度计算)。

6. Python3.3,utf-8编码快了2~4倍,utf-16编码的encode最多快了10倍

7. python3.4,优化pickle模块,性能提升好几倍。

8. python3.4,python解释器的启动快了30%

9. Python3.4, 新增tracemalloc模块。一个调试工具,用于追踪、统计python的内存分配。

10.Python3.4, 新增enum模块,提供枚举。好多人抱怨python没有枚举,现在有了,虽然是以模块的方式实现的。

11. Python 3.5,使异步变得不那么棘手,async和await关键字成为语言语法的一部分。

12. Python3.5,新的语法:Type hints和typing模块。方便代码阅读。

Python3.5,新的语法:Type hints和typing模块

13. Python3.5,UTF-8、UTF-16、LATIN-1编码的decode速度是以前的2~4倍。

14. Python3.5,新增.hex()函数,可以直接把bytes类型转为16进制

python hex()

15.python3.5, 新增os.scandir()函数,更快、更省内存的遍历文件夹。在POSIX系统上比以前快3~5倍,在Windows系统上快7~20倍。os.walk()目前也在使用此函数。

16. Python3.6, 用C语言实现asyncio.Future类和asyncio.Task类,asyncio程序的性能快了25%~30%

17. Python3.6, glob模块的glob()函数和iglob()函数现在使用os.scandir()函数。快了3~6倍

18. Python3.6,pathlib.Path模块的glob()函数现在使用os.scandir()函数。快了1.5~4倍

19. Python3.6, 新增secrets模块,生成强随机数。以前的random模块只能生成伪随机数,官方推荐在涉及安全问题时不再使用random模块

20. Python3.7,time模块新增6个可以访问纳秒的函数,如time.time_ns()、time.perf_counter_ns()等等。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

7行代码 Python热力图可视化分析缺失数据处理

Python热力图寻找缺失数据

你有没有遇到一种情况,处理一张很大的csv表格的时候很难找到表格中每一列的缺失数据,或者说处理速度非常慢?当然如果你的Excel水平非常高,这个可能不会成为你的问题,但如果当你想可视化出每一列缺失数据的分布和数量怎么办呢?这时候就需要用Python绘制热力图了!

1.安装所需要的第三方Python

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install seaborn
pip install pandas
pip install matplotlib

其中pandas是用于数据操作与处理的,matplotlib和seaborn主要用于Python数据可视化,也就是绘制我们所需要的热力图。

2.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')

没错,pandas的使用就这么简单,读取csv文件直接使用read_csv函数,你可以使用自己需要的csv文件,也可以使用我们提供的:点击下载 Python推特机器人分类数据集 中的training_data.csv,只需要你移动到当前代码的文件夹下即可。

3.Python构造热力图

使用Python构造热力图识别表格的缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python热力图寻找缺失数据

seaborn.heatmap用于生成热力图,其会检查data中的每个单元格,如果为空则标记为黄色,cmap为颜色图谱,viridis即蓝-绿-黄. 此外,matplotlib.pyplot主要用于负责展示图片。如果你需要知道seaborn更详细的参数文档,可以阅读这篇文章

整体代码如下(一共只用了7行

import pandas as pd
import seaborn
import matplotlib
data = pd.read_csv('training_data.csv')
seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 监控Github项目更新并自动下载

如果你有自己在本地维护一个开源代码,你就会知道检测这些是否更新了是多麻烦的一件事情。随着库的增大,人工维护成本也就越来越大。因此便有了这个项目的想法:让我们用Python监控Github项目是否有更新,如果有的话自动下载该更新

1.统一文件名格式

为了能够获取github上的项目的更新时间,我们需要调用github的一个API:

https://api.github.com/repos/用户名/库名

可以看到,这个API由 用户名/名 组成,因此我们的文件名应该以它为标准才能方便API的调用,由于文件名不可以带有 ‘/’ 这样的特殊符号,因此我们改为下划线分割,如FastText项目调用API的时候为:

https://api.github.com/repos/facebookresearch/fastText

我们保存的文件名则为 facebookresearch_fastText.zip 这样,在调用API、下载文件的时候将会方便许多

2.获得文件夹里的所有文件名及其最后修改时间

为了判断github上的项目是否相对于本地有更新,我们需要获得每一个本地的文件的最后修改时间,因此这是一个字典关系。代码如下:

3.与Github线上项目对比更新时间

首先我们要通过调用我们前面说提到的API 获取github线上项目的时间。其次,一定要将其格式化为10位时间戳,因为我们第二步获得的时间也是10位时间戳,这样对比起来非常方便。最后返回的时候只需要返回是否需要更新即可。如图所示。

github update time

代码如下:

4.如果有需要更新的项目,让其自动下载

由于许多github项目文件压缩包都挺大的,我们这里采用了流式下载。如果你的项目特别多,你需要更快地进行下载,请采用批量异步下载。在我们之前的那篇文章里都有,点击即可阅读

5. 整套流程

我们把已经下载好的项目文件放在libs文件夹里,自动下载得到的文件放置在new文件夹中。文件结构如下:

F:\pythondict\pythondict-downloads\
│ superviser.py

├─libs
│ facebookresearch_fastText.zip
│ facebookresearch_MUSE.zip

└─new

整套代码如下,为了防范盗取文章的家伙,原谅我这里是图片的格式,如果需要下载请点击这里

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

让python运行地超快的10个方法

大部门人使用python是因为它非常方便,而不是因为它速度快。过多的第三方使得python相比于Java和C的性能差距较大。但也是可以理解的,因为在大部分情况下,开发速度优先于执行速度。

但也不要过于担心python的速度,这并不一定是一个非此即彼的命题。经过适当优化,Python应用程序可以以惊人的速度运行——也许还不能达到Java或C语言的速度,但是对于Web应用程序、数据分析、管理和自动化工具以及大多数其他用途来说,速度已经足够快了。快到你可能会忘记了你是在用应用程序性能换取开发人员的生产力。

优化Python性能不能单从一个角度上看。而是应用所有可用的优化方法,并选择最适合当前场景的多种方法的集合。(Dropbox的员工有一个最令人瞠目的例子,展示了python优化的强大功能,点击链接查看。)

在本文中,我将简单讲述许多常见的python优化方法。有些是临时措施,只需要简单地将一项转换为另一项(例如更换Python解释器),但是那些带来最大收益的方法将需要更详细的工作。

1. 算速度、算速度、算速度!

如果你不能够找出速度慢的原因所在,你就不能确定你的python应用程序为什么运行地不够理想

计算的方法有很多,你可以尝试python内置的 cProfile模块 进行简单的计算分析,如果需要更高的精度(计算每行语句运行时间),可以使用 line_profiler 第三方工具。通常而言,从计算程序的函数运行时间进行分析就能够给你提供改进方案,所以推荐使用 profilehooks 第三方,它能计算单个函数的运行时间。

你可能需要更多的挖掘才能发现为什么你的程序某个地方这么慢、怎么修复它。重点在于缩小你的排查范围,逐渐细化到某条语句上。

2.缓存需要重复使用的数据

当你可以把需要计算出来的数据保存下来的时候,千万不要重复上千次去计算它。如果你有一个经常需要使用的函数,而且返回的是可预测的结果,Python已经给你提供了一个选项,能将其缓存到内存中。后续的函数调用如果是一样的,将立即返回结果。

有许多方法都可以做到,比如说:使用python的一个本地:functools,拥有一个装饰器,叫@functools.lru_cache,它能够缓存函数最近的N个调用,当缓存的值在特定时间内保持不变的时候这个非常好用,比如说列出最近一天使用的物品。

3.将数学计算重构为NumPy

如果你的Python程序中有基于矩阵或数组的数学运算,并且希望更高效地对它们进行计算,那么你就应该使用NumPy,因为它通过使用C来完成繁重的工作,比原生python解释器能更快得处理数组,而且能比Python内置数据结构更有效地存储数字数据。

NumPy还可以极大地加速相对普通的数学运算。该包为许多常见的Python数学操作(如min和max)提供了替换,这些操作的速度比原始Python快很多倍。

NumPy的另一个优点是对大型对象(比如包含数百万项的列表)能更有效地使用内存。一般来说,如果用传统的Python表示类似于NumPy中的大型对象,那么它们将占用大约四分之一的内存。

重写Python算法以使用NumPy需要做一些工作,因为需要使用NumPy的语法重新声明数组对象。但是NumPy在实际的数学操作中使用Python现有的习惯用法(+、-等等),所以切换到NumPy并不会让人太迷惑。

4.使用C

NumPy使用C编写的是一种很好的方法。如果现有的C能够满足你的需求,那么Python及其生态系统将提供几个选项来连接到该库并利用其提高速度。

最常用的方法是Python的ctypes。因为ctypes与其他Python应用程序广泛兼容,所以它是最好的起点,但也并不是唯一的,CFFI项目为C. Cython提供了一个更优雅的接口(参见下面第五点),也可以用来包装外部,代价是你必须学习Cython的标记方法。

5.转换为Cython

如果你非常追求速度,应该用C而不是python,但是对于我这种有python依赖症的人来说,对C天生就有种畏惧。现在有一个很好的解决办法出来了。

Cython允许Python用户方便地访问C的速度。现有的Python代码可以逐步转换为C :首先通过Cython将所述代码编译为C,然后通过添加类型注释以获得更快的速度。

不过,Cython不能变魔术。按原样转换为Cython的代码通常运行速度通常不会加快超过15%到50%,因为该级别的大多数优化都集中在减少Python解释器的开销上。只有在为Cython模块提供类型注释时才允许将相关代码转换为纯C,这时候的速度提升才最大。

6.使用多线程

由于全局解释器锁(GIL)的存在,Python规定一次只执行一个线程,以避免在使用多个线程时出现状态问题。它的存在有充分的理由,但依然很讨厌

随着时间的推移,GIL的效率显著提高(这是为什么你应该用python3的其中一个原因),但是核心问题仍然存在。为了解决这个问题,Python提供了多处理模块(multiprocessing)来在单独的内核上运行Python解释器的多个进程。状态可以通过共享内存或服务器进程共享,数据可以通过队列或管道在进程实例之间传递。

您仍然必须手动管理进程之间的状态。此外,启动多个Python实例并在它们之间传递对象也会涉及不少开销。尽管如此,多处理还是很有用的。另外,使用了C的Python模块和包(如NumPy)也是完全避免GIL的。这也是推荐它们提高速度的另一个原因。

7.知道你的正在干嘛

简单地输入import xyz是多么方便啊!但是你知道,第三方库虽然可以改变应用程序的性能,但并不总是向好的方向发展。

有时,你加了某个模块的时候,应用程序反而变慢了,这就是来自特定的模块构成瓶颈。同样,仔细计算运行时间也会有所帮助,有时则不那么明显。示例:Pyglet是一个用于创建窗口图形化应用程序的,它自动启用调试模式,这将极大地影响性能,直到显式禁用为止。除非阅读文档,否则你可能永远不会意识到这一点。多读书,多了解情况。

8.意识到平台间的速度差异

Python的运行是跨平台的,但这并不意味着每个操作系统(Windows、Linux、OS X)的特性都可以在Python下抽象出来。大多数情况下,你需要了解平台的细节,比如路径命名约定等等。

但在性能方面,理解平台的差异也很重要。例如,有些python脚本需要使用Windows的api去访问一些特定的应用,这些应用也可能会减慢运行速度。

9.使用pypy运行程序

CPython是Python最常用的优化方案,因为它优先考虑兼容性而不是原始速度。对于那些想把速度放在首位的程序员来说,PyPy是一个Python更好的方案,它配备了一个JIT编译器来加速代码的执行(编译为C代码)。

因为PyPy被设计为CPython的一个临时替代品,所以它是获得快速性能提升的最简单方法之一。大多数Python应用程序将完全按原样运行在PyPy上。然而,充分利用PyPy可能需要不断地测试。你将会发现,长时间运行的应用程序更有可能从PyPy中获得了最大的性能收益,因为编译器会随着时间分析执行情况。对于运行和退出的简短脚本,最好使用CPython,因为性能的提高不足以克服JIT的开销

10.升级到python3

如果你用的是python2。而且没有压倒一切的理由(比如一个不兼容的模块)坚持使用它,你应该跳到python3。

Python 3中还有许多Python 2.x中没有的构造和优化。例如,Python 3.5使异步变得不那么棘手,asyncawait关键字成为语言语法的一部分。Python 3.2对全局解释器锁进行了重大升级,显著改进了Python处理多线程的方式。

以上就是全部十点的改进方案啦,尽管使用了这些方法可能运行速度还是无法超过C和Java,但是代码跑得快不快,不取决于语言,而是取决于人,况且Python本身不必是最快的,只要足够快就行。

如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

python 文件下载、大文件下载、异步批量下载 教程

按照不同的情况,Python下载文件可以分为三种:小文件下载大文件下载、批量下载

本文源代码: https://pythondict.com/download/python-file-download-source-code/

python 小文件下载

流程:使用request.get请求链接,返回的内容放置到变量r中,然后将r写入到你想放的地方。

Python小文件下载流程

以下载上述流程图为例子:

# 例1
import requests
def request_zip(url):
    r = requests.get(url) 
    # 请求链接后保存到变量r中
    with open("new/名字.png",'wb') as f:
        # r.content写入至文件
        f.write(r.content)
request_zip('https://pythondict.com/wp-content/uploads/2019/08/2019082807222049.png')

运行完毕后,它将会被保存到当前文件夹的new文件夹里。

python 大文件下载

我们在小文件下载的时候,是将文件内容暂存到变量里,大家想想,下载大文件的时候还这样做会有什么问题?

很简单,如果你的内存只有8G,结果要下载文件却有10G那么大,那就肯定无法下载成功了。而且本机软件运行占的内存也比较大,如果你的内存只有8G,实际上剩余可用的内存可能低于2G-4G. 这种情况下怎么下载大文件呢?

流式分块下载

原理:一块一块地将内存写入到文件中,以避免内存占用过大。

Python大文件下载流程

当设置了request.get(stream=True)的时候,就是启动流模式下载,典型特征:在r变量的content被调用的时候才会启动下载。代码如下:

# 例2
import requests
def request_big_data(url):
    name = url.split('/')[-1]
    # 获取文件名
    r = requests.get(url, stream=True)
    # stream=True 设置为流读取
    with open("new/"+str(name), "wb") as pdf:
        for chunk in r.iter_content(chunk_size=1024):
            # 每1024个字节为一块进行读取
            if chunk:
                # 如果chunk不为空
                pdf.write(chunk)
request_big_data(url="https://www.python.org/ftp/python/3.7.4/python-3.7.4-amd64.exe")

Python 批量文件下载

所谓批量下载,当然不是一个一个文件的下载了,比如说我们要下载百度图片,如果一个一个下载会出现两种负面情况:

  1. 如果某个请求堵塞,整个队列都会被堵塞
  2. 如果是小文件,单线程下载太慢

我们的解决方案是使用异步策略。如果你会用scrapy框架,那就轻松许多了,因为它结合了twisted异步驱动架构,根本不需要你自己写异步。不过我们python实用宝典讲的可是教程,还是跟大家说一下怎么实现异步下载:

我们需要使用到两个包,一个是asyncio、一个是aiohttp. asyncio是Python3的原装,但是aiohttp则需要各位使用cmd/Terminal打开,输入以下命令安装:

pip install aiohttp

注意asyncio是单进程并发,不是多线程,也不是多进程,是协程。单纯是在一个进程里面异步(切来切去运行),切换的地方用await标记,能够切换的函数用async标记。比如下载异步批量下载两个图片的代码如下:

# 例3
import aiohttp
import asyncio
import time
async def job(session, url):
    # 声明为异步函数
    name = url.split('/')[-1]
    # 获得名字
    img = await session.get(url)
    # 触发到await就切换,等待get到数据
    imgcode = await img.read()
    # 读取内容
    with open("new/"+str(name),'wb') as f:
        # 写入至文件
        f.write(imgcode)
    return str(url)

async def main(loop, URL):
    async with aiohttp.ClientSession() as session:
        # 建立会话session
        tasks = [loop.create_task(job(session, URL[_])) for _ in range(2)]
        # 建立所有任务
        finished, unfinished = await asyncio.wait(tasks)
        # 触发await,等待任务完成
        all_results = [r.result() for r in finished]
        # 获取所有结果
        print("ALL RESULT:"+str(all_results))

URL = ['https://pythondict.com/wp-content/uploads/2019/07/2019073115192114.jpg',
       'https://pythondict.com/wp-content/uploads/2019/08/2019080216113098.jpg']
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop, URL))
loop.close()

注意: img = await session.get(url)
这时候,在你请求第一个图片获得数据的时候,它会切换请求第二个图片或其他图片,等第一个图片获得所有数据后再切换回来。从而实现多线程批量下载的功能,速度超快,下载超清大图用这个方法可以一秒一张。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦,有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python七月超有用的十大开源代码(2019)

Mybridge AI 将github上的每个Python项目根据分享总数,读取的分钟数等特征,并用他们的算法计算出了以下2019年7月的十大开源项目。这些项目可能对你的技术生涯会很有帮助。

1. 使用树莓派和Python构建机器人,初学者的循序渐进指南

作者用事实告诉你,建造一个机器人是一件很简单的事情。只要你的智商高于90,而且周围有一些“垃圾”可以用(树莓派、面包板等),你也可以像他一样创建一个机器人在美国,这些“垃圾”的总价格约139.96美元,在中国,你可能只要500元人民币就可以做到了。

机器人

链接: https://www.256kilobytes.com/content/show/10829/raspberry-pi-how-to-build-a-robot-a-step-by-step-guide-for-beginners

2. Python加载PostgreSQL数据的最快方式

该项目作者讲述了将杂乱的数据源导入到PostgreSQL的多种方法。并计算了各个方法的耗时及内存消耗

方法耗时及其结果

链接:https://hakibenita.com/fast-load-data-python-postgresql

3. Python 10个简单方法加速你的数据分析

一点点的小技巧可以节省你大量的时间,作者在文章中讲述了如何利用可视化、交互式、编辑器技巧等深入讲解了加速数据分析的办法,比如说神奇的Python -i XX.py可以让你的python在遇到问题的时候进入DEBUG状态,你可以在此时调试各个变量

链接:https://towardsdatascience.com/10-simple-hacks-to-speed-up-your-data-analysis-in-python-ec18c6396e6b

4. 构建一个亚马逊价格跟踪爬虫

作者通过Beautiful Soup构建了一个亚马逊的非常简单的爬虫,通过监控页面上的价格设定邮件发送机制,如果价格低于预想价格,则邮件通知用户,实现起来非常简单,不过没想到在油管上竟然有23W的观看数,惊呆了。

链接: https://www.youtube.com/watch?v=Bg9r_yLk7VY

5. 深入研究Python类型标注(type hint)

类型标注是Python于2014年发布的新特性,很多人都不知道这个特性到底要怎么用最有效,不过最近,确实越来越多的模块和开始使用它了,来看看作者是怎么介绍这个新特性的吧!

类型标注

链接:https://veekaybee.github.io/2019/07/08/python-type-hints/

6. 如何用Python、树莓派建造一个智能婴儿监视器

如果你是一位爸爸或者一位妈妈,是不是会想着时时刻刻关注着婴儿的状态作者使用了一个树莓派树莓派相机、温度传感器制作了这么一套系统,非常有趣,有兴趣的可以跟着学着做一套,相信对你的Python和树莓派知识会有很大的提高。

作者的宣传图

链接:https://www.twilio.com/blog/smart-baby-monitor-python-raspberry-pi-twilio-sms-peripheral-sensors

7. Python减少对象大小的方法

你有没有试过执行一个上百万条数据的清洗的时候电脑卡死有没有试过训练机器学习模型5个小时,刚到一半的时候内存溢出,自动关闭程序有没有试过服务跑着跑着自动退出,灵异事件还以为是键盘冒奶,结果发现是内存爆表作者告诉你,这些问题都是有办法避免的!

链接:https://habr.com/en/post/458518/

8. Python自动化Instagram发布机制

作者在一天里就将instagram发布的机制用Python进行了自动化,能够更有效地进行任务的批处理,可惜的是视频发布在油管上,不过代码对于大家是可见的github.

github: https://github.com/KalleHallden/InstaAutomator
视频: https://www.youtube.com/watch?v=vnfhv1E1dU4

9. Python制作推特机器人

在这篇文章里,你将学习如何使用tweepy(一个推特爬虫软件)在Python中创建自己的Twitter Bot, 能够基本完成新的推文发表、关注账号和转推,保持账号的活跃度,俗称:养号

链接: https://realpython.com/twitter-bot-python-tweepy/

10. 更好地循环:深入Python的迭代

Python的循环和其他语言的循环有点不太一样,这这篇文章中,作者带你深入了解Python的for循环,看看它们是怎么运作的,以及为什么它们是按照那样的方法运作的

Hello Kitty PEZ dispensers

链接: https://treyhunner.com/2019/06/loop-better-a-deeper-look-at-iteration-in-python

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

每个使用Python的人都应该知道的10个Python库

想知道Python取得如此巨大成功的原因吗?只要看看Python提供的大量就知道了,包括原生和第三方。不过,有这么多Python,有些库得不到应有的关注也就不足为奇了。此外,只在一个领域里的工作的人并不知道另一个领域里有什么好东西,不知道其他领域的东西能产出什么有用的价值。

下面给大家列出10个你可能忽略,但绝对值得注意的Python,这些工具的用途非常广泛, 简化了从文件系统访问、数据编程、云服务到构建轻量级web应用程序、创建gui、图像工具、Excel和Word文件等等的事情的工作复杂度。有些是众所周知的,有些则不太为人所知,但是所有这些Python库都应该在各位的工具箱中占有一席之地。

1. Arrow

Arrow: 让你更方便地处理日期和时间。

为什么要使用Arrow:还记得我们之前讲过的日期计算吗?实际上那是一个简单的计算教程,思考一下,如果我们想要切换时区怎么办、更加灵活地日期格式化怎么做?即便是像python这么好用的工具,如果你只用原生,你也得折腾上一阵子。现在我们有了更好的选择:Arrow.

Arrow拥有四大优势。首先,箭头是Python的datetime模块的一个替代品,这意味着像.now()和.utcnow()这样的公共函数调用可以正常工作。第二,Arrow提供了一些通用的方法,比如转换时区。第三,Arrow提供了“人性化”的日期/时间信息,比如能够毫不费力地说出“一小时前”或“两小时后”发生的事情(就如同我们在暑期余额里讲的那样)。第四,Arrow可以轻松地本地化日期/时间信息。

下面是Arrow使用的三个例子:

import arrow 
# 例1:获得当前时间戳
t = arrow.utcnow()
print(t.timestamp) # 1566128587

# 例2:获得当前时间,并格式化为字符串
t = arrow.now()
s1 = t.format()
print(s1) # 2019-08-18 19:43:07+08:00
s2 = t.format("YYYY-MM-DD")
print(s2) # 2019-08-18

# 例3:字符串转Arrow,并格式化为其他格式的字符串
t = arrow.get("2019-12-31 11:30", "YYYY-MM-DD HH:mm")
s3 = t.format('YYYYMMDD')
print(s3) # 20191231

2. Behold

Behold: 强大的代码调试工具

如果你只是使用print进行项目的调试,你会发现在大型项目的时候,这一招根本行不通因为大型项目的数据流动非常复杂,你必须跟踪一个变量的流动才行,这时候你可能会出现每隔几句就写一个print的尴尬情况。这时候Behold就非常有优势了,它具有搜索、筛选、排序功能,而且能跨模块地展示数据流向。

建议阅读官方例子: https://behold.readthedocs.io/en/latest/ref/behold.html

3. Black

black:使用严格的规则格式化Python代码

black是一个毫不妥协的格式化工具,它检测到不符合规范的代码风格直接给你全部格式化了,不需要你自己确定,非常适合代码风格紊乱的人群进行自我纠正,使用也非常简单, CMD/Terminal安装black:

pip install black

然后同样,CMD/Terminal进入到你的Python文件的文件夹里,输入:

black 你的文件名.py

即可格式化该文件里的代码

4. Bottle

Bottle:轻量级网站/api开发工具

当你想要构建一个快速的RESTful API或者使用web框架的基本框架来构建一个应用程序时,Bottle完全就够用了。路由、模板、请求和响应、支持许多种请求协议,甚至如websockets之类的高级功能都支持。同样,启动所需的工作量也很小,而且当需要更高级的功能时,Bottle可以很好地扩展,非常优秀

5. Click

Click: 让你快速地为Python应用程序构建命令行界面

在没有用click之前,我们是如何获取用户输入的? 是用 val = input(xxx) 这样的形式吧?虽然也非常简单,但是当你想要给它设定默认值的时候就麻烦了然而click可以让你消去这样的烦恼:

import click
@click.option('--count', default=1, help='Number of greetings')
@click.option('--name', prompt='您的名字是', help='用户的名称')

我的天,简直是上天给予Python程序员的礼物啊。更多的功能请阅读官方文档,比如它还能设定输入参数:

import click

@click.command()
@click.option('--count', default=1, help='欢迎次数.')
@click.option('--name', prompt='您的名字是', help='用户的名称')
def hello(count, name):
    """欢迎名字为name的用户count次."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
运行结果

6. Nuitka

Nuitka: 将Python编译成C++级的可执行文件。

重点是C++级的应用,速度快!速度快!速度快!尽管Cython也能够把Python编译成C,但是Cython仅仅关注数学和统计应用程序,而Nuitka可以按原样使用任何Python程序编译为C,生成单文件的可执行文件。虽然目前还在早期阶段,但是可以预想到它的未来是多么的辉煌

7. Numba

Numba: 有选择地加速数学计算。

这是我以前梦寐以求的功能,我们知道Numpy通过在Python接口中封装高速的C进行工作,Cython将某些用户选择的类型编译为C,但是我们发现这些东西用起来都不是很顺手,感觉“命运 ” 不是由我掌控的。有了Numba之后,我们可以对函数进行加速你要做的仅仅是在函数上方加一个装饰器,这可真的是非常舒服:

@nb.jit(nopython=True)
def acc(x):

8. Openpyxl

openpyxl: 读取,写入和操作Excel文件。

还记得我们的日历文章吗?我们在那篇文章里就用到了openpyxl这个,实质上,用于操作Excel的不止有这个可以做到,但是它有一些独特的功能,比如,写成最新的文件格式xlsx,而且它对文件大小是没有限制的,就这两个功能已经完爆xlwt了。当然,它在速度上是比不过xlwt的,这就需要各位权衡使用了

9. Peewee

peewee: 支持sqlite, Mysql及PostgreSQL的小型ORM(方便写数据的)。

这是我在python上接触的第一个ORM,不是所有人都喜欢用这个玩意儿,但是对于那些不喜欢接触SQL语句开发的人来说,这玩意儿简直是宝物啊。peewee非常易于构建、连接、操作数据库,然后内置了许多的查询操作功能。不过需要注意的是,peewee 3.x 并不完全向旧版本兼容。

10. PyFilesystem

PyFilesystem: 简化了文件、目录的处理方法,支持任何文件系统的操作,大幅度提高编程效率。

你的开发过程中,有没有为这样的事情忧愁过:打开一个不存在文件夹里的文件(新建),确定某个目录里是否存在某个文件,确定是否存在某个目录,当然如果你非常熟练os和io模块,你会觉得这些事情简直是so easy. 但是对于一些不熟悉这两个模块的语句的同学,这可得Google一下。幸好,现在有了PyFilesystem, 我们的编程生活能够快乐许多。它能支持任何文件系统的操作,而且提供了许多实用的函数,比如说查看当前目录下的文件:

from fs import open_fs
my_fs = open_fs('.')
print(my_fs.listdir('/')) 

显示目录结构树

from fs import open_fs
my_fs = open_fs('.')
my_fs.tree()

当然还有更多的功能,请阅读官方文档


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python的3个主要缺点及其解决方案

Python问世至今已经三十年左右了,但其仅在过去几年人气迅速飙升超过了除java和C以外的其他语言。总的来说,Python已经成为教学、学习编程和软件开发的优秀起点,而且其可以成为任何技术栈中有价值的一部分。

不幸的是,这样的流行程度也会暴露Python的缺点,最显著且众所周知的缺点是这三个:运算性能、打包及可执行程序的生成、项目管理虽然这三个缺点都不是非常致命,但是和其他处于上升通道的语言如Julia、Nim、Rust和Go相比,Python的劣势将越来越明显。

下面给大家讲讲Python程序员面临的这三个缺点,以及Python与其第三方工具开发人员提出的解决这些缺点的方法。

缺点一:Python 多线程和速度

Python 整体性能缓慢,有限的线程和多处理能力是其未来发展的主要障碍。

Python长期以来一直重视编程的易用性而不是运行时的速度。当通过使用C或C++编写的高速外部(如Numpy和Numba)在Python中完成如此多的性能密集型任务时,你会发现Python重视编程的易用性也是一种不错的选择。但是尽管如此,Python的开箱即用的性能速度依然落后于其他语言,比如说具有同样简单语法的Nim和Julia,却可以被编译为机器代码,具有更高的性能优势。

Python无法全面利用多核处理器是其长久以来的问题,它确实具有线程功能,但它的线程功能是局限于单个核心的。虽然Python可以使用多进程,但是调度和同步这些子进程的结果并不总是有效的

解决方案

目前没有单一,自上而下的整体解决方案来解决Python的性能问题,不过我们有一系列加速Python的举措。比如说:

  1. 使用PyPy解释器替代官方解释器,PyPy能够将Python代码编译成机器代码,它在仅仅使用Python自带的模块的代码中效果最好,不过现在也可以适用于如numpy这样的流行的,但是其始终只适合于长期运行的服务,而不是能打包带走的应用程序。
  2. Cython,Cython能将Python+C混合编码的.pyx脚本转化为C代码。该项目最初是为科学和数值计算而设计的,但它可以在大多数情况下使用。
  3. Numba,Numba和Cython类似,主要用于科学计算。
  4. Mypyc,是现在仍在开发的项目,它会将用mypyc类型装饰器装饰的代码转化为C.
  5. 优化的Python发行版,比如英特尔针对特殊的处理器和其特殊的数学运算所开发的专门编译版本。不过尽管它能够显著加快部分运算速度,但不能加快整体的运算速度。

如果你是高手,你还能尝试摆脱一下GIL(全局解释器锁),之所以Python的多线程是假的,就是因为GIL的存在:它用来保证Python同时只能有一个线程运行。因此从理论上来讲,如果你摆脱了GIL,就能进行多线程运算,可以提高性能。

还有一个正在进行的项目能够解决许多速度提升的问题,即重构Python内部C接口的实现,一个不混乱的接口可以使得许多性能的改进成为可能。

缺点二:Python 打包和可执行文件

即使在Python诞生30年后,Python依然没有很好的方法来生成可执行文件(exe程序等)我们只能通过第三方工具解决。而且用起来比较麻烦。

解决方案

  1. pyinstaller 可以打包使用许多如numpy这样的,但是它必须和这些保持版本一致,这可太难受了。而且它生成的程序比较大,因为把import语句里所有的内容都封装在一起了。
  2. 还有种方法也是正在研究中,那就是PyOxidizer项目使用Rust语言生成嵌入Python的二进制文件,不过距离成为真正的解决方案还有一段发展路程要走。

缺点三:Python 包管理、项目管理

当你想将一个本地比较复杂的Python工程移植到服务器上的时候,你就知道Python项目管理是有多蛋疼了你需要不断地安装项目依赖,依赖的依赖可能还有依赖,就像俄罗斯俄罗斯套娃一样,恨不得直接把键盘吃了。

解决方案

  1. 这种问题,当然需要Python的开发团队出手了,需要他们提供一套优雅的迁移工具
  2. 不过他们已经朝这个方向前进几步了, 根据PEP 518,Python的构建依赖项被合并为pyproject.toml文件格式(取代了setup.py, requirements.txt, setup.cfg, MANIFEST.in 以及最新加入的Pipfile)
  3. 当然也不是没有办法,使用poetry依赖管理工具,它能够很方便地将你所需要的依赖打包在一起。

文章到此就结束啦!如果你看完后觉得有收获,记得点一下在看,让更多小伙伴看到这篇文章吧!如果你有其他的小问题,可以在下方窗口留言哦​!

​Python实用宝典 (pythondict.com)

不只是一个宝典

欢迎关注公众号:Python实用宝典