本文档从 Notion 中导出,上传到语雀之后,图片丢失了。

本课程基于 Python 3.0

Python 作者说的一句话:

两个 Python 的版本

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

Python 最流行的发行版 Anaconda

Anaconda 镜像站——清华大学开源软件镜像站 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 课程 - 图1

我们安装的是 Python 3,所以需要输入 python3

退出 python 解释环境,需要在终端输入 exit()

极客时间 Python 课程 - 图2

Python 程序的书写规则

注释语句 # + 文本内容

注释语句可以写在 py 文件的开头,也可以写在语句的后面

import 导入模块

一行写不完的语句,需要用到缩进

Python 的数据类型

  • 整数(int) 8
  • 浮点数(float) 8.8
  • 字符串(str) “8” “Python”
  • 布尔值(bool) True Flase

使用命令来判断数据的类型:

type(8)

返回 # 说明这是一个整数

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

数据类型转换

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

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

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

  1. >>> str(123)
  2. '123'

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

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

变量的定义和常用操作

计算网络带宽的单位是比特,而存储文件的单位是字节,它们之间是 1:8 的关系,导致下载文件的大小和带宽速度的不对等

极客时间 Python 课程 - 图3

如果你家里的带宽是 100MB/s,下载速度是多少呢?

在 PyCharm 写好代码之后,在空白处右击,选择运行 Run,下方的面板就会显示运行的结果

极客时间 Python 课程 - 图4

单纯地用数字来书写不够方便,我们引入变量

变量可以多次赋值

极客时间 Python 课程 - 图5

引入变量之后,前面的代码可以改写成:

极客时间 Python 课程 - 图6

变量命名:

除了可以使用前面的英文单词,例如 bandwidth、ratio 来给变量命名,我们也可以使用单纯的字母,例如:

a 也可以作为变量名,但这一般用在临时变量的命名上

常见的变量命名,是使用有意义或者意义明确的单词来命名

其他的命名方式:

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

什么样的命名是合法的呢?

——以字母或下划线开头,中间只能包含字母和数字以及下划线

下划线开头的命令方式,一般会用在 Python 的特殊含义,比较少用

序列的概念

案例:计算生肖和星座

字符串、列表和元组三种类型都属于序列

极客时间 Python 课程 - 图7

定义一个类型为字符串的变量 chinese_zodiac,也是序列,中括号中的 0 代表下标,0 代表第一个字符串,0:4 代表访问下标为 0、1、2、3 的字符串,这里的 4 是指从下标为 0 访问到下标为 4 前面的一个。

极客时间 Python 课程 - 图8

如果想从后面往前面访问,需要使用负号,例如访问属相为猪的字符串

极客时间 Python 课程 - 图9

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

  • 切片操作符 [:] 例子:[0:整数]
  • 成员关系操作符 对象 [not] in 序列
  • 连接操作符 序列 + 序列
  • 重复操作符 序列 * 整数

极客时间 Python 课程 - 图10

成员关系操作符的例子:

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

连接操作符的例子:

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

重复操作符的例子:

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

元组

元组:小括号括起来的字符串,例子 (‘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. # 最后运行的结果就是 水瓶座

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

元组大小的比较:

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

包含两个元素的元组的大小比较,(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. # 上面的代码的运行结果为 <filter object at 0x10cc55518>
  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

列表

使用 .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']

列表的基本操作:

成员关系操作符

连接操作符

重复操作符

切片操作符

极客时间 Python 课程 - 图11

生肖与星座案例的总结:

极客时间 Python 课程 - 图12

条件语句

if 语句

极客时间 Python 课程 - 图13

例子:

一个等号是赋值

两个等号是判断两个值是否相等

if 语句后面会加上一个冒号 : ,告诉 Python 我们的语句还没有结束

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

更复杂的情况,例如有三个判断条件的话,需要用到 elif,它是 else-if 的缩写。

if 表达式 :

代码块

elif 表达式 :

代码块

else :

代码块

案例:根据用户的生肖来判断今年的运势

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

极客时间 Python 课程 - 图14

循环语句

while 会进行多次循环,直到条件为假的时候,才会退出循环

for 与类 C 语言的循环语句存在着区别,有点像是遍历,从列表或元组中取出所有我们想要的元素(for 循环经常用来遍历序列)

极客时间 Python 课程 - 图15

遍历 12 生肖:

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

遍历数字

  1. for i in range(13) : # 这里的 range(13) 函数会返回从 0 到 12 共 13 个数字
  2. print(i)
  3. # 运行的结果为
  4. 0
  5. 1
  6. 2
  7. 3
  8. 4
  9. 5
  10. 6
  11. 7
  12. 8
  13. 9
  14. 10
  15. 11
  16. 12
  1. for i in range(1,13) : # range 使用两个参数,就会返回从 1 到 12 共 12 个数字
  2. print(i)

字符串的替换功能

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 年的生肖是

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

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 程序的打印速度

for 循环语句中的 if 嵌套

还是以生肖和星座作为案例进行展示

使用 type() 函数来判断返回的数据类型,如下图,下方返回的是字符串类型

极客时间 Python 课程 - 图16

最外层加多一个 int 函数,就可以将原先得到的 字符串 类型转换为 整数类型(int)

极客时间 Python 课程 - 图17

字典的定义和常用操作

需求:用来记录多位用户输入的日期和对应的星座数据

列表:主要强调顺序

新的数据类型——映射,映射在 Python 中被称为「字典」

字典包含哈希值和指向的对象

{“哈希值”: “对象”} 大括号表示当前使用的是字典

一个关键字和关键字的值之间的对应关系

极客时间 Python 课程 - 图18

往字典中增加新的元素:

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

列表推导式与字典推导式

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)

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

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

文件的内建函数

Python 中的文件的含义:打开一个网址、运行的两个程序之间互相通信,Python 都把它们抽象为文件来对待

使用 Python 对文件进行基本的读写操作:

内建函数:Python 自带的函数,不需要额外安装

极客时间 Python 课程 - 图19

open 函数有多个参数,第一个是文件名,第二个是模式,模式的值可以是:

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

如果参数只有文件名,则默认以「只读」的模式打开文件

极客时间 Python 课程 - 图20

要在打开的文件中写入内容,需要将 open 函数赋值给一个变量,对变量进行操作,就等同于对文件进行操作

写入之后,还要对文件进行保存,在 Python 中使用 close() 函数关闭文件,关闭的同时也会保存文件

运行程序,它就会在当前 py 文件所在的路径生成一个 name.txt 的文件

极客时间 Python 课程 - 图21

写入文件的流程:

open() ➡️ write() ➡️ close()

接着来看一下读取文件的流程,把上面中间的 write() 更换为 read():

open() ➡️ read() ➡️ close()

想看看文件的内容有没有被读取到变量 file2 里,这里我们增加一个打印的操作,把读取到的内容进行打印。

可以看到,打印输出的内容和文件的内容是一致的。

极客时间 Python 课程 - 图22

另外的文件操作:往现有的文件增加内容,例如往前面创建的 name.txt 文件增加一个人名「刘备」

open() 函数的第二个参数为 ‘a’,代表增加,而不能用 ‘w’,不然会把前面创建的内容覆盖

极客时间 Python 课程 - 图23

文件的常用操作

读取 name.txt 文件中的单行:

name.txt 的文件内容如下:

极客时间 Python 课程 - 图24