本文档从 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 3,所以需要输入 python3
退出 python 解释环境,需要在终端输入 exit()

Python 程序的书写规则
注释语句 # + 文本内容
注释语句可以写在 py 文件的开头,也可以写在语句的后面
import 导入模块
一行写不完的语句,需要用到缩进
Python 的数据类型
- 整数(int) 8
- 浮点数(float) 8.8
- 字符串(str) “8” “Python”
- 布尔值(bool) True Flase
使用命令来判断数据的类型:
type(8)
返回
>>> type('8')<class 'str'> # 说明这是一个字符串>>> type('极客时间')>>> type("极客时间") # 双引号把文本括起来也可以
数据类型转换
例如将字符串转换为整数,例如下面的代码,将字符串 8 转换为整数 8:
>>> int('8')8
把数字 123 转换为字符串类型:
>>> str(123)'123'
把数字转换为布尔值类型:
>>> bool(123)True>>> bool(0)Flase
变量的定义和常用操作
计算网络带宽的单位是比特,而存储文件的单位是字节,它们之间是 1:8 的关系,导致下载文件的大小和带宽速度的不对等

如果你家里的带宽是 100MB/s,下载速度是多少呢?
在 PyCharm 写好代码之后,在空白处右击,选择运行 Run,下方的面板就会显示运行的结果

单纯地用数字来书写不够方便,我们引入变量
变量可以多次赋值

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

变量命名:
除了可以使用前面的英文单词,例如 bandwidth、ratio 来给变量命名,我们也可以使用单纯的字母,例如:
a 也可以作为变量名,但这一般用在临时变量的命名上
常见的变量命名,是使用有意义或者意义明确的单词来命名
其他的命名方式:
- 驼峰命名法:bandWidth (注意中间的 W 为大写字母)
- BandWidth
- 下划线命名:band_width
什么样的命名是合法的呢?
——以字母或下划线开头,中间只能包含字母和数字以及下划线
下划线开头的命令方式,一般会用在 Python 的特殊含义,比较少用
序列的概念
案例:计算生肖和星座
字符串、列表和元组三种类型都属于序列

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

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

序列的基本操作(字符串的基本操作)
- 切片操作符 [:] 例子:[0:整数]
- 成员关系操作符 对象 [not] in 序列
- 连接操作符 序列 + 序列
- 重复操作符 序列 * 整数

成员关系操作符的例子:
chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪'print( '狗' in chinese_zodiac) # 返回的值是 Trueprint( '狗' not in chinese_zodiac) # 返回的值是 Flase
连接操作符的例子:
print( chinese_zodiac + chinese_zodiac ) # 返回的值是 鼠牛虎兔龙蛇马羊猴鸡狗猪鼠牛虎兔龙蛇马羊猴鸡狗猪print ( chinese_zodiac + 'abc' ) # 返回的值是 鼠牛虎兔龙蛇马羊猴鸡狗猪abc
重复操作符的例子:
print( chinese_zodiac * 2) # 返回的值是 鼠牛虎兔龙蛇马羊猴鸡狗猪鼠牛虎兔龙蛇马羊猴鸡狗猪
元组
元组:小括号括起来的字符串,例子 (‘abc’ , ‘edf’)
例子:通过月份和日期来查询星座
zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座') # 字符串最前面的 u 是 unicode 的缩写,标志星座,不要出现乱码;为了阅读方便,进行换行zodiac_days = ((1,20),(2,19),(3,21),(4,21),(5,21),(6,22),(7,23),(8,23),(9,23),(10,23),(11,23),(12,23)) # 元组的嵌套(month, day) = (2, 15)zodiac_day = filter(lambda x : x <= (month, day), zodiac_days) # 取出 zodiac_days 中小于 (month, day)的日期print(zodiac_day) # 用日期去判断星座的时候,会用到一个循环的功能zodiac_len = len( list(zodiac_day) ) % 12 # zodiac_day 返回的值的类型是 filter,这里用 list() 把它转换为序列print(zodiac_name[zodiac_len])# 最后运行的结果就是 水瓶座
列表与元组的区别:列表存储的内容是可变更的(有增加和删减的功能 ),而元组存储的内容一般是不可变更的。
元组大小的比较:
print( (4) > (5) ) # 运行的结果是 Falseprint( (1,20) > (2,20) ) # 运行的结果是 False
包含两个元素的元组的大小比较,(1,20) 相当于是 120,(2,20) 相当于是 220
一个提前学习的知识——filter:
# 为了演示方便,下面的代码在终端中的 python 3 环境下运行a = (1, 3, 5, 7)b = 4filter(lambda x: x < b, a) # 取出 a 中小于 4(a 中小于 b) 的元素# 上面的代码的运行结果为 <filter object at 0x10cc55518>list (filter(lambda x: x < b, a)) # 加了 list 之后,返回的结果就是我们想要的了# 运行结果为 [1, 3]b = 6list(filter(lambda x: x < b, a)) # 取出 a 中小于 6 的元素# 运行结果为 [1, 3, 5]len(list(filter(lambda x: x < b, a))) # 计算取出 a 中小于 6 的元素的个数# 运行结果为 3
列表
使用 .append() 方法可以为列表增加元素,增加的元素会放在列表已有元素的最后面
使用 .remove() 方法可以把元素移除
a_list = ['abc', 'xyz']a_list.append('X')print(a_list)# 输出的结果为 ['abc', 'xyz', 'X']a_list.remove('xyz')# 输出的结果为 ['abc', 'X']
列表的基本操作:
成员关系操作符
连接操作符
重复操作符
切片操作符

生肖与星座案例的总结:

条件语句
if 语句

例子:
一个等号是赋值
两个等号是判断两个值是否相等
if 语句后面会加上一个冒号 : ,告诉 Python 我们的语句还没有结束
x = 'abc'if x == 'abc' :print( 'x 的值和 abc 相等' )else :print( 'x 的值和 abc 不相等')
更复杂的情况,例如有三个判断条件的话,需要用到 elif,它是 else-if 的缩写。
if 表达式 :
代码块
elif 表达式 :
代码块
else :
代码块
案例:根据用户的生肖来判断今年的运势
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'year = int(input( '请你输入自己的出生年份' )) # 外层嵌套一个 int 函数,将字符串强制转换为 数字if (chinese_zodiac[year % 12]) == '狗' :print ( '狗年运势:行大运' )

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

遍历 12 生肖:
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'for a in chinese_zodiac :print(a)# 运行的结果如下:猴鸡狗猪鼠牛虎兔龙蛇马羊
遍历数字
for i in range(13) : # 这里的 range(13) 函数会返回从 0 到 12 共 13 个数字print(i)# 运行的结果为0123456789101112
for i in range(1,13) : # range 使用两个参数,就会返回从 1 到 12 共 12 个数字print(i)
字符串的替换功能
for 循环语句与 print 配合使用
% + 输出的数据类型,下面的 %s 中的 s 是 string 的缩写,希望输出的数据类型为字符串
% + d,输出的数据类型为整数
chinese_zodiac = '猴鸡狗猪鼠牛虎兔龙蛇马羊'for year in range(2000, 2019) :print( '%s 年的生肖是 %s' %(year, chinese_zodiac[yeaer % 12]) ) # 最后面的 % 跟的内容,是要替换进来的内容# 输出的结果为:2000 年的生肖是 龙2001 年的生肖是 蛇2002 年的生肖是 马……2017 年的生肖是 鸡2018 年的生肖是 狗
while 循环
while 循环多数时候会和 if 语句配合使用
num = 5while True :print('a')num = num + 1if num > 10 : # 当 num 的值大于 10 的时候,终止 while 循环break
while 循环会用到 break 或 continue 来终止或打断程序。continue 会跳出当前的循环,而 break 会终止整个循环。
import timenum = 5while True :num = num + 1if num == 10 :continue # 当 num 等于 10 的时候,跳过这个循环,不打印 num = 10 的情况print(num)time.sleep(1) # 引入 time.sleep() 是为了减缓 Python 程序的打印速度
for 循环语句中的 if 嵌套
还是以生肖和星座作为案例进行展示
使用 type() 函数来判断返回的数据类型,如下图,下方返回的是字符串类型

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

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

往字典中增加新的元素:
dict2 = { 'x':1 , 'y':2 }dict2['z'] = 3 # 给字典 dict2 增加一个新的元素 'z':3print(dict2)
列表推导式与字典推导式
for 循环的另一个用处——列表推导式
推导式是 Python 的独有的语法
之前定义字典的方式——先定义一个空的字典,再用 for…in 进行赋值——不是很优雅,为了让其更优雅,我们可以使用推导式。
让列表的值增加的方法: .append()
# 从 1 到 10 所有偶然的平方alist = []for i in range(1,11)if( i % 2 == 0) :alist.append( i*i ) # 这一行需要缩进,不然程序会报错print(alist)
使用列表推导式来改写上面的写法:
alist = [i*i for i in range(1,11) if(i%2) == 0]print(alist)
文件的内建函数
Python 中的文件的含义:打开一个网址、运行的两个程序之间互相通信,Python 都把它们抽象为文件来对待
使用 Python 对文件进行基本的读写操作:
内建函数:Python 自带的函数,不需要额外安装

open 函数有多个参数,第一个是文件名,第二个是模式,模式的值可以是:
- r(read 的缩写,代表读取文件)
- w(write 的缩写,写入)
如果参数只有文件名,则默认以「只读」的模式打开文件

要在打开的文件中写入内容,需要将 open 函数赋值给一个变量,对变量进行操作,就等同于对文件进行操作
写入之后,还要对文件进行保存,在 Python 中使用 close() 函数关闭文件,关闭的同时也会保存文件
运行程序,它就会在当前 py 文件所在的路径生成一个 name.txt 的文件

写入文件的流程:
open() ➡️ write() ➡️ close()
接着来看一下读取文件的流程,把上面中间的 write() 更换为 read():
open() ➡️ read() ➡️ close()
想看看文件的内容有没有被读取到变量 file2 里,这里我们增加一个打印的操作,把读取到的内容进行打印。
可以看到,打印输出的内容和文件的内容是一致的。

另外的文件操作:往现有的文件增加内容,例如往前面创建的 name.txt 文件增加一个人名「刘备」
open() 函数的第二个参数为 ‘a’,代表增加,而不能用 ‘w’,不然会把前面创建的内容覆盖

文件的常用操作
读取 name.txt 文件中的单行:
name.txt 的文件内容如下:

