本文档从 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) # 返回的值是 True
print( '狗' 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) ) # 运行的结果是 False
print( (1,20) > (2,20) ) # 运行的结果是 False
包含两个元素的元组的大小比较,(1,20) 相当于是 120,(2,20) 相当于是 220
一个提前学习的知识——filter:
# 为了演示方便,下面的代码在终端中的 python 3 环境下运行
a = (1, 3, 5, 7)
b = 4
filter(lambda x: x < b, a) # 取出 a 中小于 4(a 中小于 b) 的元素
# 上面的代码的运行结果为 <filter object at 0x10cc55518>
list (filter(lambda x: x < b, a)) # 加了 list 之后,返回的结果就是我们想要的了
# 运行结果为 [1, 3]
b = 6
list(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)
# 运行的结果为
0
1
2
3
4
5
6
7
8
9
10
11
12
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 = 5
while True :
print('a')
num = num + 1
if num > 10 : # 当 num 的值大于 10 的时候,终止 while 循环
break
while 循环会用到 break 或 continue 来终止或打断程序。continue 会跳出当前的循环,而 break 会终止整个循环。
import time
num = 5
while True :
num = num + 1
if 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':3
print(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 的文件内容如下: