昨天因为去喝酒了,其实今天是第一天。言归正传,开始今天的学习。
认识Python
Python历史
- 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。
- 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面),可以调用C语言的库函数。在最早的版本中,Python已经提供了对“类”,“函数”,“异常处理”等构造块的支持,还有对列表、字典等核心数据类型,同时支持以模块为基础来构造应用程序。
- 1994年1月:Python 1.0正式发布。
- 2000年10月16日:Python 2.0发布,增加了完整的垃圾回收,提供了对Unicode的支持。与此同时,Python的整个开发过程更加透明,社区对开发进度的影响逐渐扩大,生态圈开始慢慢形成。
- 2008年12月3日:Python 3.0发布,它并不完全兼容之前的Python代码,不过因为目前还有不少公司在项目和运维中使用Python 2.x版本,所以Python 3.x的很多新特性后来也被移植到Python 2.6/2.7版本中。
目前我们使用的Python 3.7.x的版本是在2018年发布的,Python的版本号分为三段,形如A.B.C。其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以阅读名为《Python简史》的文章。
Python的优缺点
Python的优点很多,简单的可以总结为以下几点:
- 简单和明确,做一件事只有一种方法。
- 学习曲线低,跟其他很多语言相比,Python更容易上手。
- 开放源代码,拥有强大的社区和生态圈。
- 解释型语言,天生具有平台可移植性。
- 对两种主流的编程范式(面向对象编程和函数式编程)都提供了支持。
- 可扩展性和可嵌入性,例如在Python中可以调用C/C++代码。
- 代码规范程度高,可读性强,适合有代码洁癖和强迫症的人群。
Python的缺点主要集中在以下几点:
- 执行效率稍低,因此计算密集型任务可以由C/C++编写。
- 代码无法加密,但是现在很多公司都不销售卖软件而是销售服务,这个问题会被弱化。
- 在开发时可以选择的框架太多(如Web框架就有100多个),有选择的地方就有错误。
Python的主要应用领域
目前Python在Web应用开发、云基础设施、DevOps(Development和Operations的组合词)、网络数据采集(爬虫)、数据分析挖掘、机器学习等领域都有着广泛的应用,在工作上也对应的产生了Web后端开发、数据接口开发、自动化运维、自动化测试、科学计算和可视化、数据分析、量化交易、机器人开发、自然语言处理、图像识别等一系列相关的职位。
开始Python编程
想要开始Python编程之旅,首先得在自己使用的计算机上安装Python解释器环境,下面将以安装官方的Python解释器为例,讲解如何在不同的操作系统上安装Python环境。官方的Python解释器是用C语言实现的,也是使用最为广泛的Python解释器,通常称之为CPython。除此之外,Python解释器还有Java语言实现的Jython、C#语言实现的IronPython以及PyPy、Brython、Pyston等版本,我们暂时不对这些内容进行介绍,有兴趣的读者可以自行了解。
Windows环境
可以在Python官方网站下载到Python的Windows安装程序(exe文件),点击跳转 需要注意的是如果在Windows 7环境下安装Python 3.x,需要先安装Service Pack 1补丁包(可以通过一些工具软件自动安装系统补丁的功能来安装),安装过程建议勾选“Add Python 3.x to PATH”(将Python 3.x添加到PATH环境变量)并选择自定义安装,在设置“Optional Features”界面最好将“pip”、“tcl/tk”、“Python test suite”等项全部勾选上。强烈建议选择自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示。如果稍后运行Python程序时,出现因为缺失一些动态链接库文件而导致Python解释器无法工作的问题,可以按照下面的方法加以解决。
如果系统显示api-ms-win-crt*.dll文件缺失,可以参照《api-ms-win-crt*.dll缺失原因分析和解决方法》一文讲解的方法进行处理或者直接在微软官网下载Visual C++ Redistributable for Visual Studio 2015文件进行修复;如果是因为更新Windows的DirectX之后导致某些动态链接库文件缺失问题,可以下载一个DirectX修复工具进行修复。
Linux环境
Linux环境自带了Python 2.x版本,但是如果要更新到3.x的版本,可以在Python的官方网站下载Python的源代码并通过源代码构建安装的方式进行安装,具体的步骤如下所示(以CentOS为例)。
安装依赖库(因为没有这些依赖库可能在源代码构件安装时因为缺失底层依赖库而失败)。
安装依赖库(因为没有这些依赖库可能在源代码构件安装时因为缺失底层依赖库而失败)。
1 |
yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel |
下载Python源代码并解压缩到指定目录。
1 2 3 |
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz xz -d Python-3.7.3.tar.xz tar -xvf Python-3.7.3.tar |
切换至Python源代码目录并执行下面的命令进行配置和安装。
1 2 3 |
cd Python-3.7.3 ./configure --prefix=/usr/local/python37 --enable-optimizations make && make install |
修改用户主目录下名为.bash_profile的文件,配置PATH环境变量并使其生效。
1 2 3 4 5 |
cd ~ vim .bash_profile # ... 此处省略上面的代码 ... export PATH=$PATH:/usr/local/python37/bin # ... 此处省略下面的代码 ... |
激活环境变量。
1 |
source .bash_profile |
macOS环境
基于macOS的特性,macOS也自带了Python 2.x版本,可以通过Python的官方网站提供的安装文件(pkg文件)安装Python 3.x的版本。默认安装完成后,可以通过在终端执行python命令来启动2.x版本的Python解释器,启动3.x版本的Python解释器需要执行python3命令。
开始使用Python
确认Python的版本
Windows可以像上图一样,WIN+R运行,在命令行提示符中键入下面的命令
1 |
python --version |
而在Linux或macOS系统的终端中键入下面的命令
1 |
python3 --version |
当然也可以先输入python或python3进入交互式环境,再执行以下的代码检查Python的版本。
编写第一句Python源代码
可以用文本编辑工具(推荐使用Sublime、Visual Studio Code等高级文本编辑工具)编写Python源代码并用py作为后缀名保存该文件,代码内容如下所示。
1 |
print('hello, world!') |
运行程序
切换到源代码所在的目录并执行下面的命令,看看屏幕上是否输出了”hello, world!”。
1 |
python hello.py |
代码中的注释
注释是编程语言的一个重要组成部分,用于在源代码中解释代码的作用从而增强程序的可读性和可维护性,当然也可以将源代码中不需要参与运行的代码段通过注释来去掉,这一点在调试程序的时候经常用到。注释在随源代码进入预处理器或编译时会被移除,不会在目标代码中保留也不会影响程序的执行结果。
- 单行注释 – 以#和空格开头的部分
- 多行注释 – 三个引号开头,三个引号结尾
1 2 3 4 5 6 7 8 9 10 11 12 13 |
""" 第一个Python程序 - hello, world! 向伟大的Dennis M. Ritchie先生致敬 Version: 0.1 Author: 骆昊 """ print('hello, world!') # print("你好,世界!") print('你好', '世界') print('hello', 'world', sep=', ', end='!') print('goodbye, world', end='!\n') |
Python开发工具
IDLE – 自带的集成开发工具
IDLE是安装Python环境时自带的集成开发工具,如下图所示。但是由于IDLE的用户体验并不是那么好所以很少在实际开发中被采用。
IPython – 更好的交互式编程工具
IPython是一种基于Python的交互式解释器。相较于原生的Python交互式环境,IPython提供了更为强大的编辑和交互功能。可以通过Python的包管理工具pip安装IPython和Jupyter,具体的操作如下所示。
1 |
pip install ipython |
或者
1 |
pip3 install ipython |
Sublime Text – 高级文本编辑器
因接下来的开发和学习并没有使用sublime而使用的Pycharm,所以这里不作过多介绍。
PyCharm – Python开发神器
在Pycharm中输入下方代码将会出现Python之禅
1 |
import this |
对应的译文如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Beautiful is better than ugly. (优美比丑陋好) Explicit is better than implicit.(清晰比晦涩好) Simple is better than complex.(简单比复杂好) Complex is better than complicated.(复杂比错综复杂好) Flat is better than nested.(扁平比嵌套好) Sparse is better than dense.(稀疏比密集好) Readability counts.(可读性很重要) Special cases aren't special enough to break the rules.(特殊情况也不应该违反这些规则) Although practicality beats purity.(但现实往往并不那么完美) Errors should never pass silently.(异常不应该被静默处理) Unless explicitly silenced.(除非你希望如此) In the face of ambiguity, refuse the temptation to guess.(遇到模棱两可的地方,不要胡乱猜测) There should be one-- and preferably only one --obvious way to do it.(肯定有一种通常也是唯一一种最佳的解决方案) Although that way may not be obvious at first unless you're Dutch.(虽然这种方案并不是显而易见的,因为你不是那个荷兰人^这里指的是Python之父Guido^) Now is better than never.(现在开始做比不做好) Although never is often better than *right* now.(不做比盲目去做好^极限编程中的YAGNI原则^) If the implementation is hard to explain, it's a bad idea.(如果一个实现方案难于理解,它就不是一个好的方案) If the implementation is easy to explain, it may be a good idea.(如果一个实现方案易于理解,它很有可能是一个好的方案) Namespaces are one honking great idea -- let's do more of those!(命名空间非常有用,我们应当多加利用) |
使用turtle在屏幕上绘制图形。
turtle是Python内置的一个非常有趣的模块,特别适合对计算机程序设计进行初体验的小伙伴,它最早是Logo语言的一部分,Logo语言是Wally Feurzig和Seymour Papert在1966发明的编程语言。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import turtle turtle.pensize(4) turtle.pencolor('red') turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.mainloop() |
也可以用以下代码画出小猪佩奇:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
""" 绘制小猪佩奇 """ from turtle import * def nose(x,y): """画鼻子""" penup() # 将海龟移动到指定的坐标 goto(x,y) pendown() # 设置海龟的方向(0-东、90-北、180-西、270-南) setheading(-30) begin_fill() a = 0.4 for i in range(120): if 0 <= i < 30 or 60 <= i <90: a = a + 0.08 # 向左转3度 left(3) # 向前走 forward(a) else: a = a - 0.08 left(3) forward(a) end_fill() penup() setheading(90) forward(25) setheading(0) forward(10) pendown() # 设置画笔的颜色(红, 绿, 蓝) pencolor(255, 155, 192) setheading(10) begin_fill() circle(5) color(160, 82, 45) end_fill() penup() setheading(0) forward(20) pendown() pencolor(255, 155, 192) setheading(10) begin_fill() circle(5) color(160, 82, 45) end_fill() def head(x, y): """画头""" color((255, 155, 192), "pink") penup() goto(x,y) setheading(0) pendown() begin_fill() setheading(180) circle(300, -30) circle(100, -60) circle(80, -100) circle(150, -20) circle(60, -95) setheading(161) circle(-300, 15) penup() goto(-100, 100) pendown() setheading(-30) a = 0.4 for i in range(60): if 0<= i < 30 or 60 <= i < 90: a = a + 0.08 lt(3) #向左转3度 fd(a) #向前走a的步长 else: a = a - 0.08 lt(3) fd(a) end_fill() def ears(x,y): """画耳朵""" color((255, 155, 192), "pink") penup() goto(x, y) pendown() begin_fill() setheading(100) circle(-50, 50) circle(-10, 120) circle(-50, 54) end_fill() penup() setheading(90) forward(-12) setheading(0) forward(30) pendown() begin_fill() setheading(100) circle(-50, 50) circle(-10, 120) circle(-50, 56) end_fill() def eyes(x,y): """画眼睛""" color((255, 155, 192), "white") penup() setheading(90) forward(-20) setheading(0) forward(-95) pendown() begin_fill() circle(15) end_fill() color("black") penup() setheading(90) forward(12) setheading(0) forward(-3) pendown() begin_fill() circle(3) end_fill() color((255, 155, 192), "white") penup() seth(90) forward(-25) seth(0) forward(40) pendown() begin_fill() circle(15) end_fill() color("black") penup() setheading(90) forward(12) setheading(0) forward(-3) pendown() begin_fill() circle(3) end_fill() def cheek(x,y): """画脸颊""" color((255, 155, 192)) penup() goto(x,y) pendown() setheading(0) begin_fill() circle(30) end_fill() def mouth(x,y): """画嘴巴""" color(239, 69, 19) penup() goto(x, y) pendown() setheading(-80) circle(30, 40) circle(40, 80) def setting(): """设置参数""" pensize(4) # 隐藏海龟 hideturtle() colormode(255) color((255, 155, 192), "pink") setup(840, 500) speed(10) def main(): """主函数""" setting() nose(-100, 100) head(-69, 167) ears(0, 160) eyes(0, 140) cheek(80, 10) mouth(-20, 30) done() if __name__ == '__main__': main() |
通过以下代码画出五星红旗:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
""" 用Python的turtle模块绘制国旗 """ import turtle def draw_rectangle(x, y, width, height): """绘制矩形""" turtle.goto(x, y) turtle.pencolor('red') turtle.fillcolor('red') turtle.begin_fill() for i in range(2): turtle.forward(width) turtle.left(90) turtle.forward(height) turtle.left(90) turtle.end_fill() def draw_star(x, y, radius): """绘制五角星""" turtle.setpos(x, y) pos1 = turtle.pos() turtle.circle(-radius, 72) pos2 = turtle.pos() turtle.circle(-radius, 72) pos3 = turtle.pos() turtle.circle(-radius, 72) pos4 = turtle.pos() turtle.circle(-radius, 72) pos5 = turtle.pos() turtle.color('yellow', 'yellow') turtle.begin_fill() turtle.goto(pos3) turtle.goto(pos1) turtle.goto(pos4) turtle.goto(pos2) turtle.goto(pos5) turtle.end_fill() def main(): """主程序""" turtle.speed(12) turtle.penup() x, y = -270, -180 # 画国旗主体 width, height = 540, 360 draw_rectangle(x, y, width, height) # 画大星星 pice = 22 center_x, center_y = x + 5 * pice, y + height - pice * 5 turtle.goto(center_x, center_y) turtle.left(90) turtle.forward(pice * 3) turtle.right(90) draw_star(turtle.xcor(), turtle.ycor(), pice * 3) x_poses, y_poses = [10, 12, 12, 10], [2, 4, 7, 9] # 画小星星 for x_pos, y_pos in zip(x_poses, y_poses): turtle.goto(x + x_pos * pice, y + height - y_pos * pice) turtle.left(turtle.towards(center_x, center_y) - turtle.heading()) turtle.forward(pice) turtle.right(90) draw_star(turtle.xcor(), turtle.ycor(), pice) # 隐藏海龟 turtle.ht() # 显示绘图窗口 turtle.mainloop() if __name__ == '__main__': main() |
本文来自这个系列长期转载Python-100-Days ,本文观点不代表蓝洛水深立场,转载请联系原作者。