读懂一个 Demo就能入门机器学习?

作者: 东泽 EuryChen 

来源: 东泽聊技术

读懂一个 Demo就能入门机器学习?我们总有一种感觉,机器学习门槛高、难入门。这是因为这里有太多晦涩的概念「神经网络」、「评估指标」、「优化算法」等让初学者老是有种盲人摸象的感觉。甚至连理解一个 Tensorflow 官方 Demo 都感觉吃力,因此不少开发者就有过「机器学习从入门到放弃」的经历。本文站在全局视角,通过分析一个 TensorFlow 官方的 Demo 来达到俯瞰一个「机器学习」系统的效果,从而让读者看清这个头大象的全貌,帮助初学者入门「机器学习」。

理解机器学习

「机器学习」的目的就是利用已有答案来寻找规则,从而做出预测。

  • 「传统系统」的目标是获得答案
  • 「机器学习」的目标是利用已有答案获得规则

读懂一个 Demo就能入门机器学习?

正是因为「机器学习」的目标是获得规则,人们便可以拿它来做各种预测:股票走势、彩票号码、服饰推荐、甚至预测员工何时离职。图片识别本质上也是找到规则。比如要识别一张图片物体是否有一只猫咪,那么胡须、耳朵、绒毛等都可以作为猫咪的特征值,而定义特征值就是在定义成为一只猫的组成规则。

详解一个机器学习 Demo

学习一项技能最好方法就是去使用它。这部分我们来看一个 TensorFlow Demo。TensorFlow 是 Google 推出的深度学习框架,基本信息我就不多做介绍了。我要介绍的是如何读懂这个 Demo。你可能会问,一个 Demo 有那么难懂么?对于「机器学习」的初学者来说,如若不懂「神经网络」、「损失函数」、「评估指标」等概念,还真是挺难读懂一个 Demo 的。

看下这个 Demo,代码不多,我全部贴出来了。读懂一个 Demo就能入门机器学习?看到这部分代码的全貌,什么感觉?我第一次读到的感觉是:「语法都能看懂,但就是不知道你这是要干啥!」如果你也有这样的感觉,那么我建议你认真把这篇文章读完。这个 Demo 实际上是要训练一个可以识别手写数字的模型(Model), 要识别的手写数字长这样:读懂一个 Demo就能入门机器学习?你也许一下子会有很多问号。手写数字?图片在哪?怎么识别?别急,下面我来为大家详解这个 Demo。

数据准备

人工智能领域中的数据是什么?我们从 TensorFlow 这个框架的名字中就能看出来 — Tensor(张量)形成的 Flow(流)。在「人工智能」领域,绝大部分数据都是以 Tensor 的形式存在,而 Tensor 可以直接理解成多维数组。读懂一个 Demo就能入门机器学习?

举个例子: 要把一张图片输入到人工智能模型中。我们第一反应是要先把图片数字化,用 Base64 来表示这张图、或者用二进制等等。但是对于人工智能系统,最佳方式是把图片转换成 Tensor。我们试试用 Tensor 来表示一张 像素 3*3 、背景为白色、对角线为黑色的图片:

读懂一个 Demo就能入门机器学习?读懂一个 Demo就能入门机器学习?运行代码之后,我们就得到了那张对角线是黑色的 3*3 图片。这就是用一个四阶 Tensor 表示一张图片,Tensor 形状为 (1, 3, 3) 。同理如果要表示 6000 张 28*28 的图片,那么 Tensor 的形状就是  (6000, 28, 28)

现在我们阅读第一部分的代码:读懂一个 Demo就能入门机器学习?「MNIST」(Mixed National Institute of Standards and Technology database) 是美国国家标准与技术研究院收集整理的大型手写数字数据库,包含 60,000 个示例的训练集以及 10,000 个示例的测试集,里面的图片长这样。读懂一个 Demo就能入门机器学习?这些图片都是通过空间的矩阵的方式存储的:读懂一个 Demo就能入门机器学习?

这样我们就明白这段代码的意思了,是从 mnist 中获取用于训练的的数据集集( x_trian,y_train ),以及用于测试的数据集( x_test,y_test )。

  • x_trian 形状为 (6000, 28, 28) ,表示 6000 张 28*28的图片。
  • y_trian 形状为 (6000,),表示 x_train 对应的数字答案。

模型(model)是什么

得到了数据集之后,是不是可以开始训模型了?别急,我们要搞清楚模型是什么,Tensorflow 文档是这样定义模型:

读懂一个 Demo就能入门机器学习?在机器学习中,模型( Model )是一个具有可学习参数的函数,它将输入映射到输出。最优参数是通过在数据上训练模型获得的。一个训练有素的模型将提供从输入到所需输出的精确映射。

我来帮你们翻译一下这个定义:模型是个函数,这里面内置了很多参数,这些参数的值会直接影响模型的输出结果。有意思的是这些参数都是可学习的,它们可以根据训练数据的来进行调整来达到一组最优值,使得模型的输出效果最理想。

  • 那么模型里参数又是什么?
  • Demo 当中模型传入的 4 个Layer 又是什么含义?

读懂一个 Demo就能入门机器学习?

  • 模型又是如何训练的?

想要知道这些问题答案,那么:「先生小姐,泳泳健身,呃不。神经网络,了解一下」

神经网络 ( Neural Network )

神经网络 ( Neural Network )顾名思义,就是用神经元 ( Neuron )连接而成的网络( Network )。那么什么是神经元?

读懂一个 Demo就能入门机器学习?机器学习中的神经元( Neuron ) 源于生物神经网络 — 通过电位变化表示“兴奋”的生物神经元。在机器学习领域,一个神经元其实是一个计算单元。它需要被输入N 个信号后开始计算(兴奋),这些信号通过带权重(weights)的连接传递给了神经元,神经元通过加权求和,计算出一个值。然后这个值会通过激活函数( activation function )的处理,产生输出,通常是被压缩在 0~1 之间的数字。

读懂一个 Demo就能入门机器学习?

Demo 当中,第一个 Layer 就是把就是把 28*28 的图片展开成一个包含 784 个神经元一维数组。

...
# 第一个 Layer
# 神经元展开成一维数组
tf.keras.layers
.Flatten(input_shape=(28, 28)),
...

读懂一个 Demo就能入门机器学习?

第二个 Layer:

...
tf.keras.layers
.Dense(128, activation='relu'),
...

Layer2 传入了参数 activation='relu',意思是用 relu 作为激活函数 。我们先来理解下什么是「激活函数」,

读懂一个 Demo就能入门机器学习?当我们的大脑同时接收到大量信息时,它会努力理解并将信息分为 「有用 」和 「不那么有用 」的信息。在神经网络的情况下,我们需要一个类似的机制来将输入的信息分为 「有用 」或 「不太有用」。这对机器学习很重要,因为不是所有的信息都是同样有用的,有些信息只是噪音。这就是激活函数的作用,激活函数帮助网络使用重要的信息,抑制不相关的数据点。

例如 Demo 中,Layer1 输出 784 个神经元,并不是全部激活的。而只有激活神经元才能对 Layer2 产生刺激,而 layer4 输出10个神经元,其中第 2 个神经元激活,表示识别结果为 1 的概率是 99%。读懂一个 Demo就能入门机器学习?

所以 relu 是激活函数的一种,用于神经元的激活 — 根据上一个 Layer 给予的刺激算出神经元最后输出(显示)的那个数字。Layer2 层有 128个神经元,这128个神经元会和 Layer1 中 728 个神经元相互连接,共将产生 728 * 128 =93184 权重(weights)各自不同的连接 。Layer1 中神经元的输出将与连接到 layer2 的权重值进行加权求和,得到的结果会被带入 relu 函数,最终输出一个新的值作为 Layer2 中神经元的输出。

读懂一个 Demo就能入门机器学习?

第三个 Layer

...
  tf.keras.layers.Dropout(0.2),

Dropout layer 的主要作用就是防止过度拟合。过渡拟合现象主要表现是:最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。Dropout 解决过度拟合的办法之一,就是随机丢弃一部神经元。Demo 当中就是使用 Dropout 随机丢弃 20% 神经元。读懂一个 Demo就能入门机器学习?

第四个 Layer

...
tf.keras.layers
.Dense(10, activation='softmax')
...

Layer4 上有 10 个神经元,并使用 softmax作为激活函数,这 10个神经元的输出就是最终结的结果。下图为识别一个手写数字 1 的整个过程,各层神经元逐层激活,最终输出预测结果。读懂一个 Demo就能入门机器学习?

到这里,我们通过了解 4 个Layer之间的作用关系简单的了解了一个神经网络的运作方式。

模型训练补充

读懂一个 Demo就能入门机器学习?要读懂这段代码,我们要先通过一个类比来理解下什么是: 损失函数( Loss Function )优化算法( Optimization Algorithms )评价指标( Evaluation Metrics )假如一名男士要开始锻炼身体,目标是胸围达到 120cm,且身材看起来匀称(别太壮):

  • 经过反复训练,他的胸围达到了 110cm,那么我们可以把Loss = |目标(120cm)- 当前(110cm)|作为一个最简单的损失函数(Loss Function)。而 Demo 中的 Loss Function 用的是 – 稀疏类别交叉熵(sparse_categorical_crossentropy),这个算法的特点就是擅长分类。
  • 是否达成目标,不能仅仅使用损失函数来判断。身材匀称、美观也很重要,而评价指标(Evaluation Metrics )的作用就给我们提供了一个评判标准。
  • 接下来我们就要寻找产生 Loss 的规律,Loss 不仅仅是胸围小于 120cm 的损失,胸围大于 120cm 而导致美感损失也是 Loss 的一部分。因此想达到最佳效果,既不能运动量不足也不能用力过猛,要找到一个平衡力量和美感的中间值。我们给予训练要素不同的权重( Weights ),蛋白质补充权重为w0、胸肌上沿训练强度w1、胸肌中部训练强度w2、胸肌下沿训练强度w3、有氧运动训练强度w4 等等。最后得到一个权重的一维数组 [w1, w2…wn] 。像这样,通过不断调整 [w1, w2…wn] 得出最优输出的方法,就是优化算法( Optimization Algorithms )。

了神经网络的模型、层、权重、优化算法、损失函数以及评估指标等之后,我们就可以读懂 Demo 中那段代码了。现在尝试画一张神经网络的工作流程图,串一串一个神经网络的工作流程。读懂一个 Demo就能入门机器学习?

训练与测试

读懂一个 Demo就能入门机器学习?这部分很好理解,带入数据训练、测试就好。说一下 epochs 。在神经网络领域,一个 epoch 是指整个训练数据集的训练一个周期。1 epoch = 1正向传播( forward pass )+ 1 反向传播( backward pass )(我们可以简单的理解,正向传播目的是为了获得预测结果,反向传播目的是调整到最优的权重(weights),来让 Loss 最小化。)

Demo 中 epochs = 5 是因为 1次 epoch 很可能得不到最优的权重(weights)。既然 1 次不能满足,那就 5 次,5 次还不满足就 10 次,直到效果最小化 Loss 的效果不再变化。

读懂一个 Demo就能入门机器学习?


总结

如果认真阅读了本文,那么我相信你已经对人工智能已经有了一点整体的认识,本文给了你一个鸟瞰人工智能的视角,摆脱了盲人摸象的感觉。这虽然不是魔法,能立刻把你变成人工智能大神,但对基本架构的进一步理解会增强你对人工智能的自学能力。无论你是从事前端、后端、全栈等技术开发者,或者只是对人工智能感兴趣,我都希望本文可以带给你一个新的视角去理解人工智能,让你读有所思,思有所得,得有所想,想有所获,获有所益。
如果你在阅读之后认为本文对你有帮助,请点击右下角「在看」,不胜感谢。

·END·

转自:https://mp.weixin.qq.com/s/2ZTiEAunrYks5SlDm-o1NA

Python 黑魔法手册

《Python 黑魔法手册》里这样的例子总共有 50 个,目前手册是 1.0 版本,我会在不断更新完善中…

我将这本书放到 Github 上:https://github.com/iswbm/magic-python

你也可以在这个链接上在线阅读:https://github.com/iswbm/magic-python/blob/master/Python%20%E9%BB%91%E9%AD%94%E6%B3%95%E6%8C%87%E5%8D%97%20v1.0.pdf

转自:https://mp.weixin.qq.com/s/PoYqeOb49R3Kgx-NYuXoRw

详尽实用的 PyCharm 教程

来源:Python猫

本文假设读者熟悉 Python 开发,且计算机中已安装某个版本的 Python。该教程将使用 Python 3.6 版本,屏幕截图和 demo 均来自 macOS 系统。由于 PyCharm 可在所有主流平台上运行,读者在其他系统中会看到略微不同的 UI 元素,可能需要调整某些命令。

1. PyCharm 的安装

本文将使用 PyCharm Community Edition 2019.1 版本,该版本免费且可在所有主流平台上使用。只有最后一部分「PyCharm Professional 功能」使用的是 PyCharm Professional Edition 2019.1 版本。

推荐使用 JetBrains Toolbox App 安装 PyCharm。使用该 App,你可以安装不同的 JetBrains 产品或者同一产品的不同版本,并在必要的情况下更新、回滚和轻松删除任意工具。你还可以在恰当的 IDE 及版本中快速打开任意项目。

Toolbox App 安装指南,参见 JetBrains 官方文档:https://www.jetbrains.com/help/pycharm/installation-guide.html#toolbox。

该 App 会根据你的操作系统提供合适的安装说明。如果它无法无法准确识别系统,你可以在右上角的下拉列表中找到合适的系统。

详尽实用的 PyCharm 教程,这篇文章值得一看

安装成功后,启动该 app 并接受用户协议。在 Tools 选项下,你可以看到一个可用产品列表。从中找到 PyCharm Community,并点击 Install。

好啦,现在你的机器上已经安装 PyCharm 了。如果不想使用 Toolbox app,你可以单独安装 PyCharm。

启动 PyCharm,你将看到导入设置弹窗。PyCharm 会自动检测出这是首次安装,并为你选择「Do not import settings」选项。点击 OK,之后 PyCharm 会让你选择键盘映射(keymap scheme)。保留默认设置,点击右下角的「Next: UI Themes」:

详尽实用的 PyCharm 教程,这篇文章值得一看

PyCharm 将询问选择深色模式 Darcula 还是浅色模式。你可以选择自己喜欢的模式,并点击「Next: Launcher Script」:

详尽实用的 PyCharm 教程,这篇文章值得一看

本教程将使用深色模式 Darcula。

在下一个页面上,直接保留默认设置,并点击「Next: Featured plugins」,这时 PyCharm 将展示可用插件列表。点击「Start using PyCharm」,现在你可以写代码了!

2. 编写代码

在 PyCharm 中,你可以在「项目」中执行任意操作。因此,首先你需要创建一个项目。

安装和打开 PyCharm 后,你会看到欢迎页面。点击「Create New Project」,出现「New Project」弹窗:

详尽实用的 PyCharm 教程,这篇文章值得一看

指定项目位置,打开 Project Interpreter 列表,选择创建新的项目解释器或者使用已有的解释器。选择「New environment using」,打开其右方的下拉列表,选择 Virtualenv、Pipenv 或 Conda。这些工具可以为不同项目单独创建 Python 环境,从而分别保存不同项目所需的依赖项。

你可以选择其中任意一个,本教程使用的是 Virtualenv。选择后,指定环境位置,从 Python 解释器列表中选择要安装在系统中的 base interpreter。通常,保持默认设置即可。下面有两个可选框:在新环境中继承全局包环境、令当前环境可以用其它所有项目,两个都不要选。

点击右下角的「Create」,创建新项目:

详尽实用的 PyCharm 教程,这篇文章值得一看

屏幕上出现「Tip of the Day」弹窗,在每次启动时 PyCharm 通过该弹窗提供 trick。关掉该弹窗。

现在我们可以开始新的 Python 程序了。如果你使用的是 Mac 系统,使用 Cmd+N 键;如果你使用的是 Windows 或 Linux 系统,使用 Alt+Ins 键。然后选择 Python File。你也可以在菜单中选择 File → New。将新文件命名为 guess_game.py 并点击 OK。你将看到如下 PyCharm 窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

至于测试代码,我们来快速写一个简单的猜谜游戏,即程序选择一个数字让用户来猜,在每一次猜测时,程序将告诉用户他猜的数字比神秘数字大还是小,用户猜中数字时游戏结束。以下是该游戏的代码:

详尽实用的 PyCharm 教程,这篇文章值得一看

直接键入上述代码,而不是复制粘贴。你会看到如下画面:

详尽实用的 PyCharm 教程,这篇文章值得一看

如上图所示,PyCharm 提供 Intelligent Coding Assistance 功能,可以执行代码补全、代码检查、错误高亮显示和快速修复建议。比如键入 main 并点击 tab 键,PyCharm 会自动补全整个 main 从句。

此外,如果你在条件句前忘记键入 if,在该句子最后增添.if 并点击 Tab 键,PyCharm 将修复该 if 条件句。该用法同样适用于 True.while。这即是 PyCharm 的 Postfix Completion 功能,它可以帮助用户减少退格键使用次数。

3. 如何运行代码

现在你已经编码完成该游戏,可以运行了。

该游戏程序有三种运行方式:

  1. 在 Mac 系统中使用快捷键 Ctrl+Shift+R,在 Windows 或 Linux 系统中,使用快捷键 Ctrl+Shift+F10。

  2. 右键单击背景,从菜单中选择「Run 『guess_game』」。

  3. 由于该程序具备main__ 从句,你可以点击__main 从句左侧的绿色小箭头,选择「Run 『guess_game』」。

使用以上任一方式运行该程序,窗口底部会出现终端面板(Terminal pane),显示你的代码输出结果:

详尽实用的 PyCharm 教程,这篇文章值得一看

你可以玩一下这个游戏,看看自己能否猜中数字。(专业建议:从 50 开始猜。)

4. 进行代码的调试

找到神秘数字了吗?如果找到了,你可能会看到一些奇怪的东西:程序没有打印出祝贺信息和显示退出按钮,而是重新开始了。这就是 bug 所在。要想发现程序重新开始的原因,你需要 debug。

首先,点击第 8 行代码左侧的空白区域,设置断点:

详尽实用的 PyCharm 教程,这篇文章值得一看

断点即程序运行到这一行时会自动停止,你可以探索断点处之后的代码有什么错误。接下来,从以下三种方式中选择一种开始 debug:

  1. 在 Mac 系统中使用 Ctrl+Shift+D 键,在 Windows 或 Linux 系统中使用 Shift+Alt+F9 键。

  2. 右键单击背景,选择「Debug 『guess_game』」。

  3. 点击main从句左侧的绿色小箭头,选择「Debug 『guess_game』」。

之后,你将看到底部出现 Debug 窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

按照下列步骤执行程序 debug:

  1. 注意当前行被蓝色高亮显示。

  2. Debug 窗口显示 random_int 及其值。记录该数字。(上图中该数字为 85。)

  3. 点击 F8 执行当前代码行,并执行到下一行代码。如有必要,你也可以使用 F7 跳转到当前行内的函数。随着你继续执行语句,变量的变化将自动呈现在 Debugger 窗口。

  4. 注意 Debugger 标签右侧有一个 Console 标签。Console 标签和 Debugger 标签相互独立。你可以在 Console 中与程序进行交互,在 Debugger 中执行 debug 动作。

  5. 转向 Console 标签,进入猜测过程。

  6. 键入左侧 Debugger 标签中显示的数字,点击 Enter 键。

  7. 转回 Debugger 标签。

  8. 再次点击 F8,计算 if 语句。注意现在你在第 14 行。为什么不是第 11 行呢?因为第 10 行的 if 语句被计算为 False。那么为什么当你键入数字后它算出来为 False 了呢?

  9. 仔细看第 10 行,注意我们在对比 user_guess 和一个错误的项。我们应该对比用户猜测的数字和 random_int,但此处我们对比的是 randint(从 random 包导入的函数)。

  10. 将 randint 更改为 random_int,按照同样的步骤重新开始 debug。你会发现,这一次到达的是第 11 行,第 10 行算出来为 True:

恭喜你,bug 被修复了!

5. 进行代码测试

不经单元测试的应用都不可靠。PyCharm 可以帮助你快速舒适地写单元测试并运行。默认情况下,unittest 被用作测试运行器,而 PyCharm 还支持其他测试框架,如 pytest、nose、doctest、tox 和 trial。例如,你可以按照以下步骤为项目选择 pytest 测试运行器:

  1. 打开 Settings/Preferences → Tools → Python Integrated Tools 设置对话框。

  2. 在默认测试运行器字段中选择 pytest。

  3. 点击 OK 保存该设置。

本教程的示例将使用默认测试运行器 unittest。

在同一个项目中,创建文件 calculator.py,并将以下 Calculator 类放入该文件:

详尽实用的 PyCharm 教程,这篇文章值得一看

PyCharm 使得为已有代码创建测试变得轻而易举。打开 calculator.py 文件,执行以下步骤中的任意一个:

  • 在 Mac 系统中使用 Shift+Cmd+T 键,在 Windows 或 Linux 系统中使用 Ctrl+Shift+T。

  • 右键单击该类的背景,选择「Go To and Test」。

  • 在主菜单中吗,选择 Navigate → Test。

选择「Create New Test…」,得到以下窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

Target directory、Test file name 和 Test class name 这三项均保留默认设置。选中上图中两种需要测试的方法并点击 OK。好了!PyCharm 自动创建文件 test_calculator.py,并在其中创建了以下 stub test:

详尽实用的 PyCharm 教程,这篇文章值得一看

使用以下方法中的任意一个运行测试:

  • 在 Mac 系统中使用 Ctrl+R 键,在 Windows 或 Linux 系统中使用 Shift+F10 键。

  • 右键单击背景,选择「Run 『Unittests for test_calculator.py』」。

  • 点击测试类名称左侧的绿色小箭头,选择「Run 『Unittests for test_calculator.py』」。

你将看到底部出现测试窗口,所有测试均失败:

详尽实用的 PyCharm 教程,这篇文章值得一看

注意,左侧是测试结果的层次结构,右侧是终端的输出。现在,将代码更改成以下代码,实现 test_add:

详尽实用的 PyCharm 教程,这篇文章值得一看

重新运行测试,你会看到一个测试通过了,另一个则失败。按照如下操作探索不同选项,来展示已通过测试和被忽略测试,按照字母顺序对测试进行排序,以及按照时长对测试进行排序:

详尽实用的 PyCharm 教程,这篇文章值得一看

注意,上图中的 sleep(0.1) 方法的作用是使其中一个测试变慢,以便按时长对测试进行排序。

6. 编辑已有项目

单文件项目非常适合作为示例,但你通常需要处理较大的项目。这部分将介绍如何使用 PyCharm 处理较大项目。

为了探索 PyCharm 以项目为中心的特征,你将使用 Alcazar web 框架(该框架用于学习目的)。在本地复制该 repo(地址:https://realpython.com/optins/view/alcazar-web-framework/)。

当你在本地已有项目时,使用以下方法中的任意一个在 PyCharm 中打开项目:

  • 在主菜单中点击 File → Open。

  • 在欢迎页面点击 Open。

之后,在计算机中找到包含该项目的文件夹,并打开。

如果该项目包含虚拟环境,PyCharm 将自动使用该虚拟环境,并将它作为项目解释器。

如果你需要配置不同的虚拟环境 virtualenv,在 Mac 上打开 Preferences,或在 Windows 或 Linux 系统中使用 Ctrl+Alt+S 打开 Settings,找到 Project: ProjectName。打开下拉列表,选择 Project Interpreter:

从下拉列表中选择 virtualenv。如果没有要选择的项,则点击下拉列表右方的设置按钮选择 Add…。其余步骤和创建新项目的步骤相同。

7. 使用搜索和导航

在大项目中,我们很难记住每个事物的位置,因此快速导航和搜索非常重要。PyCharm 可以提供这些功能。接下来,我们使用上一节中打开的项目,实践以下快捷键:

  • 在当前文件中搜索代码段:在 Mac 系统中使用 Cmd+F 键,在 Windows 或 Linux 系统中使用 Ctrl+F 键。

  • 在整个项目中搜索代码段:在 Mac 系统中使用 Cmd+Shift+F 键,在 Windows 或 Linux 系统中使用 Ctrl+Shift+F 键。

  • 搜索类:在 Mac 系统中使用 Cmd+O 键,在 Windows 或 Linux 系统中使用 Ctrl+N 键。

  • 搜索文件:在 Mac 系统中使用 Cmd+Shift+O 键,在 Windows 或 Linux 系统中使用 Ctrl+Shift+N 键。

  • 如果你不知道要搜索的是文件、类还是代码段,则搜索全部:按两次 Shift 键。

导航可使用以下快捷键:

  • 前往变量的声明:在 Mac 系统中使用 Cmd 键,在 Windows 或 Linux 系统中使用 Ctrl 键,然后单击变量。

  • 寻找类、方法或文件的用法:使用 Alt+F7 键。

  • 查看近期更改:使用 Shift+Alt+C 键,或者在主菜单中点击 View → Recent Changes。

  • 查看近期文件:在 Mac 系统中使用 Cmd+E 键,在 Windows 或 Linux 系统中使用 Ctrl+E 键,或者在主菜单中点击 View → Recent Files。

  • 多次跳转后在导航历史中前进和后退:在 Mac 系统中使用 Cmd+[ / Cmd+] 键,在 Windows 或 Linux 系统中使用 Ctrl+Alt+Left / Ctrl+Alt+Right 键。

更多细节,参见官方文档:https://www.jetbrains.com/help/pycharm/tutorial-exploring-navigation-and-search.html。

PyCharm 中的版本控制

版本控制系统(如 Git 和 Mercurial)是现代软件开发世界中最重要的工具之一。因此,IDE 必须支持版本控制。PyCharm 在这方面做得很好,它集成了大量流行的版本控制系统,如 Git(和 Github (https://github.com/))、Mercurial、Perforce 和 Subversion。

注:以下示例中使用的版本控制系统为 Git。

8. 配置版本控制系统(VCS)

要想实现 VCS 集成,你需要在顶部菜单点击 VCS → VCS Operations Popup…,或者在 Mac 系统中使用 Ctrl+V 键,在 Windows 或 Linux 系统中使用 Alt+` 键。选择 Enable Version Control Integration…,你将看到以下窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

从下拉列表中选择 Git,点击 OK,这样你就为项目设置好了 VCS。(注意,如果你打开的已有项目已经具备版本控制系统,PyCharm 将会发现并自动使用该版本控制系统。)

这时如果你前往 VCS Operations Popup…,你会发现一个不同的弹窗,它具备选项 git add、git stash、git branch、git commit、git push 等等:

详尽实用的 PyCharm 教程,这篇文章值得一看

如果你找不到所需要的选项,你可以在顶部菜单中点击 VCS,选择 Git,在这里你可以创建和查看 pull request。

提交和冲突处理

这是 PyCharm 中 VCS 集成的两大特征,我个人经常使用并且非常喜欢。假如你完成了工作,打算提交,前往 VCS → VCS Operations Popup… → Commit…,或者在 Mac 系统中使用 Cmd+K 键,在 Windows 或 Linux 系统中使用 Ctrl+K 键。你将看到如下窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

在该窗口中,你可以:

  • 选择要提交的文件

  • 写下提交信息

  • 在提交前执行各项检查

  • 查看更改

  • 点击右下角 Commit 按钮旁边的箭头,选择 Commit and Push…,从而一次性完成提交和 push。

是不是感觉很神奇很迅速?特别是如果你以前经常通过命令行手动执行这些任务时。

团队合作中会出现合并冲突(merge conflict)。当一个人对你正在处理的文件提交更改时,你们二人更改了同一行导致更改重叠,这时 VCS 无法决定选择你的更改还是队友的更改。那么你可以使用以下箭头和符号来解决这个问题:

详尽实用的 PyCharm 教程,这篇文章值得一看

看起来很奇怪,我们很难分辨应该删除哪些更改、保留哪些更改。不要怕,PyCharm 来了!它可以用更好、更简洁的方法解决冲突。在顶部菜单中前往 VCS,选择 Git,然后选择 Resolve conflicts…。选择存在冲突的文件,点击 Merge,出现以下窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

在左侧列中,你可以查看自己做的更改。在右侧列中,可以查看队友做的更改。而中间列则显示结果。存在冲突的代码行被高亮显示,你可以在它们旁边看到 X 和 >>/<<。点击箭头表示接受更改,点击 X 则表示拒绝更改。解决所有冲突后,点击 Apply 按钮:

详尽实用的 PyCharm 教程,这篇文章值得一看

在上图中,对于第一个冲突行,作者选择拒绝自己的更改,接受队友的更改。而在第二个冲突行中,作者接受了自己的更改,拒绝了队友的更改。

使用 PyCharm 中的 VCS 集成还可以执行很多操作。详情参见 https://www.jetbrains.com/help/pycharm/version-control-integration.html。

9. 使用插件和外部工具

在 PyCharm 中你可以找到开发所需的几乎所有功能。如果没找到,那么很可能存在一个插件,向 PyCharm 提供你需要的功能。例如,它们可以:

  • 添加多语言和多框架支持

  • 使用快捷键提示(shortcut hint)、文件监视器(file watcher)等提升你的生产效率

  • 利用代码练习,帮助你学习新的编程语言

例如,IdeaVim 插件向 PyCharm 添加 Vim 模拟。如果你喜欢 Vim,这个插件可以实现不错的结合。

Material Theme UI 插件可将 PyCharm 的外观改变为 Material Design 的外观:

详尽实用的 PyCharm 教程,这篇文章值得一看

Vue.js 插件使 PyCharm 支持 Vue.js 项目。Markdown 插件使得在 IDE 内可以编辑 Markdown 文件,并实时预览渲染后的 HTML。

在 Mac 系统上点击 Preferences → Plugins,在 Windows 或 Linux 系统中点击 Settings → Plugins,你可以在 Marketplace 标签下找到和安装所有可用插件:

详尽实用的 PyCharm 教程,这篇文章值得一看

如果仍然没找到所需插件,你甚至可以自己开发一个。

如果你找不到合适的插件,又不想自己开发,因为 PyPI 上有可用的包,你可以将这个包作为外部工具添加到 PyCharm。以代码分析器 Flake8 为例。

选 Terminal app 中键入 pip install flake8,从而在虚拟环境中安装 Flake8。或者也可以使用 PyCharm 集成的 Terminal:

详尽实用的 PyCharm 教程,这篇文章值得一看

在 Mac 系统上点击 Preferences → Tools,在 Windows 或 Linux 系统中点击 Settings → Tools,选择 External Tools。然后点击底部 (1) 处的 + 按钮。在弹出的窗口中,输入细节并在两个窗口中点击 OK,如下图所示:

详尽实用的 PyCharm 教程,这篇文章值得一看

上图中,Program (2) 指 Flake8,你可以在虚拟环境文件夹(bin)中找到它。Arguments (3) 表示你想用 Flake8 分析的文件。Working directory 表示项目目录。

你可以把这里所有项的绝对路径写死,但这就意味着你无法在其他项目中使用该外部工具,只能在一个项目中针对一个文件使用该工具。

因此你需要使用 Macros。它是详尽实用的 PyCharm 教程,这篇文章值得一看格式的变量,根据语境而变化。例如,当你编辑 first.py 时,详尽实用的 PyCharm 教程,这篇文章值得一看 为 first.py,当你编辑 second.py 时,详尽实用的 PyCharm 教程,这篇文章值得一看 为 second.py。你可以查看它们的列表,点击 Insert Macro… 按钮将其中一个插入。此处你使用了 macros,它们的值会根据你目前处理的项目而改变,Flake8 将继续准确执行其工作。

要想使用它,你需要创建文件 example.py,并在其中写入以下代码:

详尽实用的 PyCharm 教程,这篇文章值得一看

上述代码故意破坏了 Flake8 的一些规则。右键单击文件背景,选择 External Tools → Flake8。Flake8 分析结果将出现在窗口底部:

详尽实用的 PyCharm 教程,这篇文章值得一看

为了使效果更好,你可以为其添加快捷键。在 Mac 系统中选择 Preferences,在 Windows 或 Linux 系统中选择 Settings。然后,点击 Keymap → External Tools → External Tools。双击 Flake8,选择 Add Keyboard Shortcut,出现以下窗口:

详尽实用的 PyCharm 教程,这篇文章值得一看

上图中,快捷键是 Ctrl+Alt+A(本教程使用该快捷键)。你可以在文本框中添加喜欢的快捷键,然后在两个窗口中点击 OK。然后,你就可以用该快捷键,在 Flake8 的帮助下分析目前在处理的文件了。

10. PyCharm Professional 功能

PyCharm Professional 是 PyCharm 的付费版本,具备更多开箱即用的功能和集成。这部分将概览其主要功能,以及官方文档链接(其中详细介绍了每一项功能)。记住,以下功能在 PyCharm Community 版本中均不可用。

Django 支持

Django 是最流行和最受喜爱的 Python web 框架,PyCharm 对 Django 提供广泛的支持。要确保对 Django 的支持,需要执行以下步骤:

  1. 在 Mac 系统中打开 Preferences,在 Windows 或 Linux 系统中打开 Settings。

  2. 选择 Languages and Frameworks。

  3. 选择 Django。

  4. 检查复选框 Enable Django support。

  5. 应用更改。

现在确保了对 Django 的支持,你在 PyCharm 中的 Django 开发之旅将轻松很多。具体而言在创建项目时,你会得到一个专用的 Django 项目类型。这表示,当你选择该类型时,你将拥有所有必要文件和设置。这等同于使用 django-admin startproject mysite。

你也可以在 PyCharm 内直接运行 manage.py 命令。目前支持的 Django 模板,包括以下一些:

  • 语法和错误高亮显示

  • 代码补全

  • 导航

  • block 名称补全

  • 自定义标签和过滤器补全

  • 标签和过滤器的快速文档

  • 模板 debug 能力

除此之外,我们还可以在其他 Django 部分(如视图、URL 和模型)中执行代码补全、对 Django ORM 提供代码追踪支持(code insight support)、对 Django 模型提供模型依赖项关系图。

更多细节,参见官方文档:https://www.jetbrains.com/help/pycharm/django-support7.html。

11. 数据库支持

现代数据库开发是一个复杂的任务,需要多个支持系统和工作流。这也是 JetBrains 开发独立 IDE DataGrip 的原因。DataGrip 是独立于 PyCharm 的产品,二者的应用场景和授权都不相同。

但幸运的是,通过 Database tools and SQL 插件(该插件默认开启),PyCharm 可以支持 DataGrip 中的所有特性。在该插件的帮助下,你可以查询、创建和管理数据库,不管数据库在本地、服务器,还是在云端。该插件支持 MySQL、PostgreSQL、Microsoft SQL Server、SQLite、MariaDB、Oracle、Apache Cassandra 等。

关于该插件的更多用途,请查看文档:https://www.jetbrains.com/help/pycharm/relational-databases.html。

程并发可视化(Thread Concurrency Visualization)

Django Channels、asyncio 和近期框架(如 Starlette (https://www.starlette.io/))表明异步 Python 编程正逐渐成为趋势。异步编程具备很多好处,但很难写,也很难 debug。在此类案例中,Thread Concurrency Visualization 就是医生,帮助你全面管理多线程应用并进行优化。

更多细节,参见文档:https://www.jetbrains.com/help/pycharm/thread-concurrency-visualization.html。

12. Profiler 性能分析

说到优化,profiling 是另一种代码优化方法。profiling 可以帮助你查看代码的哪一部分占用了最多的执行时间。profiler 运行的优先级如下:

  1. vmprof

  2. yappi

  3. cProfil

如果你没有安装 vmprof 或 yappi,则运行标准 cProfile。更多细节,参见:https://www.jetbrains.com/help/pycharm/profiler.html。

13. 科学模式

Python 不仅是通用和 web 编程语言,由于 NumPy、SciPy、scikit-learn、Matplotlib、Jupyter 等库和工具的加持,Python 成为数据科学和机器学习领域的最优工具。有了这些强大工具,你还需要一个强大的 IDE 来支持这些库所具备的绘图、分析等所有功能。

关于科学模式的更多详情,参见 https://www.jetbrains.com/help/pycharm/matplotlib-support.html。

14. 远程开发

很多应用出现 bug 的一个常见原因是,开发环境和生产环境不同。尽管在大多数情况下,开发时完美复制生产环境并不现实,但力求实现完美复刻是值得追寻的目标。

在 PyCharm 的帮助下,你可以使用另一台计算机(如 Linux VM)上的解释器对应用进行 debug。这样,你就可以拥有与生产环境一样的解释器了,从而避免很多因开发环境和生产环境差异导致的 bug。

详情参见:https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html。

15. 写在最后

PyCharm 是最好的 Python 开发 IDE 之一。它提供大量优势,帮助执行例行任务,从而节约大量时间。学完本教程,现在你知道如何利用 PyCharm 提高生产效率了吗?

 转自:https://mp.weixin.qq.com/s/mGDh1pt8-2jXM-mJ3VDPxg

学编程就像学外语,语言技能比数学技能更重要

说起学习一门新语言,你多半会想到法语、西班牙语或是汉语。但为什么不是Python或Java呢?

 

自然语言和人工语言的学习过程有多相似?相似到超过你想象。

 

华盛顿大学的研究者最近发表了一项研究,显示最能预测一个人对流行的编程语言Python的学习速度的,其实是语言能力和问题求解的技能。

 

这项研究发表在《科学报告》(ScientificReports)杂志上,它采用了行为学测试和对脑部活动的测量,以此观察了被试学习编程的速度及效果究竟与什么因素相关。

 

  语言能力强,学起编程快 

 

学编程就像学外语,语言技能比数学技能更重要

Python更像是另一门自然语言。| Wikimedia Commons

 

研究招募了42名被试,要他们在Codeacademy学一门热门的编程网课——10节45分钟的“学习Python”课。一共有36名被试完成学习,研究者确定了这36人的学习速度和学习效果。

 

在开始网络学习之前,被试先接受了一组测试,以判断他们的数学技能、工作记忆、问题求解以及外语学习能力。

 

在网上的编程课中,研究者追踪了被试的学习速度以及他们对网上软件中内置的测验题的回答情况。被试在学习结束后,还接受了一次测验和编程任务,以评判他们的整体编程知识。

 

记忆、问题求解、数字能力或语言能力,对于被试们学习编程到底有多大影响呢?

 

被试学习Python的速度有快有慢,在学习结束时也显示了不同的编程能力。研究者发现,学生们学习Python的效果,主要和他们的一般认知能力(即问题求解和工作记忆)有关而他们学习Python的速度,则与一般认知能力和语言能力这两个因素有关。

 

在Python的学习速度上,语言能力解释了近20%的个体差异。

 

与之相比,数学能力只能解释学习速度2%的个体差异,和学习效果更是毫无相关性。

 

总之,学习编程更多是依靠语言技能,而非数字技能。 

 

  脑电图提供了更多证据

 

学编程就像学外语,语言技能比数学技能更重要

大脑内部的电流会在头皮上产生电压波动,脑电图就是通过记录这种电模式来测量脑部活动。| pixabay

 

研究里,脑电图数据进一步证明了语言技能的重要性。

 

在开始网上学习任务之前,被试先测了静息状态的脑电图,也就是被试在心情放松无所事事的状态下脑内的电流模式。

 

静息状态的脑电活动包含了不同的模式。其中一种缓慢的脑电波被称为“β振荡”(beta oscillations)。之前的研究显示,静息状态下高强度的β振荡和学习一门外语的能力有关。

 

而这项研究显示,高强度的β振荡和更快的学习速度以及更丰富的编程知识有关

 

虽然这一发现对语言学习和编程学习的联系提供了额外支持,但目前还不清楚β振荡和学习效果有什么关系,还需要进一步研究研究。

 

总的来说,这些结果证明了语言学习技能是编程学习中一个不可或缺的方面(至少对Python的学习是如此),而数学技能对于被试学得多好多快反而没有多少预测作用。

 

  语言技能强的女孩,来学编程吧  

 

这个结论对于围绕编程的种种看法具有重要影响,因为编程常被看作一个“数学密集”的领域。

 

关于程序员存在许多成见,特别是哪些人能成为优秀程序员的问题。女性常常觉得自己不符合“典型”计算机程序员的形象。但是平均而言,女孩一般具有比男孩更高的语言技能。

 

现在这个新研究显示,语言技能可以预测编程学习能力,或许女性未来可以有“擅长编程”的名声了。

 

学编程就像学外语,语言技能比数学技能更重要

语言能力强的女性,应该对学习编程有更强信心 | pexels

 

有些领域确实对数学和编程技能都有要求,但大部分编程工作却不一定来自这些领域。根据目前这项研究,似乎没有必要让每个计算机科学的学生都完成高等数学课程。在数学要求上增加一点弹性,或许有助于招收并留住学生。

 

将语言技能和编程明确地联系在一起、提供无需高等数学的教育选择,这或许能在传授学生他们需要的编程技能之外,增加一点学生的多样性。眼下“训练营”式的编程教育正迅速风行,它引导参与者进入编程行业,而不需要强迫他们学习微积分。

 

随着编程成为许多工作的必备技能,是时候质疑一下那些关于编程先决条件的成见了。从这项新研究的成果出发,大学和个人应该重新思考自己对编程学习的认识、以及学会编程究竟需要哪些能力。有许多人不是所谓的“数学高手”,但他们完全可能成为编程专家。 

 

 

作者:AmyNippert

翻译:红猪

编辑:游识猷

编译来源:Massivesci

 

参考文献

[1] Prat, C. S., Madhyastha, T. M., Mottarella, M. J., & Kuo, C.-H. (2020). Relating Natural Language Aptitude to Individual Differences in Learning Programming Languages. Sci. Rep., 10(3817), 1–10. doi: 10.1038/s41598-020-60661-8

转自:https://mp.weixin.qq.com/s/6qOSranTl5aPfriCubXF0A

完整中文版 | 2019 Python 官方年度报告

每年Python官方都会做一次年度报告,如果你想了解Python的现状、趋势与未来,可以说没有比这份报告更有用的信息了。

 

今年,来自全球150多个国家及地区的24000名Python开发者参与了此次调查。

 

公众号将为大家完整翻译此次报告,希望能够帮助国内的Python爱好者们找到方向与热点,也希望你们能够努力前行!

 

此次报告大概分为如下几个部分:

 

  • Python基本使用情况

  • 使用Python的目的

  • Python版本使用情况

  • Python 框架、库和云技术

  • Python开发工具

  • Python职业发展与就业

 

32张高清大图,带你领略Python的魅力!

 

完整中文版 | 2019 Python 官方年度报告强势来袭!

 

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

完整中文版 | 2019 Python 官方年度报告强势来袭!

转自:https://mp.weixin.qq.com/s/_J8CijrsBZnLXXxpXdDmAA