最近有同学问我怎么入门编程, 我作为一个全粘的菜鸟, 当然是首选Python推荐作为第一门入门语言的. 但翻了几本Python/编程入门书, 无论是Python官方文档(听说吓跑了不少人), 还是大家都推荐的<A Byte of Python>, 或者是动物公司(O'Reilly)的书, 总感觉缺了些什么. 后来回想了下自己的学习过程和以前同学问我的问题, 我发现很多学生缺少的其实是对编程和计算机原理的概览. 这一块在<C Primer Plus>里有提到, 本篇就以这本书中第一章的内容为基础, 脱去C语言的内容做一个编程入门概述.

本文目标群体

  • 打算自学编程的学生

本假设您已经有如下基础:

  • 高中信息课程

您将学会的内容:

  • 如何写一个Python程序

计算机工作基本原理

如果打算学习编程, 我们应该先了解计算机工作原理方面的基础知识, 这有助于我们学习了解编程, 以及程序工作的原理及所编写的内容和实际运行效果之间的关系.

我们从高中课程中已经了解到现代计算机可以分为如下几个部分: CPU, RAM(内存), 永久储存(硬盘), 还有其他外围输入输出设备.

CPU的工作非常简单, 从内存中获取一个指令并执行这个指令, 然后重复这个操作. 对于CPU本身也有不少储存空间用来记录数值(寄存器). (当然CPU内部还有其他工作机制这里不多说明). 对于CPU而言, 其所能过理解并执行的指令是有限的(指令集). 举个简单的例子: 将内存单元移到寄存器, 将一个寄存器的内容加到另一个寄存器上.

当然还得提一点, 这些指令都是有数字组成. 明白了上面这些后, 我们很容易发现, 对于一个功能简单的CPU, 即使是再普遍的加法也变得复杂无比:

  • 将内存地址1的数字复制到寄存器1
  • 将内存地址2的数字复制到寄存器2
  • 将寄存器2的内容复制到寄存器1上
  • 将寄存器1的内容复制到内存地址3

在计算机刚刚发明的时候人们都在用数字来重复表示这些内容, 后来发明了汇编语言来简化这一步骤, 到现代人们将其更抽象化, 演变出了易于人们阅读逻辑, 或者模拟现实世界对象类型的高级计算机语言.

高级计算机语言和编译器(解析器)

对于高级语言编程, 其主体是代码文件-编译程序. 刚刚我们提到了机器语言和汇编语言以及它们的缺点, 虽然对于人类来说这些太过繁琐, 不过对于机器来说, 这些是浅显易懂(可执行的)的. 但高级语言不同于前两者, 它们简化了我们的编程过程也接近我们解决问题的方式, 但对计算机并不友好. 举个例子:

total_apples = my_apples + your_apples

对于这行代码, 我们很快就能清楚地理解它的作用. 但对于计算机来说是一头雾水的. 这时候编译器/解析器就要登场了(我们待会再讨论它们的区别). 它们在计算机中担任一个翻译的工作, 它们可以将高级语言代码翻译成机器所能理解的语言.

关于编译器和解析器的区别

高级编程语言大致分成两类, 编译型的和解析型的(其实大部分都是混合型的). 对于C这种主要是编译型的, 编译器在程序正式被调用之前针对不同架构的CPU翻译成不同的机器指令并生成可执行文件, 直接可以在对应CPU上运行. 而对于Python这类是解析型的, 我们又管类叫脚本(Script). 解析器实时翻译脚本成机器语言来运行, 现实世界中我们管这个叫”同声翻译”, 所以写好一个脚本程序, 只要有合适的解析器, 放在哪里都可以运行.

这里省略了连接器, 内核调用等等许多步骤. 等进一步深入后会有所了解.

经典软件开发模式

到这里我们应该对编程语言和它的工作原理有了基本的了解, 接下来我将介绍经典软件开发模式-瀑布模型.

图片来源: C Primer Plus 6th figure 1.3

  1. 定义程序目标
  2. 设计程序
  3. 编写代码
  4. 编译
  5. 运行程序
  6. 测试和调试
  7. 维护和修改

实际开发软件过程中很少完全准守这一规则, 常常会根据不同的项目, 语言或框架采取不同的开发模式. 比方说对于Python会没有编译这一步骤, 对于大型项目会将多个步骤模块化.

开始您的第一次编程(Python on Windows)

其实这肯定不是您第一次接触编程了, 在高中信息课程中我们已经学习过VB的基础, 这里我们重新完整介绍一下.

刚刚我们提到, Python是一种解析型的语言, 它不需要编译直接可以由解析器运行. 首先我们先从Python官网下载并安装.

配置Python环境

配置环境变量(通常安装时自动添加)

打开cmd或者powershell: Win+R -> cmd 或者 Win+R powershell

输入命令: python --version, 若返回Python 3.x则说明配置成功

选择一个合适的编辑器

在一部步中我们已经完成了解析器的安装, 现在就可以敲代码了. 不过在写第一个程序之前最好选择一个合适的入手编辑器. 我个人推荐Notepad++上手.

Q: 为什么不用记事本呢?
A: 记事本只有单纯的文字编辑功能, 没有合适的代码高亮和自动缩进等功能, 满屏的黑色字体足以让人眼花.

同一个源文件用不同编辑器的效果:

图中的编辑器:

  • Notepad: Windows自带的记事本(源代码没有用Windows的换行格式)
  • Notepad++: 比较适合上手的代码编辑器
  • IDLE: Python on Windows 自带的IDE(稍后再讲)
  • Visual Studio Code: 现代代码编辑器
  • vim: 大神/装B/小型项目利器

Hello, World!

先新建一个文件, 我们就把它放在用户/文档目录下, 叫它hello.py吧(注意扩展名)

#! python
print("Hello, World!")

先不用管这两行是什么意思, 开始看Python书籍时就会理解. 打开cmd

  1. cd Documents或者在中文环境下是cd 文档: 将工作目录切换到文档目录下
  2. python hello.py: 执行hello程序

程序输出Hello, World!, 搞定!

认识其他工具-命令行, IDE

学会了编辑器-编译器(解析器)的工作模式基本上就能完成整个Python基础的学习, 也能够了解在编程的过程中发生了些什么. 其实大部分中小型项目都是以编辑器-编译器为主要工具. 当然notepad++并不能满足, 在熟悉了一些电脑操作后可以尝试其他更有利的代码编辑器, 比如说Atom, VS Code等等. 不过这里还要再介绍另外两样工具, 命令行和IDE.

命令行程序(Shell - CLI)

命令行界面(英语:command-line interface, 缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面, 它通常不支持鼠标, 用户通过键盘输入指令, 计算机接收到指令后, 予以执行. 也有人称之为字符用户界面(CUI). (摘录至维基百科)

其实我们刚刚已经接触过命令行了, 就是cmd. 在程序员的世界中大部分工具都是命令行的(没有图形界面的), 它虽然相对于图形界面工具需要更大的学习成本, 但它包含了大量快捷实用的工具. 熟悉命令行工具更有利于对编程的学习和了解.

命令行的种类有许多, Windows下有cmd, PowerShell, UNIX系的系统下有zsh等逆天炫酷的命令行, 它们往往带来一些和Python一样的脚本语言, 但没有Python那样强大(PowerShell除外). 像Python等脚本类语言也有类似命令行的”交互式解析器”, 但没有真正的命令行功能完全(有其他非官方的交互式解析器有强大功能).

命令行的基本操作是以command arguments(命令 参数)这样的形式, 例如ls -l, python -i script.py等等, 强大的命令行还有管道(pipe)等工具, 这里不多做说明.

Python同样自带了一个类似命令行的工具, 在cmd中用命令python打开, 这就是刚刚提到的交互式解析器. 不同于命令行那样的指令形式, 它由一条条Python指令组成, 例如1 + 1, print(""). 正统的叫法是REPL(“读取-求值-输出”循环, 英语: Read-Eval-Print Loop, 简称REPL).

REPL的优点: REPL对于学习一门新的编程语言具有很大的帮助, 因为它能立刻对初学者做出回应. 许多工具集和编程语言使用REPL研究算法, 进行调试, 比如Matlab, Root, SciPy和IPython. Python的doctest模块能够通过捕捉自身REPL命令行的输出使测试代码更容易地进行. (摘录至维基百科)

IDE(集成开发环境)

集成开发环境(Integrated Development Environment, 简称IDE, 也称为Integration Design Environment、Integration Debugging Environment)是一种辅助程序开发人员开发软件的应用软件, 在开发工具内部就可以辅助编写源代码文本、并编译打包成为可用的程序, 有些甚至可以设计图形接口. (摘录至维基百科)

终于要谈到VB了, 我们在高中信息课程中学习的VB程序开发就是一种IDE. 命令行虽然快捷方便, 但工作内容上升, 编辑器-命令行的编译器(解析器)已经不足以应对现实情况, 于是有了IDE的出现, 它们大大简化方便了程序员的工作. 同时许多编辑器如VS code, vim等等也变得IDE化, 拥有大量的插件和或者具备方便记忆的command palette. 真正的IDE往往长这样:

IntelliJ IDEA

Visual Studio

(我已经按照个人喜好把工具栏全隐藏了)

它们虽然强大快捷方便, 集成了大量工具, 但对于新手或者小型项目完全没有必要, 甚至有一些阻碍. 从IDE上手的学生常常不了解编写程序或者系统上的逻辑, 很难一下子了解IDE全部功能(因为太多了), 不能及时发现问题或者快速学习新的语言, 新的框架, 新的工具. (特别是C, Java语言这类编译型的语言)

对于Python的IDE, 大部分书籍推荐PyCharm. 但我个人认为学习语言还是从命令行工具开始比较合适. 不过在了解命令行工具后可以试下Python自带的IDLE, 功能非常简单, 非常适合学习Python.

基础Python IDE: IDLE介绍

这里就是这篇入门篇章的最后一段了, 您在之前试了几次编辑器-命令行编译器/解析器的学习方法后可能有点厌烦了. 在实际开发项目时我们往往会用现代代码编辑器或者功能完善的IDE来提高工作效率(编程本来就是主要用来避免和简化繁琐工作的), 所以在最后让我们来认识下IDLE, 一个简单好用的Python IDE. IDLE或许是最接近编辑器的IDE了, (相对应的, Vim, VSCode, Atom等等是最接近IDE的编辑器了). 在开始菜单中搜索IDLE(如果没有请在重新安装/配置Python并在安装时选中Tcl/Tk).

如果刚才试用了刚刚提到的repl程序, 我们会发现idle默认打开的就是idle. 接下来我们新建一个文件(File - New File), 还是写上刚刚的Hello, World!程序, 并保存.

点击Run - Run Module (F5), 就可以在刚才的命令行串口中运行这个脚本, 是不是比刚才的命令行工具方便多了?

这个IDE中还有不少其他配置, 有空可以试试看!

结束语

很久没写教程了, 也是第一次面向自学新手写编程教程, 或许有一些没说清楚的地方(当然全文都不太清楚也是有可能), 请及时指出以便我及时修改. 如果有些前辈有其他观点也请及时提出以便我及时判断更新这篇教程. Python入门书籍可以看看A Byte of Python其最新中文译本, 我个人感觉不错. 在学习Python的时候注意多加练习, 正所谓”在实践中学习”, 在看到面向对象部分的时候好好复习之前的知识点并尝试做一些小项目来熟悉面向过程的编程范式, 然后再接触新的概念. 当然知乎大神也推荐了不少入门书籍, 可以看看前言, 哪本看着舒服看哪本, 网络上推荐的教程都不错, 区别不过是作者的写作风格和内容的新鲜度罢了. 要注意的是Python2和Python3是截然不同的东西, 建议优先选择Python3(本文基于Python3). 最近不少高中毕业生正准备步入大学(我也是QwQ), 大家可以问问自己学校的学者学姐们专业上先学的什么语言作为入门, 尽量与学校课程接轨, 不一定需要局限于Python. 当然用Python作为入门语言能更快更方便地完成许多项目和工具. 如果有同学希望看看其他语言(主流中C++, C#, VB除外), 其他平台(OS X除外)的自学入门前内容和推荐, 可以联系我在本文中补充. 最后希望大家能够享受编程的乐趣.

(全文完, 不定时更新/修改)