自学 Python 第 4 期

自学 Python 第 3 期 中我们已经搭建好了开发环境,本期主要讲解 GitHub 官方客户端,以建立 git 仓库并同步至 GitHub,保证代码修改的安全。

创建目录结构并 git 初始化

根据 教程 创建目录结构,然后建立 git 仓库并同步至 GitHub 以保存代码。

我喜欢图形界面,觉着更直观和效率,所以这里我使用 GitHub 官方客户端,当然命令行作为补充也不错。注册 GitHub 账号这些基础过程就不再赘述了。

在客户端登陆 GitHub 后,选择 Add a Local Repository 添加前一步创建好目录结构的文件夹。

屏幕快照 2018-12-26 09.50.16

2018/12/25 posted in  Python

自学 Python 第 3 期

从第 3 期开始进入实战,因为实战才能激发兴趣……

Python 编写 Web App 实战(1):搭建开发环境

实战目标为搭建一个博客网站,包含日志、用户和评论三大部分,教材为 廖雪峰实战教程

安装 Web App 开发所需要的第三方库

安装异步框架 aiohttp

如何理解异步框架 aiohttp?

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法,是某种应用的半成品,或者说是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。

简单搜索并没发现解释同步、异步框架的含义,作为小白总是很苦恼,但我想或许要结合 IO(Input/Output)来理解。廖雪峰教程 IO 编程这节这样说:

由于程序和运行时数据是在内存中驻留,由 CPU 这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要 IO 接口。

比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络 IO 获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的 HTML,这个动作是往外发数据,叫 Output,随后新浪服务器把网页发过来,这个动作是从外面接收数据,叫 Input。

所以,通常程序完成 IO 操作会有 Input 和 Output 两个数据流。当然也有只用一个的情况,比如,从磁盘读取文件到内存,就只有 Input 操作,反过来,把数据写到磁盘文件里,就只是一个 Output 操作。

IO 编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream 就是数据从外面(磁盘、网络)流进内存,Output Stream 就是数据从内存流到外面去。对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。

由于 CPU 和内存的速度远远高于外设的速度,所以,在 IO 编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把 100M 的数据写入磁盘,CPU 输出 100M 的数据只需要 0.01 秒,可是磁盘要接收这 100M 数据可能需要 10 秒,怎么办呢?有两种办法:

第一种是 CPU 等着,也就是程序暂停执行后续代码,等 100M 的数据在 10 秒后写入磁盘,再接着往下执行,这种模式称为同步 IO;

另一种方法是 CPU 不等待,只是告诉磁盘,「您老慢慢写,不着急,我接着干别的事去了」,于是,后续代码可以立刻接着执行,这种模式称为异步 IO。

同步和异步的区别就在于是否等待 IO 执行的结果。好比你去麦当劳点餐,你说来个汉堡,服务员告诉你,对不起,汉堡要现做,需要等 5 分钟,于是你站在收银台前面等了 5 分钟,拿到汉堡再去逛商场,这是同步 IO。

你说来个汉堡,服务员告诉你,汉堡需要等 5 分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步 IO。

很明显,使用异步 IO 来编写程序性能会远远高于同步 IO,但是异步 IO 的缺点是编程模型复杂。想想看,你得知道什么时候通知你汉堡做好了,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步 IO 的复杂度远远高于同步 IO。

aiohttp(a-io-http)是基于 asyncio 实现的 HTTP 框架。asyncio 是并发(concurrency)的一种方式。对 Python 来说,并发还可以通过线程(threading)和多进程(multiprocessing)来实现。

asyncio(a-sync-io)是 asynchronous(异步)I/O,一个使用 async/ await 语法编写并发代码的库。

深入理解 Python 异步编程Python 并发编程之初识异步 IO 框架:asyncio 篇 的解释也比较有参考性。

安装异步框架 aiohttp:pip install aiohttp

安装前端模板引擎 jinja2

选择 Jinja 作为名字是因为 Jinja 是日本寺庙的名称,并且 temple 和 template 的发音类似。它并不是以乌干达的金贾市(Jinja)命名的。

安装前端模板引擎 jinja2:pip install jinja2

安装数据库

程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。而如何定义数据的存储格式就是一个大问题。

为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(Database)这种专门用于集中存储和查询的软件。数据库软件诞生的历史非常久远,早在 1950 年数据库就诞生了。经历了网状数据库,层次数据库,我们现在广泛使用的关系数据库是 20 世纪 70 年代基于关系模型的基础上诞生的。

访问数据库 - 廖雪峰教程 了解更多相关知识。

付费数据库:Oracle、MS SQL Server、IBM DB2、Sybase;免费开源数据库:MySQL、PostgreSQL、sqlite。MySQL(SQL,Structured Query Language,结构化查询语言),是最流行的免费数据库。

MySQL 是什么 了解更多相关知识。

由于教程是 5.x.x 版本 MySQL,所以我在 官网 下载安装了最新版本 5.7.24 for macOS,安装时需要记住提供的初始密码:
屏幕快照 2018-12-16 10.49.10

安装完毕,终端输入 mysql -u root -p,出现以下提示表示正常。

$ mysql -u root -p // 连接数据库
Enter password: 
Welcome to the MySQL monitor...

如果提示:mysql: command not found,则需要添加环境变量,在 .bash_profile 文件中增加以下指令:

export PATH=${PATH}:/usr/local/mysql/bin

最后,修改初始密码,必须修改初始密码才允许执行命令:

$ mysql -u root -p // 连接数据库
Enter password: 
Welcome to the MySQL monitor...

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的密码');

安装 MySQL 异步驱动程序 aiomysql

aiomysql 是基于 asyncio 框架以访问 MySQL 数据库的软件库。

安装 MySQL 异步驱动程序 aiomysql:

pip install aiomysql

本期小结

asyncio(a-sync-io)是 asynchronous(异步)I/O,一个使用 async/ await 语法编写并发代码的库。

aiohttp(a-io-http)是基于 asyncio 实现的 HTTP 框架。

aiomysql(a-io-mysql)是基于 asyncio 框架以访问 MySQL 数据库的软件库。

前端模板引擎 jinja2,数据库是 MySQL 5.7.24。

作为小白,我对这些概念感到陌生,但不要紧,我们是以实战的方式学习 Python,后续实际用到时会详细讲解。

2018/12/11 posted in  Python

自学 Python 第 2 期

自学 Python 第 1 期 中以 pyenv 安装和管理 Python 版本,并且全局启用了 Python 3.6.5 版本,正式敲代码的时间到来,编辑器选择 Visual Studio Code,简称 VS Code,由微软出品,虽然我英语基础还凑合,但巨头出品且支持中文的编辑器无疑最便捷。

Read more   2018/11/22 posted in  Python

自学 Python 第 1 期

为了掌握一门编程语言,我从 2014 年就开始考虑学习 Python,看过一些教程和书籍,但全部半途而废,准确地说是很快就放弃了。学习 Python 不仅是一件锻炼思维的事情,也可能关系我未来的职业发展。所以,我下定决心了,要坚持把 Python 慢慢消化透点,成为第一门我掌握的编程语言。

网络教程以廖雪峰的 Python 3 教程为主,但这份教程也有一些不足之处,我会结合自己的思考,加以完善,在记录自己学习过程的同时,也能给予你参考,我就比较满意了。自学系列基于 macOS,倘若使用 Windows,只需按照廖雪峰教程即可。

Read more   2018/5/1 posted in  Python