Python 的历史

Python 的作者 Guido von Rossum,荷兰人1989年,为了打发圣诞节假期,Guido 开始写 Python 语言的编译/解释器。Python来自 Guido 所挚爱的电视剧 Monty Python’s Flying Circus (BBC1960-1970年代播放的室内情景幽默剧,以当时的英国生活为素材)。他希望这个新的叫做 Python 的语言,能实现他的理念(一种C和shell之间,功能全面,易学易用,可拓展的语言)。Guido 作为一个语言设计爱好者,已经有过设计语言的(不很成功)的尝试。这一次,也不过是一次纯粹的 hacking 行为。

  • 1994 年 1 月:Python 1.0 正式发布。

  • undefined

  • 2000 年 10 月 16 日:Python 2.0 发布,增加了完整的垃圾回收),提供了对 Unicode 的支持。与此同时,Python 的整个开发过程更加透明,社区对开发进度的影响逐渐扩大,生态圈开始慢慢形成。

  • undefined

  • 2008 年 12 月 3 日:Python 3.0 发布,它并不完全兼容之前的 Python 代码,不过因为目前还有不少公司在项目和运维中使用 Python 2.x 版本,所以 Python 3.x 的很多新特性后来也被移植到 Python 2.6/2.7 版本中。

  • undefined

了解 Python 的更多历史,可以查看 《Python 简史》 https://www.cnblogs.com/vamei/archive/2013/02/06/2892628.html Python 作者说的一句话:

Python 的优缺点

Python的优点很多,简单的可以总结为以下几点。

  • 简单明了,学习曲线低,比很多编程语言都容易上手。

  • undefined

  • 开放源代码,拥有强大的社区和生态圈,尤其是在数据分析和机器学习领域。

  • undefined

  • 解释型语言,天生具有平台可移植性,代码可以工作于不同的操作系统。

  • undefined

  • 对两种主流的编程范式(面向对象编程和函数式编程)都提供了支持。

  • undefined

  • 代码规范程度高,可读性强,适合有代码洁癖和强迫症的人群。

  • undefined

Python 的缺点主要集中在以下几点。

  • 执行效率稍低,对执行效率要求高的部分可以由其他语言(如:C、C++)编写。

  • undefined

  • 代码无法加密,但是现在很多公司都不销售卖软件而是销售服务,这个问题会被弱化。

  • undefined

  • 在开发时可以选择的框架太多(如 Web 框架就有 100 多个),有选择的地方就有错误。

  • undefined

Python 的应用领域

目前Python在Web应用后端开发、云基础设施建设、DevOps、网络数据采集(爬虫)、自动化测试、数据分析、机器学习等领域都有着广泛的应用。

两个版本的 Python 解释器

官方的 Python 解释器是用 C 语言实现的,也是使用最为广泛的 Python 解释器,通常称之为 CPython。

  • 官方版:标准库

  • undefined

  • 发行版:相比官方版,集成了很多常用的软件包(Python 常用的科学计算的包会集成进来)

  • undefined

Python 最流行的发行版 AnacondaAnaconda 镜像站——清华大学开源软件镜像站 https://mirror.tuna.tsinghua.edu.cn/help/anaconda/

学习 Python 会用到的工具

Python 官方文档:https://docs.python.org/3/iPython:交互式的命令行解释器 https://ipython.org/jupyter notebook:实现在网页上进行编程sublime text:文本编辑器PyCharm:集成开发环境,编写大型的应用程序,Python 的 IDE,下载社区版就能满足我们的需求Pip:第三方软件,自动帮你安装依赖包

安装 Python 解释器

从官网下载之后直接安装即可安装之后打开 Mac 终端,输入 python,会返回如下图的结果,是因为 Mac 自带了 Python 2:我们安装的是 Python 3,所以需要输入 python3可以通过在终端执行 python 命令来启动 2.x 版本的Python解释器,启动 3.x 版本的 Python 解释器需要执行 python3 命令。退出 python 解释环境,需要在终端输入 exit()

玩转 PyCharm

分成两个版本,一个是社区版,一个是专业版如果你是学生,可以在 PyCharm 的官网申请免费使用 https://sales.jetbrains.com/hc/zh-cn/articles/207154369每个 Python 项目最好都在自己专属的虚拟环境中运行,因为每个项目对 Python 解释器和三方库的需求并不相同,虚拟环境对不同的项目进行了隔离。“Virtualenv”是 PyCharm 默认选择的创建虚拟环境的工具,我们就保留这个默认的选项就可以了。在 macOS 上,格式化代码这个菜单项对应的快捷键是 Alt+command+L PyCharm 中特别常用的快捷键:参考《玩转 PyCharm》 https://www.ixyread.com/read/python99/玩转PyCharm.md

Python 程序的书写规则

注释语句 # + 文本内容注释语句可以写在 py 文件的开头,也可以写在语句的后面import 导入模块一行写不完的语句,需要用到缩进

Python 的数据类型

  • 整数 (int) 8

  • undefined

  • 浮点数 (float) 8.8

  • undefined

  • 字符串 (str) “8” “Python”

  • undefined

  • 布尔值 (bool) True Flase

  • undefined

使用命令来判断数据的类型:>>> type(8)返回 # 说明这是一个整数

  1. >>> type('8')
  2. # 说明这是一个字符串
  3. >>> type('极客时间')
  4. >>> type("极客时间") # 双引号把文本括起来也可以
  5. CopyCaption Python

数据类型转换例如将字符串转换为整数,例如下面的代码,将字符串 8 转换为整数 8:

  1. >>> int('8')
  2. CopyCaption Python

把数字 123 转换为字符串类型:

  1. >>> str(123)
  2. '123'
  3. CopyCaption Python

把数字转换为布尔值类型:

  1. >>> bool(123)
  2. True
  3. >>> bool(0)
  4. Flase
  5. CopyCaption Python

变量的定义和常用操作

计算网络带宽的单位是比特,而存储文件的单位是字节,它们之间是 1:8 的关系,导致下载文件的大小和带宽速度的不对等如果你家里的带宽是 100MB/s,下载速度是多少呢?在 PyCharm 写好代码之后,在空白处右击,选择运行 Run,下方的面板就会显示运行的结果0e292559-0b8d-4864-8c13-2a098083a8aa - 图1变量命名:除了可以使用前面的英文单词,例如 bandwidth、ratio 来给变量命名,我们也可以使用单纯的字母,例如:a 也可以作为变量名,但这一般用在临时变量的命名上常见的变量命名,是使用有意义或者意义明确的单词来命名其他的命名方式:

  • 驼峰命名法:bandWidth (注意中间的 W 为大写字母)

  • undefined

  • BandWidth

  • undefined

  • 下划线命名:band_width

  • undefined

什么样的命名是合法的呢?——以字母或下划线开头,中间只能包含字母和数字以及下划线下划线开头的命令方式,一般会用在 Python 的特殊含义,比较少用

序列的概念

案例:计算生肖和星座字符串、列表和元组三种类型都属于序列定义一个类型为字符串的变量 chinese_zodiac,也是序列,中括号中的 0 代表下标,0 代表第一个字符串,0:4 代表访问下标为 0、1、2、3 的字符串,这里的 4 是指从下标为 0 访问到下标为 4 前面的一个。0e292559-0b8d-4864-8c13-2a098083a8aa - 图2

序列的基本操作(字符串的基本操作)

  • 切片操作符 [:] 例子:[0: 整数]

  • undefined

  • 成员关系操作符 对象 [not] in 序列

  • undefined

  • 连接操作符 序列 + 序列

  • undefined

  • 重复操作符 序列 * 整数

  • undefined

成员关系操作符的例子:

  1. chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪'
  2. print( '狗' in chinese_zodiac) # 返回的值是 True
  3. print( '狗' not in chinese_zodiac) # 返回的值是 Flase
  4. CopyCaption Python

连接操作符的例子:

  1. print( chinese_zodiac + chinese_zodiac ) # 返回的值是 鼠牛虎兔龙蛇马羊猴鸡狗猪鼠牛虎兔龙蛇马羊猴鸡狗猪
  2. print ( chinese_zodiac + 'abc' ) # 返回的值是 鼠牛虎兔龙蛇马羊猴鸡狗猪abc
  3. CopyCaption Python

重复操作符的例子:

  1. print( chinese_zodiac * 2) # 返回的值是 鼠牛虎兔龙蛇马羊猴鸡狗猪鼠牛虎兔龙蛇马羊猴鸡狗猪
  2. CopyCaption Python

元组

元组:小括号括起来的字符串,例子 (‘abc’ , ‘edf’)例子:通过月份和日期来查询星座

  1. zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
  2. u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座') # 字符串最前面的 u 是 unicode 的缩写,标志星座,不要出现乱码;为了阅读方便,进行换行
  3. zodiac_days = ((1,20),(2,19),(3,21),(4,21),(5,21),(6,22),
  4. (7,23),(8,23),(9,23),(10,23),(11,23),(12,23)) # 元组的嵌套
  5. (month, day) = (2, 15)
  6. zodiac_day = filter(lambda x : x <= (month, day), zodiac_days) # 取出 zodiac_days 中小于 (month, day)的日期
  7. print(zodiac_day) # 用日期去判断星座的时候,会用到一个循环的功能
  8. zodiac_len = len( list(zodiac_day) ) % 12 # zodiac_day 返回的值的类型是 filter,这里用 list() 把它转换为序列
  9. print(zodiac_name[zodiac_len])
  10. # 最后运行的结果就是 水瓶座
  11. CopyCaption Python

列表与元组的区别:列表存储的内容是可变更的(有增加和删减的功能 ),而元组存储的内容一般是不可变更的。元组大小的比较:

  1. print( (4) > (5) ) # 运行的结果是 False
  2. print( (1,20) > (2,20) ) # 运行的结果是 False
  3. CopyCaption Python

包含两个元素的元组的大小比较,(1,20) 相当于是 120,(2,20) 相当于是 220一个提前学习的知识——filter:

  1. # 为了演示方便,下面的代码在终端中的 python 3 环境下运行
  2. a = (1, 3, 5, 7)
  3. b = 4
  4. filter(lambda x: x < b, a) # 取出 a 中小于 4(a 中小于 b) 的元素
  5. # 上面的代码的运行结果为
  6. list (filter(lambda x: x < b, a)) # 加了 list 之后,返回的结果就是我们想要的了
  7. # 运行结果为 [1, 3]
  8. b = 6
  9. list(filter(lambda x: x < b, a)) # 取出 a 中小于 6 的元素
  10. # 运行结果为 [1, 3, 5]
  11. len(list(filter(lambda x: x < b, a))) # 计算取出 a 中小于 6 的元素的个数
  12. # 运行结果为 3
  13. CopyCaption Python

列表

使用 .append() 方法可以为列表增加元素,增加的元素会放在列表已有元素的最后面使用 .remove() 方法可以把元素移除

  1. a_list = ['abc', 'xyz']
  2. a_list.append('X')
  3. print(a_list)
  4. # 输出的结果为 ['abc', 'xyz', 'X']
  5. a_list.remove('xyz')
  6. # 输出的结果为 ['abc', 'X']
  7. CopyCaption Python

列表的基本操作:成员关系操作符连接操作符重复操作符切片操作符0e292559-0b8d-4864-8c13-2a098083a8aa - 图3

条件语句

if 语句例子:一个等号是赋值两个等号是判断两个值是否相等if 语句后面会加上一个冒号 : ,告诉 Python 我们的语句还没有结束

  1. x = 'abc'
  2. if x == 'abc' :
  3. print( 'x 的值和 abc 相等' )
  4. else :
  5. print( 'x 的值和 abc 不相等')
  6. CopyCaption Python

更复杂的情况,例如有三个判断条件的话,需要用到 elif,它是 else-if 的缩写。if 表达式 :代码块代码块elif 表达式 :代码块代码块else :代码块代码块案例:根据用户的生肖来判断今年的运势

  1. chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
  2. year = int(input( '请你输入自己的出生年份' )) # 外层嵌套一个 int 函数,将字符串强制转换为 数字
  3. if (chinese_zodiac[year % 12]) == '狗' :
  4. print ( '狗年运势:行大运' )
  5. CopyCaption Python

循环语句

while 会进行多次循环,直到条件为假的时候,才会退出循环 for 与类 C 语言的循环语句存在着区别,有点像是遍历,从列表或元组中取出所有我们想要的元素(for 循环经常用来遍历序列)遍历 12 生肖:

  1. chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
  2. for a in chinese_zodiac :
  3. print(a)
  4. # 运行的结果如下:
  5. CopyCaption Python

遍历数字

  1. for i in range(13) : # 这里的 range(13) 函数会返回从 0 到 12 共 13 个数字
  2. print(i)
  3. # 运行的结果为
  4. CopyCaption Python
  1. for i in range(1,13) : # range 使用两个参数,就会返回从 1 到 12 共 12 个数字
  2. print(i)
  3. CopyCaption Python

字符串的替换功能for 循环语句与 print 配合使用% + 输出的数据类型,下面的 %s 中的 s 是 string 的缩写,希望输出的数据类型为字符串% + d,输出的数据类型为整数

  1. chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
  2. for year in range(2000, 2019) :
  3. print( '%s 年的生肖是 %s' %(year, chinese_zodiac[yeaer % 12]) ) # 最后面的 % 跟的内容,是要替换进来的内容
  4. # 输出的结果为:
  5. 2000 年的生肖是
  6. 2001 年的生肖是
  7. 2002 年的生肖是
  8. ……
  9. 2017 年的生肖是
  10. 2018 年的生肖是
  11. CopyCaption Python

while 循环

while 循环多数时候会和 if 语句配合使用

  1. num = 5
  2. while True :
  3. print('a')
  4. num = num + 1
  5. if num > 10 : # 当 num 的值大于 10 的时候,终止 while 循环
  6. break
  7. CopyCaption Python

while 循环会用到 break 或 continue 来终止或打断程序。continue 会跳出当前的循环,而 break 会终止整个循环。

  1. import time
  2. num = 5
  3. while True :
  4. num = num + 1
  5. if num == 10 :
  6. continue # 当 num 等于 10 的时候,跳过这个循环,不打印 num = 10 的情况
  7. print(num)
  8. time.sleep(1) # 引入 time.sleep() 是为了减缓 Python 程序的打印速度
  9. CopyCaption Python

for 循环语句中的 if 嵌套

还是以生肖和星座作为案例进行展示使用 type() 函数来判断返回的数据类型,如下图,下方返回的是字符串类型最外层加多一个 int 函数,就可以将原先得到的 字符串 类型转换为 整数类型(int)

字典的定义和常用操作

需求:用来记录多位用户输入的日期和对应的星座数据列表:主要强调顺序新的数据类型——映射,映射在 Python 中被称为「字典」字典包含哈希值和指向的对象{“哈希值”: “对象”} 大括号表示当前使用的是字典一个关键字和关键字的值之间的对应关系往字典中增加新的元素:

  1. dict2 = { 'x':1 , 'y':2 }
  2. dict2['z'] = 3 # 给字典 dict2 增加一个新的元素 'z':3
  3. print(dict2)
  4. CopyCaption Python

列表推导式与字典推导式

for 循环的另一个用处——列表推导式推导式是 Python 的独有的语法之前定义字典的方式——先定义一个空的字典,再用 for…in 进行赋值——不是很优雅,为了让其更优雅,我们可以使用推导式。让列表的值增加的方法: .append()

  1. # 从 1 到 10 所有偶然的平方
  2. alist = []
  3. for i in range(1,11)
  4. if( i % 2 == 0) :
  5. alist.append( i*i ) # 这一行需要缩进,不然程序会报错
  6. print(alist)
  7. CopyCaption Python

使用列表推导式来改写上面的写法:

  1. alist = [i*i for i in range(1,11) if(i%2) == 0]
  2. print(alist)
  3. CopyCaption Python

文件的内建函数

Python 中的文件的含义:打开一个网址、运行的两个程序之间互相通信,Python 都把它们抽象为文件来对待使用 Python 对文件进行基本的读写操作:内建函数:Python 自带的函数,不需要额外安装open 函数有多个参数,第一个是文件名,第二个是模式,模式的值可以是:

  • r(read 的缩写,代表读取文件)

  • undefined

  • w(write 的缩写,写入)

  • undefined

如果参数只有文件名,则默认以「只读」的模式打开文件要在打开的文件中写入内容,需要将 open 函数赋值给一个变量,对变量进行操作,就等同于对文件进行操作写入之后,还要对文件进行保存,在 Python 中使用 close() 函数关闭文件,关闭的同时也会保存文件运行程序,它就会在当前 py 文件所在的路径生成一个 name.txt 的文件 write() close()接着来看一下读取文件的流程,把上面中间的 write() 更换为 read():open() read() close()想看看文件的内容有没有被读取到变量 file2 里,这里我们增加一个打印的操作,把读取到的内容进行打印。可以看到,打印输出的内容和文件的内容是一致的。另外的文件操作:往现有的文件增加内容,例如往前面创建的 name.txt 文件增加一个人名「刘备」open() 函数的第二个参数为 ‘a’,代表增加,而不能用 ‘w’,不然会把前面创建的内容覆盖

文件的常用操作

读取 name.txt 文件中的单行:name.txt 的文件内容如下:使用 readline() 方法就可以读取 name.txt 中的单行,默认读取的是文件的第一行。逐行读取的话,需要用到 readlines() 方法和 for 循环

  1. file5 = open('name.txt')
  2. for line in file5.readlines() :
  3. print(line)
  4. print('=====')
  5. CopyCaption Python

处理文件的另外一个需求:处理完文件之后,回到文件的开头再次处理文件需要用到 tell() 方法,指针的位置(指针:文件操作位置的指示器)指针的功能:当你没有进行人为操作的时候,指针(程序)会记住你当前操作的位置。回到文件初始位置,需要用到 seek() 方法seek() 方法有两个参数,例如 file6.seek(5,0) 中的第一个参数代表偏移位置,第二个参数:0 表示从文件开头偏移,1 表示从当前位置偏移,2 表示从文件结尾位置偏移

异常的检测和处理

错误并不等于异常