Python一周速通
声明
这篇博客完整记录了7天速通Python的过程,下面是在自学期间使用到的资料链接
安装Python以及PyCharm
很重要!但是就不详细说明了,下面是安装视频链接,安装版本最新的即可
【Python安装视频】
【PyCharm安装视频】(最新版和视频里的版本有安装的时候有一点小区别,不要在意)
字面量
定义:被写下来的固定的值
看着有好多,但是主要学的就是标红的三个部分,其他可以了解一下
如果有学习过其他语言的基础,可以发现很熟悉的 int float和string
我们分门别类的说一下
整数(int)
所有整数
在代码中,整数直接写,例如:100,-10,0等
这边要注意,若想将10赋值到变量a,直接写a=10即可,不存在int a=10这种写法
但存在int()函数,可以将其他数据类型转换为整数,例如
1
2 a = int(10.5)
print(a) # 输出10,而非10.5
浮点数(float)
所有小数
在代码中,浮点数直接写,例如:1.0,-1.0,0.0等
字符串(string)
被单引号'内容'
、双引号"内容"
或三引号"""内容"""
包裹的文本数据
其中,单引号和双引号没有任何本质上的区别,将一行内容转化为字符串。但三引号可以将多行内容转换为字符串
代码展示
1 | print(10) |
输出
1 | 10 |
注释
定义:对代码进行解释说明,帮助自己或别人看得懂自己的代码
(对你没听错,包括自己,当你翻到自己之前写的神秘代码却忘了写的是啥的时候,没有注释真的会死的)
- 单行注释:以#开头,#后面的内容不会被解释器执行
- 多行注释:以’’’开头和结尾,’’’中间的内容不会被解释器执行,可以写很多行
注意:多行注释不能嵌套使用
例如:
1 | ''' |
变量
定义:就是在程序运行的时候记录数据的
格式:变量名称 = 变量值
1 | money = 10 |
1 | 钱包还有: 10 元 |
变量,既然叫做变量,那么说明变量是可以变化的,也就是说变量的值是可以改变的!
python支持加减乘除等运算,直接用运算符+ - * /即可
例如我花了五块钱买了一个冰激凌
1 | money = 10 |
数据类型
之前我们提到了,python支持多种不同的数据类型,例如整数int、浮点数float、字符串string等等
同时,我们也学到了使用变量来记录数据
如果我想知道变量所储存的数据类型,该怎么办呢?
python给了我们type()函数,可以用来查看数据类型
例如:
1 | a = 10 |
输出:
1 | <class 'int'> |
表明变量a存储的值的数据类型是int,即整数
一定要注意!!!变量本身没有类型!有类型的是变量存储的数据!!!
标识符
定义:用户在编程过程中起的名字,用于给变量、类等命名
在Python中,起名字有三大规定:
- 内容限定
- 大小写敏感
- 不能是关键字
下面我们分别解释一下
内容限定
在Python中,标识符的内容限定为:
- 由字母、数字、下划线组成
- 不能以数字开头
- 标识符不能包含空格
例如a
/a1
/a_1
/_a1
都是合法的标识符
但如1a
/a 1
这种,是明显违反内容限定的,并非标识符
大小写敏感
python对大小写的要求很严格,具体如下
1 | andy = "安迪1" |
输出
1 | 安迪1 |
可以看到,只是一个大小写的区别,导致的输出结果就不同
不能是关键字
比如print
这种,是python自带的命令,我们不能将其设置为关键字
但如果设置为Print
,python解释器会认为这是两个不同的标识符,不会报错,这也体现了python对标识符大小写敏感的特性
运算符
这个板块过于简单,附一张图自己看就好了
字符串[详细]
字符串的三种定义方式
被单引号'内容'
、双引号"内容"
或三引号"""内容"""
包裹的文本数据
其中,单引号和双引号没有任何本质上的区别,将一行内容转化为字符串。但三引号可以将多行内容转换为字符串
1 | print('这是10') |
输出
1 | 这是10 |
字符串的引号嵌套
假如我想将一句话转化为字符串,但是里面出现了引号,这该怎么办呢?I'm good in python
,She says "I am good in python"
,He says "I'm good in python"
下面有几个解决方案
- 针对
I'm good in python
,不难发现句子里没有双引号,所以我们可以直接用双引号定义字符串 - 针对
She says "I am good in python"
,不难发现句子里有双引号,但是没有单引号,所以我们可以用单引号定义字符串 - 针对
He says "I'm good in python"
,不难发现句子里既有双引号,又有单引号,所以我们可以用转转移字符\
来辅助定义字符串
1 | print("I'm good in python") |
其中,方案三泛用性最强
字符串的拼接
现在,我有两个字符串,分别是"我是"
和"Python高手"
,那该怎么将他们拼接起来呢?
很简单,用+
即可
1 | a = "我是" |
输出
1 | 我是Python高手 |
但要注意!Python中,字符串只能和字符串拼接,不可以和其他类型拼接!
字符串格式化
上面讲到了字符串的拼接,但是这个时候我们会发现:
- 如果要拼接比较长的一句话,要写很多加号,不优雅
- 不能和其他类型拼接,不好使
那有没有什么好的办法呢?
答案是有的,这就是字符串格式化
字符串格式化,先在一个字符串内,用%s
来表示一个字符串占位符,然后用%
后面的参数来代替占位符
例如:
1 | a = "我是" |
输出
1 | 我是Python高手 |
字符串格式化,究其本质,就是将%
后面的内容格式化为字符串,并插入预留好的%s
处
这时,我们惊喜的发现,整数、浮点数等不是字符串格式的,也可以用字符串格式化的方法来格式化
例如:
1 | a = 10 |
输出
1 | 我说:我有10元 |
但是整数、浮点数这种别的类型,都被转换成了字符串,好用是好用,但是没了原来的味道
其实,还是有别的方法的:
解释一下:
%s
:表示字符串占位符 s = string%d
:表示整数占位符 d = int%f
:表示浮点数占位符 f = float
🌟 关键区别总结
占位符 | 接受类型 | 小数处理 | 精度控制 | 非数字兼容性 |
---|---|---|---|---|
%s |
任意类型 | 原样输出 | ❌不支持 | ✅ 自动转换 |
%d |
仅整数 | 丢弃小数(非四舍五入) | ❌不支持 | ❌ 报错 |
%f |
数字类型 | 保留小数 | ✅ 支持(默认保留 6 位小数) | ❌ 报错 |
字符串格式化的精度控制
我们可以使用辅助符号"m.n"
来控制数据的宽度和精度
m
,控制宽度,要求是数字(很少使用),设置的宽度小于数字自身,不生效
示例:输出1
2a = 10
print("%5d" % a)1
[空格][空格][空格]10 #将不足5位的数字,用空格补齐到5位
.n
,控制小数点精度,要求是数字,会进行小数的四舍五入
示例:输出1
2a = 10.45678
print("%.2f" % a)1
10.46 #将小数点后保留2位,进行四舍五入,不足5位,前面补空格
结合m.n
,即控制长度,又控制精度
1
2a = 10.45678
print("%5.2f" % a)
输出
1
[空格]10.46 #将小数点后保留2位,进行四舍五入,不足5位,前面补空格
字符串的快速格式化
目前通过%符号占位已经很方便了,还能进行精度控制。
可是追求效率和优雅的Python,是否有更加优雅的方式解决问题呢?
那当然!
通过语法:f"内容{变量}"
的格式来快速格式化
用人话来说:
f
告诉编译器:后面这个字符串里有需要被格式化的变量{}
是占位符,{}
里的内容就是需要被格式化的变量,
编译器收到f
的通知后,会自动将{}
里的内容提取出来,替换掉{}
看如下代码:
1 | a = 10.5 |
输出
1 | 我有10.5元,我是Python高手 |
wow,果然比%
符号占位要快!优雅、优雅、优雅!
同时,对浮点数不做精度限制,直接按原样输出了10.5
,而非%f
后应该输出的10.500000
对表达式进行格式化
表达式:一条具有明确执行结果的代码语句
例如:"Jack"
,1 + 1
,0
这种固定值,或是a = 1 + 1
的等号右边的部分
对于字符串的格式化,同样的可以格式化表达式
例如:
1 | print(f"{1 + 1}") |
输出
1 | 2 |
在无需使用变量进行数据存储的时候,可以直接格式化表达式,简化代码
数据输入 input()
我们之前学习了print()
函数,将所需的东西打印到屏幕上。那么,怎么和用户建立联系,让用户来向我输入东西呢?
答案是,使用input()
函数!input()
函数在使用时,往往长得像下面这样:
1 | a = input("请输入:") |
一定要注意!!!
input()
函数的默认输出类型是string
!!!此时,若想将输入进来的字符,转换为整数或浮点数,就需要用到
int()
或float()
函数了
[转跳前文]例如:
a = int(input("请输入:"))
这样,输入的字符就会被转换为整数类型,储存在变量a
中
布尔类型和比较运算符
布尔类型
布尔bool
表示现实生活中的逻辑真假
- 真(True):1
- 假(False):0
如果你学过离散数学,这一块应该比较清楚,但是零基础也不难理解
我们可以用一个变量来接收布尔值,示例如下:
1 | a = 10 > 5 #将 10 > 5 进行判断,并将结果赋值到a |
输出:
1 | 10 > 5 是True,变量a包含的内容的类型是<class 'bool'> |
比较运算符
下面是基本的比较运算符一图通:
比较简单,看看就会了
if语句
if语句的基本格式
基本格式如下:
1 | if 条件: |
if语句的意思是:如果if后的条件成立,就执行代码块
注意:python中判断代码块归属权看缩进,而不像C/C++看花括号
{}
示例如下:
1
2
3
4 a = input("你多大了?")
if a >= 18:
print("你成年了")
print("时间过得真快啊")如果
a>=18
,将输出如下代码:
1
2 你成年了
时间过得真快啊如果
a<18
,将输出如下代码:
1 时间过得真快啊这里可以明显看到,
print("你成年了")
是受if
判断输出。而print("时间过得真快啊")
不受if
判断的影响,无论a
是否大于18
,都输出。
这里可以看出:缩进相同的代码,运行等级也相同
if else语句
基本格式如下:
1 | if 条件: |
意思是:
- 如果
if
条件成立,执行代码块1
- 如果
if
条件不成立,执行代码块2
注意:
if
和else
的等级相同,缩进必须相同
代码实践
写一个“我要买票吗?”的程序,要求如下:
- 18岁以下免票
- 18岁及18岁以上需要买票
代码示例
1 | age = int(input("请输入你的年龄:")) |
if elif else语句
基本格式如下:
1 | if 条件1: |
意思是:
- 如果
if
条件1成立,执行代码块1
- 如果
if
条件1不成立,执行elif
后的条件2 - 如果
elif
后的条件2成立,执行代码块2
- 如果
elif
后的条件2不成立,执行else
后的代码块3
执行第n
个代码块的要求是:
- 前
n-1
个代码块的条件都不成立 - 第
n
个代码块的条件成立
elif
可以有多个,但是else
只能有一个
代码实践
写一个“猜数字”的程序,要求如下:
- 由系统设置猜数的值为
10
- 玩家有3次机会猜数字
- 猜对了,提示
“你猜对了”
- 猜错了,则进行下一次猜测
- 玩家3次都猜错了,提示
“很遗憾,没有猜对”
,并告知玩家系统设置的数值
代码示例
1 | #设置一个猜想数字 |
判断语句的嵌套
在生活中,我们不仅能碰到这种:如果……就,否则如果……就,否则
的情况,更多的可能是分支结构,如下图
想写成上面的样子,格式如下:
1 | if 条件1: |
这里我们可以清楚地看出,程序先对条件1
进行判断,再执行第二层嵌套的if-else
代码实践
写一个“游乐园购票”的程序,要求如下:
- 18岁以下免票,18岁以上票价10元
- VIP等级>3的,免票入园
- 优先判断年龄,再判断VIP等级
代码示例
1 | #让用户输入自己的年龄 |
while循环
循环,顾名思义,就是程序一直绕圈,走重复的路,如下图:
意思是:如果条件
成立,就执行代码块
,执行完代码块
后,再次判断条件
,如果条件
成立,就再次执行代码块
,直到条件
不成立,循环结束
基础应用
基本格式如下:
1 | while 条件: |
这么写可能不是很清晰,下面是一个代码示例:
1 | #设置一个变量 |
意思是:如果
a<=5
,就执行print(a)
和a = a + 1
,执行完后,再次判断a<=5
,如果成立,就再次执行print(a)
和a = a + 1
,直到a>5
,循环结束
所以输出的结果如下:
1 | 1 |
代码实践
写一个“1-100的累加”的程序,要求如下:
- 计算1-100的累加和
- 用
while
循环实现
代码示例
1 | #设置一个变量 |
嵌套应用
循环语句的嵌套,本质上和判断语句的嵌套是一样的,如下图:
程序会在执行第一个循环后,进入第二个循环,直到从第二个循环中离开,才会继续执行第一个循环
示例程序如下:
1 | #设置一个变量 |
输出结果:
1 | a= 1 |
可以看到a
的赋值没有直接从1
变到3
,而是在中间加入了b
的循环,当b
的循环结束后,才会执行a的循环
for循环
除了while循环语句外,Python同样提供了for循环语句。两者能完成的功能基本差不多,但仍有一些区别:
- while循环的循环条件是自定义的,自行控制循环条件
- for循环是一种“轮询”机制,是对一批内容进行逐个处理
简单地说:
while
循环不知道要循环多少次(自定义循环)for
循环知道要循环多少次(数据集的大小)
for循环基础语法
基本格式如下:
1 | for 临时变量 in 待处理数据集: |
这里我们还是以一个简单的代码示例来展示:
1 | name = "python" |
输出结果:
1 | p |
可以看出,for循环是将字符串的内容依次取出。
所以,for循环也被称之为遍历循环。
下附示意图:
代码示例
写一个“查询语句字母”的程序,要求如下:
- 输入一个字符串
- 输出该字符串中
a
的数量
代码示例
1 | #让用户输入一个字符串 |
range语句
刚才我们学习了for
循环,但后面的待处理数据集
只能是顺序类型
顺序类型:字符串、列表、元组、集合、字典等
range
语句,可以帮助我们快速的获取一个数字序列
- 语法1
range(n)
,生成一个从0到n-1的数字序列 - 语法2
range(m,n)
,生成一个从m到n-1的数字序列 - 语法3
range(m,n,k)
,生成一个从m到n-1的数字序列,公差为k
如下程序可验证:
1 | for i in range(3): |
输出结果:
1 | 012 |
for循环临时变量作用域
上面提到了for
循环的构型,其中有临时变量
这一部分。
那么我们能否在循环外访问到这个临时变量
呢?
1 | for i in range(4): |
此时,编译器会出现警告
但此时如果无视风险强制运行的话,也能运行的出来
1 | 0 |
可以看到,虽然临时变量i
的作用域应该在for
循环内,但是在循环外依然可以调用
但是这种行为是很不推荐的!!!正确写法如下:
1 | i = 0 #先初始化 i 再循环 |
for循环的嵌套
这个板块和while
循环的嵌套的内容相似,不再赘述,示例代码如下:
以向小美表白的案例为例
- 坚持表白100天
- 每天送花10束
1 | i = 1 |
循环中断:continue 和 break
continue
continue
关键字用于:中断本次循环,直接进入下一次循环continue
可以用于:for
循环和while
循环,效果一致
现在以for
循环为例:
- 在循环内,遇到
continue
就结束当次循环,进行下一次,所以语句2
是不会执行的 - 应用场景:在循环中,因某些原因,临时结束本次循环。
break
break
关键字用于:中断本次循环,直接进入下一次循环break
可以用于:for
循环和while
循环,效果一致
现在以for
循环为例:
- 在循环内,遇到
break
就结束循环,所以语句2
是不会执行的 - 应用场景:在循环中,因某些原因,永久结束循环。
Python函数
函数介绍
函数:组织好的
,可重复使用的
,实现特定功能
的代码块
这么说可能有点抽象,那我们还是结合代码来解释一下:
- 假如我想写一个程序,分析用户输入字符串的长度
1 | i = 0 |
- 此时我们发现,若只有一个字符串,这个代码还是可以完全胜任的,但若是有多个字符串,并需要分别输出对应的长度,就要重复这个代码多次,使得程序变得庞大,不利于运行和维护
所以我们可以来定义一个函数,代表这个重复部分的代码(封装重复代码),从而简化代码的编写:
1 | def str_len(str): #定义一个函数 ~ def 函数名(参数): ~ str为传进来的参数 |
此时,我们来比较传统写法和这种写法:
1 | i = 0 |
1 | str1 = "python" |
不难发现,函数写法在行数上都比传统写法省了好多,那运行速度和可读性肯定更高啦~
函数的定义
定义语法:
1 | def 函数名(参数): |
调用参数的时候,需要按照以下格式:
1 | 函数名(参数) |
函数的传入参数
传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据
下面是一个简单函数:
1 | def add(): |
我们无论在什么时候调用这个函数,输出的结果永远是1 + 2
的,但如果我想用该函数计算别的数值,那么就需要传入参数来辅助
1 | def add(a,b): |
此时,我们这个函数计算的是a + b
的值,而a
和b
两个值是从调用函数时传入的参数得到的
1 | def add(a,b): |
输出:
1 | 3 |
可以看到,我们传入的参数分别是1
和2
,3
和4
,所以输出的结果是3
和7
,而非固定值,加大了函数的可操作性
- 形式参数(形参)函数定义中,提供的
a
和b
,称之为:形式参数(形参),表示函数声明将要使用2个参数- 参数之间使用逗号进行分隔
- 函数调用中,提供的
1
和2
,称之为:实际参数(实参),表示函数执行时真正使用的参数值- 传入的时候,按照顺序传入数据,使用逗号分隔
代码实践
写一个“判断体温是否正常”的程序,要求如下:
- 定义一个函数,名称任意
- 接受一个参数传入(数字类型,表示体温)
- 在函数内进行体温判断(正常范围小于等于37.5度)
- 若体温正常,则输出“体温正常”
- 若体温异常,则输出“体温异常”
代码示例
1 | #写一个判断体温的函数 |
函数的返回值
函数返回值的定义语法
程序中的返回值,在生活中可以有很多例子来表示,例如:
- 我让小明给我买3瓶可乐
- 小明买可乐
- 小明给我三瓶可乐
其中,小明给我三瓶可乐
,就是返回值
在函数中,返回值是这样的:
1 | def add(a,b): |
输出:
1 | 3 |
return
的作用:- 结束函数的执行
- 把返回值返回给调用者【在这个程序中,相当于使
i = add(1,2) = result
】
- 函数体中,
return
后的语句不会执行
函数返回值的None
类型
None
类型表示什么都没有None
和0
是不同的return
如果不返回任何数据,就会返回None
- 函数体中没有
return
,默认返回None
None作为一个特殊的字面量,用于表示:空、无意义,其有非常多的应用场景。
- 用在函数无返回值上(函数只干活,不需要返回值)
1 | def add(a,b): |
- 用在if判断上
- 在if判断中,None等同于False
- 一般用于在函数中主动返回None,配合if判断做相关处理
1 | #检测是否成年 |
- 用于声明无内容的变量上
- 定义变量,但暂时不需要变量有具体值,可以用None来代替
1 | #暂不赋予具体变量 |
函数说明文档
函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低
我们可以给函数添加说明文档,辅助理解函数的作用
语法如下:
1 | def 函数名(参数1,参数2,参数3...): |
通过多行注释
的形式,对函数进行说明解释
- 内容应写在函数体之前
函数的嵌套调用
到目前为止,我们已经学过两个嵌套调用了,想必也是对嵌套调用比较熟悉
函数的嵌套调用,顾名思义,一个函数套一个函数呗
示例代码如下:
1 | def func_b(): |
- 函数嵌套调用的执行流程
- 调用函数A
- 函数A执行到
func_b()
,发现有函数B,于是暂停A的执行,转而去执行函数B - 函数B执行完,返回函数A,从暂停的位置继续执行
- 函数A执行完
运行结果如下:
1 | 我是函数A |
函数中变量的作用域
变量作用域:指的是变量的作用范围(变量在哪里可用,在哪里不可用)
主要分为两类:局部变量和全局变量
全局变量
定义在函数体内部的变量,仅在函数内部生效(作用域在函数内)
1 | def func1(): |
- 变量
a
是定义在func1
函数内部的变量,在函数外部访问/另外函数内访问则立即报错 - 局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量
全局变量
定义在函数体外部的变量,在整个程序范围内都可以使用(作用域在整个程序内)
1 | a = 10 |
只要将a
定义在函数体外部,那么a
就是全局变量,就能在程序的任意位置使用
global关键字
我们在func2
中更改a
的值,最终输出结果并没有影响到全局变量a
在其他位置的赋值
1 | a = 10 |
这是因为a
在func2
中,变成了局部变量,而修改这个局部变量不会影响到全局变量
但,我们就是想要在func2
中改变全局变量a
的值,该怎么办呢?
我们可以使用global
关键字,来声明变量a
是全局变量,这样就可以在函数中修改全局变量了
1 | a = 10 |
此时我们可以看到,全局变量a
的值也被修改了
程序实战
完成一个“银行ATM”程序
- 程序启动后,
显示银行名称
:“耄耋银行”,并提醒用户输入用户名密码
默认用户名
:“admin”默认密码
:“123456”
- 如果
用户名和密码错误
,则输出“用户名或密码错误”
,并允许重复输入三次
- 如果
三次均输入错误
,则输出“您已被锁定”
,并退出程序
- 如果
用户名和密码正确
,则输出“登录成功”
- 登录成功后,显示
功能菜单
查询余额
- 显示余额(默认余额
10000
)
- 显示余额(默认余额
取款
提示用户输入取款金额
判断用户输入金额是否大于余额
- 如果
大于余额
,则输出“余额不足”
- 如果
小于等于余额
,则更新余额
,并输出“取款成功”
- 如果
存款
提示用户输入存款金额
更新余额
,并输出“存款成功”
退出
- 用户选择
退出
功能,则显示“谢谢使用,欢迎下次光临”
,并退出程序
流程图:
程序范例:
1 | # 定义余额 |
数据容器入门
Python中的数据容器:
一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素
每一个元素,可以是任意类型的数据,如字符串
、数字
、布尔
等。
如果我们想记录一组名字,按照老办法,我们可以定义多个变量,每个变量都用来记录一个名字
1 | name1 = "张三" |
主播主播,这么记录确实很快捷,但是如果有10000个名字,我们是不是要定义10000个变量呢?有没有更简单高效的表示方法?
有的兄弟,有的,我们可以使用数据容器
来记录一组数据
数据容器有
列表
、元组
、集合
、字典
,我们会在后面的章节中逐个学习
1 | names = ["张三","李四","王五","赵六"] |
这样一行就解决了原来需要写四行的代码,真是简单而高效,EE又ZZ
数据容器根据特点的不同,如:
- 是否支持重复元素
- 是否可以修改
- 是否有序,等
分为5类,分别是:列表(list)
、元组(tuple)
、字符串(str)
、集合(set)
、字典(dict)
我们将一一学习它们
数据容器:list(列表)
列表的定义
定义语法:
1 | # 字面量 |
列表内的每一个数据,我们可以叫它元素
- 以
[]
为标识 - 每个
元素
之间用逗号隔开
列表的下标索引
如何从列表中取出特定位置的数据呢?
我们可以使用:下标索引
格式如下:
1 | 列表名称[下标索引] |
下标索引
也分为正向索引
和反向索引
两种
正向索引
从前往后取正向索引
列表的构造如下图所示:
可以看到:
- 列表的下标索引从
0
开始 - 每个
元素
都有一个下标索引,用来标识它在列表中的位置 - 我们可以使用下标索引来取出列表中的元素
- 下标索引的取值范围是:
0 ~ n-1
示例如下:
1 | names = ["张三","李四","王五","赵六"] |
反向索引
从后往前取反向索引
列表的构造如下图所示:
可以看到:
- 反向索引的下标索引从
-1
开始 - 每个
元素
都有一个反向索引,用来标识它在反向列表中的位置 - 我们可以使用反向索引来取出列表中的元素
- 反向索引的取值范围是:
-n ~ -1
示例如下:
1 | names = ["张三","李四","王五","赵六"] |
嵌套列表的下标索引
嵌套列表
也支持下标索引,结构如下:
1 | 列表名称[下标索引1][下标索引2] |
意思是:先取出下标索引1
的元素,再取出这个元素的下标索引2
的元素
示例如下:
1 | names = [["张三","李四"],["王五","赵六"]] |
列表的常用操作
上面是列表的常用操作,下面我们将分门别类的讲解如何使用:
列表的查询功能(.index)
查找某元素的下标
功能:查找指定元素在列表的下标,如果找不到,报错ValueError
语法:列表.index(元素)
index
就是列表对象(变量)内置的方法(函数)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
注意!
- 如果列表中存在多个相同的元素,
index
方法只会返回第一个元素的下标- 如果要查找的元素不在列表中,会报错
ValueError
- 嵌套列表中,
index
方法只能查找第一层的元素
列表的修改功能(修改特殊位置的值)
语法:列表[下标索引] = 新值
可以使用如上语法,直接对指定下标(正向、反向下标均可)的值进行:重新赋值(修改)
1 | names = ["张三","李四","王五","赵六"] |
注意!
- 列表的下标索引不能越界,否则会报错
IndexError
- 修改功能支持
正向索引
和反向索引
列表的插入功能(.insert)
语法:列表.insert(下标索引,元素)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
列表的元素追加(.append / .extend)
.append
功能:在列表的末尾追加元素
语法:列表.append(元素)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
.extend
功能:在列表的末尾追加多个元素
语法:列表.extend(多个元素)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
列表的删除功能(.remove / .pop / del / clear)
.remove
功能:根据元素的值
删除元素
语法:列表.remove(元素)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
注意!
如果要删除的元素有多个,只会删除第一个
1
2
3 names = ["张三","李四","王五","赵六","张三"]
names.remove("张三") # 删除元素 "张三"
print(names) # ["李四","王五","赵六","张三"] 只删除了第一个 "张三"
.pop
功能:根据下标索引
删除元素
语法:列表.pop(下标索引)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
.dle
功能:根据下标索引
删除元素
语法:del 列表[下标索引]
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
.clear
功能:清空列表内的所有元素
语法:列表.clear()
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
列表内元素数量统计(len)
功能:统计列表内元素的数量
语法:len(列表)
使用示例如下:
1 | names = ["张三","李四","王五","赵六"] |
列表内重复元素数量统计(.count)
功能:统计列表内指定元素的数量
语法:列表.count(元素)
使用示例如下:
1 | names = ["张三","李四","王五","赵六","张三"] |
列表的遍历
while循环
遍历
既然数据容器可以存储多个元素,那么,就会有需求从容器内依次取出元素进行操作
将容器内的元素依次取出进行处理的行为,称之为:遍历、迭代
如何遍历列表的元素呢?
- 可以使用
while循环
如何在循环中取出列表的元素呢?
- 使用列表
[下标]
的方式取出
循环条件如何控制?
- 定义一个变量表示下标,从
0
开始 - 循环条件为 下标值
<
列表的元素数量
下面是示例代码:
1 | i = 0 |
for循环
遍历
相比较于while循环
来说,for循环
完成该工作的效果更好,因为从for循环
的基础结构中可以看出,是对每一项中的数据进行调出的,更加适合遍历
操作
下面是示例代码:
1 | names = ["张三","李四","王五","赵六"] |
明显的,完成同样遍历任务,
for循环
代码量小于while循环
数据容器:tuple(元组)
元组
和列表
一样,都可以封装多个不同类型的元素,但也有区别:
元组
内的元素是不可修改
的所以,当我们需要在程序内封装数据,又不希望封装的数据被篡改,那么元组就非常合适了
例如:某人的身份证号码、银行卡号、手机号之类的数据
定义元组
1 | # 定义元组 |
注意!
定义单个元素的元组时,要在元素后面加上,
否则无法识别出元组
1 | t1 = ("python") |
输出如下:
1 | <class 'str'> |
可以看到,如果不加,
系统不会将其视为元组,而是视为原本的数据类型
元组的运用与相关操作
元组
和列表
的语法基本相同,可以参考上文关于列表的部分,在此做出引用:
元组运用:元组索引、元组的遍历、元组的嵌套
相关操作:元组的长度统计(len)、元组内重复元素数量统计(.count)、元组的查询功能(.index)
上面我们提到,元组无法进行修改操作,但是在元组内嵌套列表
的情况下是可以的
1 | t1 = (1,2,3,["a","b","c"]) # 创建一个带列表的元组 |
输出如下:
1 | (1, 2, 3, ['A', 'b', 'c']) |
可以看到,元组内嵌套的列表的元素是可以被修改的,这也是元组内唯一的可更改的操作
数据容器:str(字符串)
尽管字符串看起来并不像:列表、元组那样,一看就是存放了许多数据的容器
但不可否认的是,字符串同样也是数据容器的一员。
字符串是字符的容器,一个字符串可以存放任意数量的字符
如字符串:"python"
字符串的运用与相关操作
字符串的一般运用操作
字符串
和列表
的语法基本相同,可以参考上文关于列表的部分,在此做出引用:
字符串的运用:字符串索引、字符串的遍历
相关操作:字符串的长度统计(len)、字符串内重复元素数量统计(.count)、字符串的查询功能(.index)
1
2
3
4 word = "i love python"
print(len(word)) # 13 (说明 word 字符串有13个字符)
print(word.index("o")) # 2 (说明 "o" 在 word 字符串的下标为2)
print(word.count("o")) # 2 (说明 word 字符串内有2个 "o")
字符串的特殊操作
字符串的替换
语法:字符串.replace(字符串1,字符串2)
功能:将字符串1
的内容替换为字符串2
的内容
注意:字符串.replace
的操作不会改变原字符串,而是返回一个新的字符串
1 | word = "i love python" |
输出如下:
1 | i love python |
可以看到,word
字符串内的内容并没有改变,只是返回了一个新的字符串
字符串的分割(.split)
语法:字符串.split(分割字符串)
功能:将分割字符串
的内容作为分隔符,对字符串
进行分割,并存入列表对象
中
注意:字符串.split
的操作不会改变原字符串,而是返回一个新的列表对象
1 | word = "i love python" |
输出如下:
1 | 原字符串:i love python,分割后的列表:['i', 'love', 'python'],格式为<class 'list'> |
字符串的规整(.strip)
这一部分比较抽象,建议看一下B站的视频,这里是转跳链接:视频链接
语法:字符串.strip()
、字符串.strip(去除前后指定字符串)
功能:将字符串
首尾的空格、换行符等去掉
注意:字符串.strip
的操作不会改变原字符串,而是返回一个新的字符串
1 | word = " i love python " |
输出如下:
1 | 原字符串: i love python ,去除首尾空格后的字符串:i love python |
可以看到,word
字符串内的内容并没有改变,只是返回了一个新的字符串
数据容器(序列)的切片
序列的定义
序列是指:内容连续、有序,可使用下标索引的一类数据容器
列表、元组、字符串,均可以可以视为序列。
序列的切片
作用:从一个序列中,取出一个新的序列
语法:序列[开始索引:结束索引:步长]
表示从序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个新序列:
- 起始下标表示从何处开始,可以留空,留空视作从头开始
- 结束下标(不含)表示何处结束,可以留空,留空视作截取到结尾
- 步长表示,依次取元素的间隔
- 步长1表示,一个个取元素
- 步长2表示,每次跳过1个元素取
- 步长N表示,每次跳过N-1个元素取
- 步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记)
示例:
1 | a = [0,1,2,3,4,5] |
输出:
1 | [0, 2, 4] |
数据容器:set(集合)
之前我们学习的列表
、元组
、字符串
都是有序的,支持重复元素
但是集合
中的元素是无序的,且不支持重复元素(自动去重)
集合定义
语法:{元素1,元素2,……}
1 | # 定义集合字面量 |
下面我们来验证集合
的自动去重
和无需性
:
1 | my_set = {"I","love","Python","I","love","Python","I","love","Python"} |
输出:
1 | my_set中的内容是:{'love', 'Python', 'I'},它的类型是:<class 'set'> |
可以明显的看到,输出集合内容的时候,把重复的I
、love
、Python
去掉了,并且最后输出是无序的
注意注意!集合是无序的,所以无法使用下标来访问集合中的元素
集合的基础操作
集合的操作包括:添加
、删除
、随机取出
添加(.add)
语法:变量名.add(元素)
下面是是示例:
1 | my_set = {1,2,3} |
输出结果如下:
1 | {1, 2, 3} |
成功的将元素4
添加到集合中
删除(.remove)
语法:变量名.remove(元素)
下面是是示例:
1 | my_set = {1,2,3} |
输出结果如下:
1 | {1, 2, 3} |
成功的将元素3
从集合中删除
随机取出(.pop)
好熟悉的.pop
,在之前学列表
的时候提到过【点击转跳】,但是在集合
中,由于无法指定下标来取出元素,.pop
就会随机取出一个元素,同时在原本的集合中,取出的元素也会被删除
语法:变量名.pop()
下面是示例:
1 | my_set = {1,2,3} |
输出结果如下:
1 | 2 |
可以看到,随机取出了集合中的元素2
(当然也可能是1
或3
)
清除(.clear)
哇,这个.clear
更熟悉了,依旧在之前学列表
的时候提到过【点击转跳】,甚至连语法和功能都完全相同
语法:集合.clear()
下面是示例:
1 | my_set = {1,2,3} |
输出结果如下:
1 | {1, 2, 3} |
可以看到,成功的将集合中的所有元素删除了,只剩下一个空集合
统计元素(len())
好好好,又是老朋友,不多说了,看列表的吧!【点击跳转】
遍历
因为集合
无法使用下标的特殊性,所以不可以用while循环
遍历,只能用for循环
下面是代码示例:
1 | my_set = {1,2,3} |
输出结果如下:
1 | 1 |
会随机但是完整的print
出my_set
中的所有元素
集合的运算
首先,我们先要认识到,集合set
就是数学中的集合,所以数学中集合的运算方式也适用于这里的集合运算
- 交集 ∩
- A∩B,表现在图中黄色区域
- 并集 ∪
- A∪B,表现在图中绿色区域
- 差集 -
- A-B,表现在图中红色区域
交集
语法:集合1.intersection(集合2)
功能:返回一个新集合
,该集合包含集合1
和集合2
中的公共元素
下面是示例:
1 | set1 = {1,2,3} |
输出结果如下:
1 | {2, 3} |
并集
语法:集合1.union(集合2)
功能:返回一个新集合
,该集合包含集合1
和集合2
中的所有元素
下面是示例:
1 | set1 = {1,2,3} |
输出结果如下:
1 | {1, 2, 3, 4} |
差集
语法:集合1.difference(集合2)
功能:返回一个新集合
,该集合包含集合1
中所有不在集合2
中的元素
下面是示例:
1 | set1 = {1,2,3} |
输出结果如下:
1 | {1} |
可以看到,set3
中只包含了set1
中不在set2
中的元素1
去除差集
语法:集合1.difference_update(集合2)
功能:修改集合1
,删除其中和集合2
内相同的元素
下面是示例:
1 | set1 = {1,2,3} |
输出结果如下:
1 | {1} |
去除了集合1
中和集合2
重复的元素,并将集合1
中独有的元素保留下来
数据容器:dict(字典)
生活中,我们会用到字典,其主要使用方法是通过字
来查询字的含义
,在python中,字典也是这样的,只不过是通过关键字
key查询值
value
字典的定义
语法如下:{关键字:值,关键字:值,关键字:值}
下面是示例:
1 | my_dict = {'apple': '苹果', 'banana': '香蕉', 'orange': '橙子'} |
输出结果如下:
1 | 苹果 |
可以看到,通过apple
查询到了苹果
尽管,字典中不允许重复的关键字存在,但是,如果我们将关键字
apple
重复一次,并赋上不同的值
,会发生什么呢?
1 | my_dict = {'apple': '小苹果', 'apple': '大苹果'} |
输出结果如下:
1 | 大苹果 |
可以看到,如果在字典里有两个相同的关键字,查询时会显示最后一个关键字的值
嵌套字典
现在出现了一个问题,假如我需要做一个成绩统计的程序,该怎么办呢?
一个字典可以表示张三、李四、王五,或者表示语文、数学、英语的成绩,但是想把姓名和成绩联系起来就会有点困难了,此时,我们可以使用嵌套字典,下面是示例:
1 | # 在 姓名 的字典中,嵌套一个 分数 的字典 |
此时,我们已经创立好了一个嵌套字典,但是该怎么调出某个学生对应的分数呢?
这里我们以张三 の 语文
为例
1 | print(stu_score["张三"]["语文"]) # 语法:字典名[外层关键字][内层关键字] |
输出结果如下:
1 | 96 |
可以看到,通过嵌套调用的方式,成功的调出了张三的语文成绩
注意!嵌套字典只能出现在
value
中,不能出现在key
中
字典的常用操作
新增元素、更新元素
语法:字典[key] = value
若[key]
在原字典中不存在,则新建一个key : value
若[key]
在原字典中存在,则使key : value
覆盖[key]
对应的原始数据
示例代码如下:
1 | my_dict = {'apple': '苹果', 'banana': '香蕉', 'orange': '橙子'} |
输出结果如下:
1 | 更新前: {'apple': '苹果', 'banana': '香蕉', 'orange': '橙子'} |
删除元素
语法:字典.pop(key)
功能:删除key
对应的键值对
下面是示例:
1 | my_dict = {'apple': '小苹果', 'banana': '香蕉', 'orange': '橙子', 'peach': '桃子'} |
输出结果如下:
1 | 删除前: {'apple': '小苹果', 'banana': '香蕉', 'orange': '橙子', 'peach': '桃子'} |
删除所有元素
语法:字典.clear()
功能:删除字典中的所有元素
下面是示例:
1 | my_dict = {'apple': '小苹果', 'banana': '香蕉', 'orange': '橙子', 'peach': '桃子'} |
输出结果如下:
1 | 删除前: {'apple': '小苹果', 'banana': '香蕉', 'orange': '橙子', 'peach': '桃子'} |
获取所有键
语法:字典.keys()
功能:返回一个包含字典所有key
的列表
下面是示例:
1 | my_dict = {'apple': '小苹果', 'banana': '香蕉', 'orange': '橙子', 'peach': '桃子'} |
输出结果如下:
1 | 所有键: dict_keys(['apple', 'banana', 'orange', 'peach']) |
遍历字典
由于字典不支持下标索引,无法使用while循环
遍历,具有和集合
相同的性质【点击转跳】
获取所有值
老朋友len()
,看上面的列表吧【点击转跳】
程序实战
有如下员工信息,请使用字典完成数据的记录
并通过for循环,对所有级别为1级的员工,级别上升1级,薪水增加1000元
姓名 | 部门 | 工资 | 级别 |
---|---|---|---|
张三 | 科技部 | 3000 | 1 |
李四 | 市场部 | 5000 | 2 |
王五 | 市场部 | 7000 | 3 |
赵六 | 科技部 | 4000 | 1 |
流程图:
1 | # 创建雇员字典 |
数据容器的通用操作
遍历
- 五类数据容器
列表
、元组
、集合
、字典
、字符串
都支持for循环
遍历 列表``元组``字符串
支持while循环
,字典
、集合
由于没有下标索引,无法使用while循环
通用统计操作
len
、max
、min
len(容器)
:输出容器的大小
示例:
1 | my_list = [1,2,3,4,5] |
输出结果如下:
1 | 列表的长度为: 5 |
max(容器)
:输出容器中的最大值
示例:
1 | my_list = [1,2,3,4,5] |
输出结果如下:
1 | 列表的最大值为: 5 |
min(容器)
:输出容器中的最小值
示例:
1 | my_list = [1,2,3,4,5] |
输出结果如下:
1 | 列表的最小值为: 1 |
容器的通用转换功能
list(容器)
将给定容器转换为列表tuple(容器)
将给定容器转换为元组str(容器)
将给定容器转换为字符串set(容器)
将给定容器转换为集合
list
list(容器)
将给定容器转换为列表
功能:将给定容器转换为列表
注意!在将
字符串
和字典
转化为列表的时候,每一个字符都是单独的一个元素,字典只保留key,不保留value
示例:
1 | my_str = "12345" |
输出结果如下:
1 | 字符串转换为列表: ['1', '2', '3', '4', '5'] |
tuple
tuple(容器)
将给定容器转换为元组
功能:将给定容器转换为元组
注意!在将
字符串
和字典
转化为元组的时候,每一个字符都是单独的一个元素,字典只保留key,不保留value
示例:
1 | my_str = "12345" |
输出结果如下:
1 | 字符串转换为元组: ('1', '2', '3', '4', '5') |
str
str(容器)
将给定容器转换为字符串
功能:将给定容器转换为字符串
示例:
1 | my_list = [1,2,3,4,5] |
输出结果如下:
1 | 列表转换为字符串: [1, 2, 3, 4, 5] |
set
set(容器)
将给定容器转换为集合
功能:将给定容器转换为集合
注意!在将
字符串
和列表
转化为集合的时候,每一个字符都是单独的一个元素,字典只保留key,不保留value
示例:
1 | my_list = [1,2,3,4,5] |
输出结果如下:
1 | 列表转换为集合: {1, 2, 3, 4, 5} |
容器的通用排序功能
语法:sorted(容器,[reverse=True])
作用:将给定容器进行排序
示例:
1 | my_list = [1,2,3,4,5] |
输出:
1 | 列表排序为: [1, 2, 3, 4, 5] |