python学习笔记(基础知识大全)
一、初认python
1991年第一个python解释器诞生了,开发者为:吉多范罗苏姆。
Python的名字源自吉多范罗苏姆喜爱的综艺节目:Monty Python's Flying Circus
二、什么是编程语言?
概念:人类和计算机交流的一种专有领域语言
工作原理:将人类的想法,翻译成计算机可以识别的二进制,让计算机工作
三、python解释器
(1)计算机只认识:0和1二进制
python解释器的功能:将Python代码编译为计算机能够识别的二进制形式
(3)“xx.py”结尾的文件:Python语言的代码文件,里面记录的python的代码
(4)ython的解释器程序在
四、字面量
| 类型 | 描述 | 说明 |
|---|---|---|
| 数字(Number) | 整数(int) 浮点数 (float) 复数(complex) 布尔 (bool) | 复数(complex)如:4+3j,以j结尾表示复数 布尔(bool)表达现实生活中的逻辑,即真和假,True表示真,False表示假。True本质上是一个数字记作1,False记作0 |
| 字符串(String) | 描述文本的一种数据类型 | 字符串(string)由任意数量的字符组成 |
| 列表(List) | 有序的可变序列 | Python中使用最频繁的数据类型,可有序记录一堆数据 |
| 元组(Tuple) | 有序的不可变序列 | 可有序记录一堆不可变的Python数据集合 |
| 集合(Set) | 无序不重复集合 | 可无序记录一堆不重复的Python数据集合 |
| 字典(Dictionary) | 无序Key-Value集合 | 可无序记录一堆Key-Value型的Python数据集合 |
五、注释
(1)注释:在程序代码中对程序代码进行解释说明的文字。
(2)作用:注释并非独立运行的程序代码,并不可作为独立代码执行;仅仅作为对代码内容的解释辅助工具使用,并不改变程序的基本功能与行为逻辑;其主要作用是为他人提供关于程序逻辑与实现细节的理解支持,并非替代开发者的思维过程;通过注释的存在与运用能够让整个项目开发团队更加高效地协作编写与维护系统代码;同时能够显著提升整个项目的文档化程度与知识传承效率。
(3)单行注释:在Markdown中用 #符号标注的代码行会被系统识别为注释信息使用
# 输出你好世界
print("你好世界")
python
多行连续注释:用三对双引号括起来("""注释内容""")用来解释说明一段代码的作用和使用方法
"""
我是多行注释
我喜欢一键三连
(doge)
"""
print("祝大家:")
print("身体健康")
print("心想事成")
python
六、变量
(1)变量:在程序时,能储存计算结果或能表示值的抽象概念。
(说人话就是:在程序时,记录数据用的)
(2)变量的定义格式: 变量名称 = 变量的值
每一个变量都有自己的名称,称之为:变量名,也就是变量本身
每一个变量都有自己存储的值(内容),称之为:变量值
“=” 赋值,表示将等号右侧的值,赋予左侧的变量
七、数据类型
(1)我们可以通过type()语句来得到数据的类型:
test = "我爱修仙"
print(type(test))
tes = 123456
print(type(tes))
te = True
print(type(te))
print(type(10.15))
python
结果为:

思考一下变量有没有类型?
答:变量没有类型,但是变量存储的数据有类型
八、数据类型转换
常见的类型转换的语句是:
| 函数 | 说明 |
|---|---|
| int(x) | 将x转换为一个整数(浮点数转换成整数时会丢失精度) |
| float(x) | 将x转换为一个浮点数 |
| str(x) | 将x转换为字符串 |
思考是不是什么类型都可以转成字符串,字符串也可以转成任意类型?
任何类型的变量都可以转化为字符串形式;然而对应的字符串变量却无法还原为其他类型的原始数据。例如只有由纯数字字符构成的字符串变量才可以被解析为数值型数据
九、标识符
1、规则:
内容限定;大小写敏感;不可使用关键字
2、内容限定:
命名中只允许出现:英文,中文(不推荐),数字,下划线(_),其中数字不能开头
3、常见关键字:
python常见关键字| False| True| None| and| as| assert| break| class |
| --- | --- | --- | --- | --- | --- | --- | --- |
|---|---|---|---|---|---|---|---|
| from | global | if | import | in | is | lambda | nonlocal |
| not | or | pass | raise | return | try | while | with |
4、命名规范:
①见名知意 例如:班级名称命名为class_name
②下划线命名法 例如:班级名称命名为class_name,而不是classname
③英文名字全小写 例如:班级名称命名为class_name,而不是Class_Name
十、运算符
1、算数运算符
算术(数学)运算符| 运算符| 描述| 实例 |
| --- | --- | --- |
|---|---|---|
| - | 减 | 得到负数或是一个数减去另一个数 a - b 输出结果 -6 |
| * | 乘 | 两个数相乘或是返回一个被重复若干次的字符串 a*b 输出结果666 |
| / | 除 | b / a 输出结果 6 |
| // | 取整除 | 返回商的整数部分 65//6 输出结果 5,65.0//6.0 输出结果 5.0 |
| % | 取余 | 返回除法的余数 b % a 输出结果 0 |
| ** | 指数 | a**b为2的3次方,输出结果8 |
2、赋值运算符
赋值运算符| 运算符| 描述| 实例 |
| --- | --- | --- |
|---|
3、复合赋值运算符
复合赋值运算符| 运算符| 描述| 实例 |
| --- | --- | --- |
|---|---|---|
| -= | 减法赋值运算符 | b -= a 等效于 b = b - a |
| *= | 乘法赋值运算符 | c = a 等效于 c= c a |
| /= | 除法赋值运算符 | c /= a 等效于 c = c / a |
| %= | 取模赋值运算符 | c %= a 等效于 c = c % a |
| **= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
| //= | 取整除赋值符 | c //= a 等效于 c=c // a |
十一、字符串的定义
字符串在Python中有多种定义形式:
# 1.单引号定义法:
name = ' 我爱三连 '
# 2.双引号定义法:
name = " 我爱三连 "
# 3.三引号定义法:
name = """ 我爱三连 """
python
注意事项:在Python中处理多行注释时,请区分以下两种情况:首先,在代码块内部使用三个双引号 """xxx""" 定义多行字符串;其次,在非代码块环境中同样使用三个双引号 """xxx""" 生成多行注释。具体区别在于当将其赋值给一个变量时(即作为字符串),如果没有被赋值,则被视为多行注释。
如果需要在定义的字符串中显示引号的话,则可以选择使用单引号作为字符串的标识符,在这种情况下允许嵌入双引号或双引号标识符,并且也可以嵌入单引号字符;然而,在大多数编程环境中,默认情况下单引号标识符会阻止嵌入其他类型的引用符号;因此为了使字符串中的引用符号能够正常显示并被解析器正确识别通常建议采用转移字符(\)的方法将原本被抑制的引用符号解除有效性;这样处理后可以使字符串内的所有引用符号都被正确解析并显示出来
# 1.单引号定义法:
name = ' "我爱三连" '
# 2.双引号定义法:
name = " '我爱三连' "
# 3.三引号定义法:
name = """ \"我爱三连\" """
python
十二、字符串的拼接
可以通过+来实现字符串的拼接
name = '我爱三连'
print("我是逍朽,"+name)
python
十三、字符串格式化
1、基础知识
可以通过如下语法,完成字符串和变量的快速拼接。
message = '我爱三连'
print("我是逍朽,%s" % message)
python
其中的%表示:我要占位 s表示:将变量变成字符串放入占位的地方
总体而言,意思是:我占据一个位置,并等待有变量到达时将它们转换为字符串放置在占位的位置。
需要注意的是,在使用多个占位符时,应当将每个变量用圆括号括起来,并按照它们出现的顺序依次填入
message = '我爱三连'
blessing = "祝大家心想事成"
print("我是逍朽,%s,%s" % (message,blessing))
python
当然这里不仅可以使用字符串占位,还可以用其他的,常见格式如下:
| 格式符号 | 转化 |
|---|---|
| %s | 将内容转换成字符串,放入占位位置 |
| %d | 将内容转换成整数,放入占位位置 |
| %f | 将内容转换成浮点型,放入占位位置 |
2、数字精度控制
**** 可以使用辅助符号"m.n"来控制数据的宽度和精度
m,控制宽度,要求是数字(很少使用),设置的宽度小于数字自身,不生效
.n,控制小数点精度,要求是数字,会进行小数的四舍五入
示例:
①%5d:表示将整数的宽度控制在5位
如数字13,被设置为5d,就会变成:[空格][空格[空格]13,用三个空格补足宽度。
② %5.2f:表示将宽度控制为5,将小数点精度设置为2
在宽度计算中包含小数点及小数部分。例如,在设置%7.2f格式时(如对数值13.142进行设置),其结果为:填平占位两个空格之后得到 13.14。具体而言,在保留两位小数并进行四舍五入处理后得到了结果 13.14。
③%.2f:表示不限制宽度,只设置小数点精度为2
如13.142设置%.2f后,结果是13.14
思考俩个问题:
Ⅰ、如果m比数字本身宽度还小,会发生什么?
Ⅱ、.n会对小数部分做精度限制,同时进行什么操作?
如果m的长度不足数字本身宽度,则m无效;.n会对数值的小数部分施加精度限制,并对数值的小数部分进行四舍五入处理。
3、快速写法
语法:f"内容{变量}"的格式来快速格式化
说明:采用这种方法时,请无需关注类型;特别适合在不需要精度控制的情况下快速应用。
message = '我爱三连'
blessing = "祝大家心想事成"
print(f"我是逍朽,{message},{blessing}")
python
4、表达式格式化
定义:表达式就是一个具有明确结果的代码语句,如1+1、type(“字符串”)、3*5等
当进行变量定义时,在例如 age11+11 的情况下(即 age 乘以 2 的操作),右侧即为一个表达式,在其中包含具体的计算结果,并将这些结果被赋值为左侧变量
实现:f"{表达式} "%s%d%f"%(表达式、表达式、表达式)
练习
当前已加载至该页面内容。
逍 同学感到高兴。
希望我的文章能协助你更好地理解这些知识。
咱们同等地进行道题练习吧!
(可以将代码发到评论区,看看谁写的更好)
"""
定义如下变量:
name,逍朽
term,爱的期限,比如1万年
index,爱的增长指数,比如5.20
输出:
博主(逍朽)对你们的爱有个期限为1万年。 本行要求使用f"{变量}"的方式输出
当前爱你们的指数为13.14,每年增长5.2,期限到后,指数达到了 本行要求使用%占位符的方式输出,数据准确到小数点后3位
"""
# 定义变量逍朽
name = "逍朽"
# 定义爱的期限为1
term = 1
# 定义爱的增长为5.20
index = 5.20
# 定义当前的指数为13.14
presently = 13.14
#输出第一行
print(f"博主({name}对你们的爱有个期限为{term}万年。)")
print("当前爱你们的指数为%.3f,每年增长%.3f,期限到后,指数达到了%.3f"% (presently, index, presently*index**term))
python

十四、数据输入
在编程中,“input 语句(即 input 函数)与 print 语句(即 print 函数)均能执行将数据项(如字面量或变量等)显示在屏幕上。“ 在 Python 环境中,则存在相对应的 input 语句用于捕获用户输入。
数据输出:print()
数据输入:input()
使用起来非常简便:利用input()函数可以从键盘上获取输入并将获取到的数据进行接收或存储
可以使用:input(提示信息),用以在使用者输入内容之前显示提示信息。
注意:无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型
print("请输入你的名字:")
name = input()
print(f"我知道了,你的名字是:{name}")
name = input("请输入你的名字:")
print(f"我知道了,你的名字是:{name}")
print("请输入你的名字:")
print("我知道了,你的名字是%s" % input())
print(f"我知道了,你的名字是{input()}")
python

十五、布尔类型和比较运算符
布尔类型的字面量:
True表示真(是、肯定)
Flase表示假(否、否定)
定义变量储存布尔类型数据:
变量名称 = 布尔类型字面量
注:可以通过使用比较运算符进行比较运算得到布尔类型的结果
#如下所示:
result = 66 > 6
test = ('a' == 'b')
#result的值为真,test的值为假
python
比较运算符
| 运算符 | 藐视 | 实例 |
|---|---|---|
| == | 判断内容是否相等,满足为True,不满足为False | 如a=6,b=6, 则(a == b) 为 True |
| != | 判断内容是否不相等,满足为True,不满足为False | 如a=1,b=6, 则(a != b) 为 True |
| > | 判断运算符左侧内容是否大于右侧满足为True,不满足为False | 如a=6,b=3, 则(a >b) 为 True |
| < | 判断运算符左侧内容是否小于右侧满足为True,不满足为False | 如a=3,b=6, 则(a <b) 为 True |
| >= | 判断运算符左侧内容是否大于等于右侧满足为True,不满足为False | 如a=3,b=3, 则(a >= b) 为 True |
| <= | 判断运算符左侧内容是否小于等于右侧满足为True,不满足为False | 如a=3,b=3, 则(a <= b) 为 True |
十六、if语句
1、if语句的基本格式:
if 要判断的条件:
条件成立时,要做的事情
if语句的注意事项:
判断条件的结果必须为布尔类型,在结果为True时,则会执行位于if后面的语句;否则则不会执行。
不要忘记判断后的:冒号
属于与if条件相关的代码块应在其前添加4个空格缩进;Python通过缩进来确定代码块所属的关系。
num = int(input("请输入你的三连次数:"))
if num > 0 :
print("感谢你的三连,博主会继续努力的") #此行代码将在判断为真时输出
print("祝你心想事成") #此行代码没有填充4个空格,不属于if判断里面的语句,不管是否为真都会执行
python
判断为真:

判断为假:

2、else语句
如果if语句的条件成立,则会执行相应的操作;否则(即条件不满足)的时候该怎么处理这种情况呢?这时候就需要使用else语句来处理这种情况。
基本语法:
if 条件:
满足条件时的输出1
满足条件时的输出2
...
else:
不满足条件时的输出1
不满足条件时的输出2
...
注:else不需要判断条件,当if的条件不满足时,else执行
else的代码块,同样需要4个空格作为缩进
else与if配合使用,在多个相同缩进层的if结构中,默认遵循就近原则,并与其配对。
num = int(input("请输入你的三连次数:"))
if num > 0 :
print("感谢你的三连,博主会继续努力的") #此行代码将在判断为真时输出
else:
print("这次一定,好不好,555") #此行代码将在判断为假时输出
print("祝你心想事成") #此行代码没有填充4个空格,不属于if判断里面的语句,不管是否为真都会执行
python
3、elif
基本语句:
if条件1:
条件1满足应做的事情
条件1满足应做的事情
...
elif条件2:
条件2满足应做的事情
条件2满足应做的事情
...
elif条件N:
条件N满足应做的事情
条件N满足应做的事情
...
else:
所有条件都不满足应做的事情
所有条件都不满足应做的事情
...
注:可以完成多个条件的判断,elif可以写多个
判断是互斥且有序的,上一个条件满足后面的就不会执行了
可以在条件判断中,直接写input语句,节省代码量
else也可以省略不写,效果相当于3个独立的if判断
num = int(input("请输入你的三连次数:"))
if num > 10 :
print(f"{num}次啊!博主受宠若惊,肥肠感谢你的三连,博主会继续努力的")
elif num > 0:
print("博主肥肠感谢你的三连,窝会继续努力的")
else:
print("这次一定,好不好,555") #此行代码将在判断为假时输出
print("祝你心想事成") #此行代码没有填充4个空格,不属于if判断里面的语句,不管是否为真都会执行
python
4、判断语句的嵌套
大量逻辑判断呈层次分明的多级结构。针对这类场景,我们可以灵活组合if-elif-else语句来实现特定功能目标,并需满足缩进的基本要求。
嵌套的判断语句必须注意空格缩进,在Python中使用空格来决定代码块的层次结构
基础语法格式:
if条件1:
满足条件1做的事情1
满足条件1做的事情2
if 条件2:
满足条件2做的事情1
满足条件2做的事情2
如上图,在第一条if内部有一个第二条(即第二层)的条件判断。只有当第一条条件满足时才会执行第二条嵌套的关键点在于通过缩进程度来确定语句间的层次结构。
age =20
year = 3
level = 1
if age >= 18:
print("你是成年人")
if age< 30:
print("你的年龄达标了")
if year > 2:
print("恭喜你,年龄和入职时间都达标,可以领取礼物")
elif level > 3:
print("恭喜你,年龄和级别大表,可以领取礼物")
else:
print("不好意思,尽管年龄达标,但是入职时间和级别都不达标。")
else:
print("不好意思,年龄太大了")
else:
print("不好意思,小朋友不能领取喔")
python

if练习
我已经在这里了。他很高兴。希望能真正帮助到您。我们一起来复习和巩固关于if知识点的相关内容吧!(如果可以把代码放到评论区的话,请大家互相学习并看看谁写得更好!)
猜数字小游戏:定义一个数字(1~66,随机产生),通过5次判断来猜出来数字
要求:1.数字是电脑随机生成的 可以用random函数
2.有5次机会猜,通过5层嵌套判断实现,用input语句写在判断中(最少一次)
3.每次猜不中,会提示大了或者小了
提示:随机函数代码如下所示
import random # 导入 Python 内置的 random 模块,用于生成随机数
num = random.randint(1, 66) # 使用 random 模块的 randint 方法生成一个 1 到 66 之间(包括 1 和 66)的随机整数,并将其赋值给变量 num
python
解析:这道题的易错点在于
获取input后未做强制数据类型的转换;建议您参考小白笔记01了解相关知识。
将input语句用于判断逻辑中(至少一次)该要求仅允许在最终判断阶段执行一次
import random # 导入 Python 内置的 random 模块,用于生成随机数
num = random.randint(1, 66) # 使用 random 模块的 randint 方法生成一个 1 到 66 之间(包括 1 和 66)的随机整数,并将其赋值给变量 num
guess_num = int(input("请输入你要猜测的数字"))
if guess_num == num :
print("好厉害,第一次就猜中了")
else:
if guess_num < num :
print("你猜测的小啦")
else:
print("你猜测的大啦")
guess_num = int(input("请输入你要猜测的数字"))
if guess_num == num :
print("恭喜,第二次就猜对啦")
else:
if guess_num < num :
print("你猜测的小啦")
else:
print("你猜测的大啦")
guess_num = int(input("请输入你要猜测的数字"))
if guess_num == num:
print("恭喜,第三次就猜对啦")
else:
if guess_num < num:
print("你猜测的小啦")
else:
print("你猜测的大啦")
guess_num = int(input("请输入你要猜测的数字"))
if guess_num == num:
print("恭喜,第四次就猜对啦")
else:
if guess_num < num:
print("你猜测的小啦")
else:
print("你猜测的大啦")
if int(input("请输入你要猜测的数字")) == num:
print("恭喜,第五次就猜对啦")
else:
print(f"很遗憾,数字为{num},你没有猜对")
python

十七、while循环
1.基本语法:
while 条件:
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
···(省略)···
注:条件需提供布尔类型结果,True继续,False停止
空格缩进不能忘
请规划好循环终止条件,否则将无限循环
i = 0
while i < 100:
print("坤,你太梅")
i+=1 # 没有这行代码,程序会一直输出“坤,你太梅”
# 注意:python里面没有i++这个写法
python
if练习再强化:
还记得在if语句中的相关练习题吗?当我们掌握了while循环之后,现在已经能够轻松地完成无限次数猜测的任务.不妨一试哦!如果有兴趣的话,可以把代码发送到评论区哦!
生成一个1至66之间的随机整数变量,并利用while循环结构配合使用input语句来比较输入的数字与随机数值是否相等。
无限次机会,直到猜中为止
每一次猜不中,会提示大了或小了
猜完数字后,提示猜了几次
提示:
条件无限次机会,终止条件不适合用数字累加来判断
可以考虑布尔类型本身(True or False)
猜中数字需要提示几次猜中,就需要提供数字累加功能
import random # 导入 Python 内置的 random 模块,用于生成随机数
num = random.randint(1, 66) # 使用 random 模块的 randint 方法生成一个 1 到 66 之间(包括 1 和 66)的随机整数,并将其赋值给变量 num
outcome = True
frequency = 0
while outcome :
guess_num = int(input("请输入你要猜的数字"))
if guess_num == num :
print(f"恭喜你第猜对了,一共用了{frequency+1}次")
outcome = False
else:
if guess_num > num :
print("你猜的大啦")
else:
print("你猜的小啦")
frequency = frequency + 1
python

2.while循环嵌套
基础语法:
while 条件1:
条件1满足时,做的事情1
条件1满足时,做的事情2
条件1满足时,做的事情3
...(省略)...
while条件2:
条件2满足时,做的事情1
条件2满足时,做的事情2
条件2满足时,做的事情3
... (省略) ...
注意:注意条件的控制,避免无限循环
多层嵌套,与判断语句一致,主要基于空格缩进来确定层次关系
a = 0
while a < 100:
print(f"今天是第{a+1}天,准备成为真爱粉")
b = 1
while b <= 4:
print(f"练习唱跳rap的第{b}个2.5小时")
b +=1
print("努力成为鸽鸽")
a += 1
print(f"坚持到第{a/4}个2.5天,成为了黑子")
python

补充知识:
1.print输出不换行
默认print语句会自动将输出内容进行分段;若希望避免分段,则可在print语句中添加end="即可实现连续输出的效果(其中end=''用于传递方法参数);后续将对相关内容进行更新
print("Hello", end='')
print("World", end='')
python
2.制表符\t
在字符串中存在被称为\t的特殊字符,在键盘上执行tab键的效果相当于运用该字符。该字符能够使我们的多行字符串实现对齐。
print("Hello World")
print("itheima best") # 使用空格无法对齐
print("Hello\tWorld")
print("itheima\tbest") # 使用\t后,可以对齐
python
while练习

通过补充的知识,我们完成上述的要求吧!
i = 1 # 初始化变量 i 为 1
while i < 10 : # 当 i 小于 10 时,执行循环
j = 1 # 每次进入内层循环前,初始化变量 j 为 1
while j <= i : # 当 j 小于等于 i 时,执行内层循环
print(f"{j} * {i} = {j*i}\t",end='') # 打印乘法表达式及结果,并使用制表符分隔,且不换行
j += 1 # j 自增 1
print() # 换行
i += 1 # i 自增 1
python
解释:内层循环要j <= i 的原因是要内层循环输出时能逐行添加
十八、for循环
除了while循环语句外,Python同样提供了for循环语句。
两者能完成的功能基本差不多,但仍有一些区别:
while循环的循环条件是自定义的,自行控制循环条件
for循环是一种”轮询”机制,是对一批内容进行”逐个处理
1.基本语法:
for 临时变量 in 待处理数据集:
循环满足条件时执行的代码
#定义字符串name
name = "ikun"
#for循环处理字符串
for x in name:
print(x)
python
for循环是将字符串的内容:依次取出所以,for循环也被称之为:遍历循环
语法中的:可处理的数据集合也可称为序列类型。我们通常将这种能够逐个提取出来的一种数据结构称为序列类型。它包含多种具体形式如字符串、列表、元组等,并其核心在于遍历操作
注:同while循环不同,for循环是无法定义循环条件的。
只能从被处理的数据集中,依次取出内容进行处理,无法定义循环条件。
从理论上讲,Python的for循环无法实现无尽循环(因为所处理的数据量必然是有限的)
同样的循环内的语句,需要有空格缩进
临时变量,在编程规范上,作用范围(作用域),只限定在for循环内部
如果在for循环外部访问临时变量:
实际上是可以访问到的
在编程规范上,是不允许、不建议这么做的
如需访问临时变量,可以预先在循环外定义它
2.for循环嵌套:
for 临时变量 in 待处理数据集(序列):
循环满足条件应做的事情 1
循环满足条件应做的事情2
循环满足条件应做的事情N
...
for 临时变量 in 待处理数据集(序列):
循环满足条件应做的事情1
循环满足条件应做的事情2
循环满足条件应做的事情N
注意:需要注意缩进,嵌套for循环同样通过缩进确定层次关系
for循环和while循环可以相互嵌套使用
a = 0
for a in range(1,101):
print(f"今天是第{a}天,准备成为真爱粉")
for b in range(1,5):
print(f"练习唱跳rap的第{b}个2.5小时")
print("努力成为鸽鸽")
print(f"坚持到第{a/4}个2.5天,成为了黑子")
python
还记得99乘法表么,我们也用for循环试试吧
#通过外层循环控制行数
for i in range(1,10):
#通过内层循环控制每一行的数据
for j in range(1,i + 1):
#在内层循环中输出每一行的内容
print(f"{j}*{i}={j * i}\t",end='')
#外层循环可以通过print输出一个回车符
print()
python
十九、range函数
1.功能:
获得一个数字序列
2.语法格式:
语法①:range(num)
获得一个从0开始,到num结束的数字序列(不含num本身)
如,range(5)取得的数据是:[0,1,2,3,4]
语法②:range(num1,num2)
获得一个从num1开始,到num2结束的数字序列(不含num2本身)
如,range(5,10)取得的数据是:[5,6,7,8,9]
语法③:range(num1,num2,step)
获得一个从num1开始,到num2结束的数字序列(不含num2本身)
数字之间的步长,以step为准(step默认为1)
如,range(5,10,2)取得的数据是:[5,7,9]
range练习:
定义一个数字变量num,内容随意,答案为100
并使用range()语句,获取从1到num的序列,使用for循环遍历它
在遍历的过程中,统计有多少偶数出现
提示:
1.序列可以使用:range(1,num)得到
2.偶数通过if来判断,判断数字余2是否为0即可
num = 100 # 定义上限值为 100
count = 0 # 初始化偶数计数器为 0
for x in range(1, num): # 遍历从 1 到 99 的数字
if x % 2 == 0: # 判断当前数字是否为偶数
count += 1 # 如果是偶数,计数器加 1
print(f"1 到{num}(不含{num})中有{count} 个偶数") # 输出偶数的数量
python
二十、break和continue
思考:无论是while循环或是for循环,都是重复性的执行特定操作
在这个重复的过程中,会出现一些其它情况让我们不得不:
暂时跳过某次循环,直接进行下一次
提前退出循环,不在继续
对于这种场景,在Python中支持continue和break关键字用于对循环进行跳过和立即终止。
1.continue
continue关键字用于:中断本次循环,直接进入下一次循环
continue可以用于:for循环和while循环,效果一致
for i in range(1, 100):
语句1
continue
语句2
上述代码:
在循环中,遇到continue就结束当次循环,进行下一次循环
所以,语句2是不会执行的
应用场景:
在循环中,因某些原因,临时结束本次循环。(通常和判断语句一起出现)
注意,在嵌套循环中使用 continue 时,默认仅会终止当前的迭代。
2.break
break关键字用于:直接结束循环
break可以用于:for循环和while循环,效果一致
for i in range(1, 100):
语句 1
break
语句 2
语句 3
上述代码:
在循环内,遇到break就结束循环了
所以,执行了语句1后,直接执行语句3了
提示:break关键字同样也可以控制该循环的结束,并不影响任何上层循环的执行。
二十一、函数基础定义
1.解释:
是组织好的,可重复使用的,用来实现特定功能的代码段。
2.为什么要用函数呢?
旨在实现一个针对特定需求且能够被多次使用的代码段以提升程序的可重用性和降低编写重复性的开发效率
3.定义:
| def 函数名(传入参数): 函数体 return 返回值 函数名(参数) |
|---|
注意:①参数如不需要,可以省略
②返回值如不需要,可以省略
③函数必须先定义后使用
二十二、函数参数
1.解释:
传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据
2.定义:
# 定义函数
def add(x,y):
result=x+y
print(f"{x}+{y}的结果是:{result}")
# 调用函数
add(1,2)
python
在函数定义中,在所给定的x和y被称为形式参数(形参),它们表示函数声明将用于处理2个参数
参数之间使用逗号进行分隔
在函数调用过程中,在传递的数值5和6的基础上称为:实际参数(简称实参),它们表示函数在运行过程中真正采用的参数值
传入的时候,按照顺序传入数据,使用逗号分隔
请注意:在本功能中,默认支持传入零个及以上输入项。您可以选择不提供任何输入项,并根据需求选择一组必要的输入。
二十三、函数返回值
1.解释:
所谓“返回值”,就是程序中函数完成事情后,最后给调用者的结果
2.定义:
# 定义函数
def add(x,y):
result = x+y
# 返回返回值result
return result
# 调用函数
num = add(1,2)
# 输出返回值
print(num)
python

变量就是能接收到函数的返回值
语法就是:通过return关键字,就能向调用者返回数据
注意:请注意,在函数体内一旦出现return语句后(即当程序执行到return语句时),程序将立即终止执行(即停止运行并返回控制)。因此,在return语句之后编写的代码将不会被执行。
思考:
之前说返回值可以缺省,那么缺省的函数有返回值么?
答:有的。Python中有一个特殊的字面量:None,其类型是:<class'NoneType'>
无返回值的函数,实际上就是返回了:None这个字面量
# 定义函数
def my_print():
print("击泥胎梅")
# 调用函数
test = my_print()
# 输出返回值
print(f"返回值为{test},返回值类型为{type(test)}")
python
结果:

补充:None
1.解释
None表示:空的、无实际意义的意思,类型是:<class'NoneType'>
当某个函数返回null值时,则表明该函数并未传递任何有价值的信息;换句话说,在这种情况下可以说它已返回空值。
None可以主动使用return返回,效果等同于不写return语句
2.应用场景
None作为一个特殊的字面量,用于表示:空、无意义,其有非常多的应用场景。
①、用在函数无返回值上
②、用在if判断上
在if判断中,None等同于Flase
一般用于在函数中主动返回None,配合if判断做相关处理
# 定义函数
def your_age(age):
if age >= 18:
return 'SUCCESS'
# 调用函数,当年龄小于18时,test为None
test = your_age(int(input("请输入你的年龄\n")))
# 当test为None时,not None为真,于是输出语句
if not test:
print("对不起,未满十八岁不能进入")
python

结果:

③用在声明无内容的变量上
定义变量,但暂时不需要变量有具体值,可以用None来代替
# 暂不赋予变量具体值
name = None
python
二十四、函数说明文档
函数是一种纯粹的代码语言.这种方法需要耐心地逐行分析才能 grasp the code's logic.
我们可以给函数添加说明文档,辅助理解函数的作用。
语法如下:
| def func(x, y): """ 函数说明 :param x:形参x的说明 :paramy:形参y的说明 :return:返回值的说明 """ 函数体 return 返回值 |
|---|
通过多行注释的形式,对函数进行说明解释
内容应写在函数体之前
#定义函数,进行文档说明
def add(a,b):
"""
add函数可以接收2个参数,进行2数相加的功能
:param a: 形参a表示相加的其中一个数字
:param b: 形参b表示相加的另外一个数字
:return: 返回值是2数相加的结果
"""
result = a + b
print(f"2数相加的结果是:{result}")
return result
python

注:
:param 用于解释参数
:return用于解释返回值
在PyCharm编写代码时,可以通过鼠标悬停,查看调用函数的说明文档

二十五、函数的嵌套
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数
def func_b():
print("---2---")
def func_a():
print("---1---")
func_b()
print("---3---")
# 调用函数func_a
func_a()
python
结果:

注意:当函数A被调用时,在其内部会触发另一个辅助函数B的任务处理过程。只有在完成所有B的任务后才会返回到上一次的A的位置继续处理后续内容
二十六、局部变量AND全局变量
变量作用域指的是变量的作用范围 (变量在哪里可用,在哪里不可用)
主要分为两类:局部变量和全局变量
1.局部变量:
局部变量是定义在函数体内部的变量,即只在函数体内部生效
def testA():
num = 100
print(num)
testA() #输出100
print(num) #报错:name'num'isnot defined
python
num是定义在“testA”函数内部的变量,在函数外部访问则立即报错
局部变量的主要作用是在函数体内临时存储一些所需的数据,并且一旦函数调用完成时就会释放这些局部变量以避免内存泄漏和资源浪费。
2.全局变量
全局变量,指的是在函数体内外都能生效的变量
#定义全局变量a
num = 100
def testA():
print(num)#访问全局变量num,并打印变量num存储的数据
def testB():
print(num)#访问全局变量num,并打印变量num存储的数据
testA() # 输出100
testB() # 输出100
python
思考:下面这段代码会print(num)输出什么,100还是200?
#定义全局变量a
num = 100
def testA():
print(num)#访问全局变量num,并打印变量num存储的数据
def testB():
num = 200
print(num)#访问全局变量num,并打印变量num存储的数据
testA() # 输出100
testB() # 输出100
print(num)
python

结果:

为什么在testB中把num修改成200了,最后输出的num还是100呢?
由于在testB中将num赋值为200成为一个局部变量,并非对全局variables进行更改;这也就意味着我们在函数体内无法直接更改该global variable。
答案肯定是可以的,python特意写了global关键字来应对上述情况。
3.global关键字
使用global关键字可以在函数内部声明变量为全局变量
#定义全局变量a
num = 100
def testA():
print(num)#访问全局变量num,并打印变量num存储的数据
def testB():
global num
num = 200
print(num)#访问全局变量num,并打印变量num存储的数据
testA() # 输出100
testB() # 输出100
print(num)
python

结果:

如上所述,在函数体内修改全局变量的方式是:通过使用global关键字将函数内定义的变量声明为全局变量。
二十六、数据容器
Python中的数据容器:
一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素
每一个元素,可以是任意类型的数据,如字符串、数字、布尔等。
数据容器根据特点的不同,如:
是否支持重复元素
是否可以修改
是否有序,等
分为5类,分别是:
列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
二十七、列表
1.语法:
| #字面量 [元素1,元素2,元素3,元素4,...] #定义变量 变量名称=[元素1,元素2,元素3,元素4,...] #定义空列表 变量名称尔=[] 变量名称尔= list() |
|---|
列表内的每一个数据,称之为元素
以[]作为标识
列表内每一个元素之间用“,”逗号隔开
#定义一个列表list
my_list = ["itheima","itcast","python"]
print(my_list)
print(type(my_list))
my_list = ["itheima", 666, True]
print(my_list)
print(type(my_list))
#定义一个嵌套的列表
my_list = [[1, 2, 3],[4,5,6]]
print(my_list)
print(type(my_list))
python

请注意:数据类型的多样性不受限于任何约束,并且即使是单个元素本身也可以采用列表形式进行组织,并且允许嵌套列表的组织形式。
2.列表的下表(索引)
每个列表中的元素都有对应的索引值,并按照顺序排列以起始位置为0依次递增。只需根据索引值定位到对应的元素即可找到该元素的位置信息。
#语法:列表[下标索引]
name_list = ['Tom','Lily','Rose']
print(name_list[0])#结果:Tom
print(name_list[1])#结果:Lily
print(name_list[2])#结果:Rose
python
当然我们强大的python是支持反向索引的
也就是从后往前,从-1开始,依次递(-1,-2,-3...)
#语法:列表[下标索引]
name_list = ['Tom','Lily','Rose']
print(name_list[-3])#结果:Tom
print(name_list[-2])#结果:Lily
print(name_list[-1])#结果:Rose
python
注意:下标索引的取值范围,超出范围无法获取元素,并且会报错
正向下标是从0开始,要取第1个元素要xx[0],取第3个元素为xx[2]
反向下标是从-1开始,要取最后1个元素要xx[-1]
3.列表常见功能
列表也包含了一系列操作:具体包括添加元素、移除元素、清空列表以及更新内容等操作;我们统一将这些操作归纳为:列表的方法
数据是一个打包的代码块,能够提供特定功能。在Python编程语言中,在将函数作为类成员进行定义时,这些函数会被视为操作流程。
方法和函数功能一样,有传入参数,有返回值,只是方法的使用格式不同:
#函数
def add(x,y):
return x+y
#函数的使用
num = add(1,2)
#方法
class Student:
def add(self,x,y):
return x+y
#方法的使用:
student = Student()
num = student.add(1,2)
python

具有类似功能的方法接收输入参数并返回相应的结果值,在调用方式上存在差异后续的文章中将详细介绍相关内容按函数方式处理
①、查找某个元素的下标
功能:查找指定元素在列表的下标如果找不到,报错ValueError
语法:列表:index.(元素)
index就是列表对象(变量)内置的方法(函数)
mylist = ["ikun","geigei","lizhi"]
# 查找某元素在列表内的下标索引
index = mylist.index("ikun")
print(f"ikun在列表中的下标索引值是:{index}")
#如果被查找的元素不存在,会报错
index = mylist.index("hello")
print(f"hello在列表中的下标索引值是:{index}")
python
结果:

②、修改特定位置(索引)的元素值
语法:列表[下标] = 值
直接对指定下标(正向、反向下标均可)的值进行:重新赋值(修改)
#正向下标
my_list = [1, 2, 3]
my_list[0] = 5
print(my_list) # 结果:[5,2,3]
# #反向下标
my_list = [1, 2, 3]
my_list[-3] = 5
print(my_list) # 结果: [5,2,3]
python
③、插入元素
语法:列表.insert(下标,元素),在指定的下标位置,插入指定的元素
此处可以使用-1进行操作;但需要注意的是,在实际操作中,-1不会被插入到列表末尾的位置上;相反地,在正确操作时,则会被正确地插入到倒数第二个元素的位置,并且这通常指的是位于示例中的2和3之间的中间位置
my_list =[1,2,3]
my_list.insert(1, "ikun")
print(my_list) #结果::[1,"ikun",3,4]
python
④、追加元素
语法1:列表.append(元素),将指定元素,追加到列表的尾部
my_list =[1,2,3]
my_list.append(4)
print(my_list) # 结果:[1,2,3, 4]
python
本节主要介绍语法2:列表.extend(其它数据容器),从其它数据容器中提取内容,并按顺序添加至列表末尾。
my_list = [1,2,3]
my_list.extend([4,5,6])
print(my_list) # 结果:[1,2,3,4,5,6]
python
⑤、删除元素
语法1:del列表[下标]
语法2:列表.pop[下标]
提示:该方法可以直接删除指定位置的元素;而该函数则可以接收并存储被删除项的具体位置信息。
my_list =[1,2,3]
del my_list[0]
print(my_list) # 结果:[2,3]
num = my_list.pop(0)
print(num) # 结果:1
print(my_list) # 结果:[2,3]
python
语法3:列表.remove(元素) 这里是删除某元素在列表中的第一个匹配项
my_list=[1,2,3,2,3]
my_list.remove(2)
print(my_list)#结果:[1,3,2,3]
python
注意:仅限于仅能进行一次的删减操作,请确保在无法找到目标对象的情况下及时反馈相关问题以避免系统出现错误。
⑥、清空列表内容
语法:列表.clear()
my_list =[1,2,3]
my_list.clear()
print(my_list)#结果:[]
python
⑦、统计某元素在列表内的数量
语法:列表.count(元素)
my_1ist=[1,1,1,2,3]
print(my_1ist.count(1)) #结果:3
python
⑧、统计元素
语法:len(列表)
my_1ist=[1,1,1,2,3]
print(len(my_1ist)) # 结果:5
python
⑨、小结
列表常见功能小结| 编号| 使用方式| 作用 |
| --- | --- | --- |
|---|---|---|
| 2 | 列表.extend(容器) | 将数据容器的内容依次取出,追加到列表尾部 |
| 3 | 列表.insert(下标,元素) | 在指定下标处,插入指定的元素 |
| 4 | del 列表[下标] | 删除列表指定下标元素 |
| 5 | 列表.pop(下标) | 删除列表指定下标元素 |
| 6 | 列表.remove(元素) | 从前向后,删除此元素第一个匹配项 |
| 7 | 列表.clear() | 清空列表 |
| 8 | 列表.count(元素) | 统计此元素在列表中出现的次数 |
| 9 | 列表.index(元素) | 9查找指定元素在列表的下标,找不到报错ValueError |
| 10 | len(列表) | 统计容器内有多少元素 |
4.列表的遍历
因为数据容器具有容纳多个元素的功能,在实际应用中往往需要按照一定的顺序从容器中逐一提取这些待处理的元素完成操作。这个行为称为遍历和迭代的操作。
如何遍历列表的元素呢?可以使用前面学过的while循环
如何在循环中取出列表的元素呢?使用列表[下标]的方式取出
How can the loop condition be controlled? By creating an index variable and initializing it to 0, while the loop's condition is set to index less than the number of list elements.
my_1ist=[1,1,1,2,3]
# 定义一个变量来标记列表的下标
index = 0 # 初始值为0
print(my_1ist)
# 通过len()获取列表长度作为判断条件,这里需要注意因为下标是从0开始,所以遍历5个元素的列表,下标只需要到4就可以了,所以判断条件不需要<=
while index < len(my_1ist):
print(f"元组第{index+1}个元素是{my_1ist[index]}")
# 将循环变量(index)每一次循环都+1,缺少的话会导致死循环
index += 1
python

结果:

除了while循环外,Python中还有另外一种循环形式:for循环。
对比while,for循环更加适合对列表等数据容器进行遍历。
语法:
for 临时变量 in 数据容器:
对临时变量进行处理
表示,从容器内,依次取出元素并赋值到临时变量上
在每一次的循环中,我们可以对临时变量(元素)进行处理。
my_1ist=[1,1,1,2,3]
print(my_1ist)
for i in my_1ist:
print(f"元组元素有:{i}")
python
结果:

while循环和for循环,都是循环语句,但细节不同:
在循环控制上:
while循环可以自定循环条件,并自行控制
for循环不可以自定循环条件,只可以一个个从容器内取出数据
在无限循环上:
while循环可以通过条件控制做到无限循环
for循环理论上不可以,因为被遍历的容器容量不是无限的
在使用场景上:
while循环适用于任何想要循环的场景
for循环适用于,遍历数据容器的场景或简单的固定次数循环场景
5.列表总结
经过上述对列表的学习,可以总结出列表有如下特点:
可以容纳多个元素(上限为2**63-1、9223372036854775807个)
可以容纳不同类型的元素 (混装)
数据是有序存储的 (有下标序号)
允许重复数据存在
可以修改 (增加或删除元素等)
二十八、元组
我们需要在程序内打包数据,在不想让这些数据被篡改的时候使用列表是不合适的;这个时候就需要用什么来打包数据呢?在这种情况下不可修改的元组非常适合这种需求。
类似于列表结构,在功能上都能存储多种不同类型的数据元素。然而,在主要区别在于:元组一旦被创建完成,则无法进行任何修改操作。
1、元组定义:
元组表示为通过小括号括起来的一组元素,并且这些元素通过逗号分隔各个数据项。这些数据项可以具有不同的数据类型。
这里必须注意的一个情况是:一个元组仅包含一个元素,在其后需要添加一个逗号符号以正确表示数据结构的完整性
# 定义一个元素的元组
t2 =('Hello',) # 注意必须带有逗号,否则不是元组类型
python
元组也支持嵌套:
#定义一个嵌套元组
t1 =((1,2,3),(4,5,6))
print(t1[0][0]) # 结果:1
python
另外值得注意的一点是,在Python中对元组不可更改,但其内部列表是可以修改的
可以修改元组内的list的内容(修改元素、增加、删除、反转等)
#尝试修改元组内容
t1 = (1,2,['ikun','geigei'])
t1[2][1] = 'best'
print(t1) # 结果:(1,2,['ikun',‘best'])
python
2、元组的方法
| 编号 | 方法 | 作用 |
|---|---|---|
| 1 | index() | 查找某个数据,如果数据存在返回对应的下标,否则报错 |
| 2 | count() | 统计某个数据在当前元组出现的次数 |
| 3 | len(元组) | 统计元组内的元素个数 |
#根据下标(索引)取出数据
t1=(1,2,'he1lo')
print(t1[2]) # 结果:‘hello’
# 根据index(),查找特定元素的第一个匹配项
tl = (1,2,"hello",3,4,'hello')
print(tl.index('hello')) # 结果:2
# 统计某个数据在元组内出现的次数
t2 = (1,2,'hello',3,4,"hello")
print(t2.count("hello")) # 结果:2
# 统计元组内的元素个数
t3 = (1, 2, 3)
print(len(t3)) # 结果3
python

3、元组总结
列表有如下特点:
可以容纳多个数据
可以容纳不同类型的数据 (混装)
数据是有序存储的(下标索引)
允许重复数据存在
不可以修改(增加或删除元素等)
支持for循环
多数特性和list一致,不同点在于不可修改的特性。
二十九、字符串
1、字符串解析
虽然这个字符串不像是:列表、元组那样的形式,但基本上就是一个存储大量数据的容器。
但不可否认的是,字符串同样也是数据容器的一员。
字符串是字符的容器,一个字符串可以存放任意数量的字符。
如,字符串:"ikun"
和其他容器一样,字符串也可以通过下标进行访问
从前向后,下标从0开始
从后向前,下标从-1开始
#通过下标获取特定位置字符
name ="ikun"
print(name[0]) # 结果 i
print(name[-1]) # 结果 n
python
同元组一样,字符串是一个:无法修改的数据容器。
所以:修改指定下标的字符,移除特定下标的字符,追加字符等,均无法完成
2、常见操作:
①、查找特定字符串的下标索引值
语法:字符串.index(字符串)
str = "ikun and geigei"
print(str.index("and")) # 结果5
python
②、字符串的替换
语法:字符串.replace(字符串1,字符串2)
功能:将字符串内的全部:字符串1,替换为字符串2
注意:不是修改了字符串,而是得到了一个新的字符串
str = "ikun and geigei"
re_str = str.replace("and", "和")
print(re_str) # 结果为ikun 和 geigei
python
③、字符串的分割
语法:字符串.split(分隔符字符串)
功能遵循指定分隔符对输入进行处理,并将处理后的各个部分依次加入列表对象中
注意:字符串本身不变,而是得到了一个列表对象
str = "ikun and geigei"
str_list = str.split(" ")
print(str_list) # 结果为['ikun', 'and', 'geigei']
python
④、字符串的规整操作
语法:字符串.strip(字符串)
说明如下:当括号内无内容时,则去除其前后空格;若括号内包含特定字符串,则去除其前后该特定字符串。
注意:传入的是“12”,其实就是:“1”和“2”都会移除,是按照单个字符
str = " 12ikun and geigei21 "
strip_str = str.strip()
print(strip_str) # 结果为12ikun and geigei21
strip_str2 = strip_str.strip("12")
print(strip_str2) # 结果为ikun and geigei
python
⑤、统计字符串内某个字符串出现的次数
语法:字符串.count(字符串)
str = "ikun and geigei"
count = str.count("i")
print(count) # 结果为3
python
⑥、统计字符串的字符个数
语法:len(字符串)
str = "ikun and geigei"
num = len(str)
print(num) # 结果为15
python
⑦、遍历
同列表、元组一样,字符串也支持while循环和for循环进行遍历
⑧、小结
| 编号 | 操作 | 说明 |
|---|---|---|
| 1 | 字符串[下表] | 根据下标索引取出特定位置字符 |
| 2 | 字符串.index(字符串) | 查找给定字符的第一个匹配项的下标 |
| 3 | 字符串.replace(字符串1,字符串2) | 将字符串内的全部字符串1,替换为字符串2不会修改原字符串,而是得到一个新的 |
| 4 | 字符串.split(字符串) | 按照给定字符串,对字符串进行分隔不会修改原字符串,而是得到一个新的列表 |
| 5 | 字符串.strip() 字符串.stri(字符串) | 移除首尾的空格和换行符或指定字符串 |
| 6 | 字符串.count(字符串) | 统计字符串内某字符串的出现次数 |
| 7 | len(字符串) | 统计字符串的字符个数 |
3、字符串总结
作为数据容器,字符串有如下特点:
只可以存储字符串
长度任意(取决于内存大小)
支持下标索引
允许重复字符串存在
不可以修改(增加或删除元素等)
支持for循环
三十、序列的切片
1、序列定义:
序列是指:内容连续、有序,可使用下标索引的一类数据容器
列表、元组、字符串,均可以可以视为序列。
2、切片:
序列支持切片,即:列表、元组、字符串,均支持进行切片操作
切片:从一个序列中,取出一个子序列
语法:序列[起始下标:结束下标:步长]
用于从序列中起始位置开始提取元素,并在终止于指定位置时生成一个新的序列:
起始下标表示从何处开始,可以留空,留空视作从头开始
结束下标(不含)表示何处结束,可以留空,留空视作截取到结尾
步长表示,依次取元素的间隔
步长1表示,一个个取元素
步长2表示,每次跳过1个元素取
步长N表示,每次跳过N-1个元素取
步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记)
注意:切片操作不会影响到序列本身,而是会得到一个新的序列
# 对List进行切片,从1开始,4结束,步长1
my_list = [0, 1, 2, 3, 4, 5, 6]
result1 = my_list[1:4] # 步长默认是1,所以可以省略不写
print(f"结果1:{result1}") # 结果1:[1, 2, 3]
# 对tupLe进行切片,从头开始,到最后结束,步长1
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result2 = my_tuple[:] # 起始和结束不写表示从头到尾,步长为1可以省略
print(f"结果2:{result2}") # 结果2:(0, 1, 2, 3, 4, 5, 6)
# 对str进行切片,从头开始,到最后结束,步长2
my_str = "01234567"
result3 = my_str[::2]
print(f"结果3:{result3}") # 结果3:0246
#对str进行切片,从头开始,到最后结束,步长-1
my_str = "01234567"
result4 = my_str[::-1] # 等同于将序列反转了
print(f"结果4:{result4}") # 结果4:76543210
#对列表进行切片,从3开始,到1结束,步长-1
my_list = [0, 1, 2, 3, 4, 5, 6]
result5 = my_list[3:1:-1]
print(f"结果5:{result5}") # 结果5:[3, 2]
#对元组进行切片,从头开始,到尾结束,步长-2
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result6 = my_tuple[::-2]
print(f"结果6:{result6}") # 结果6:(6, 4, 2, 0)
python

三十一、集合
1、定义:
集合是不允许重复的(去重),无序的(不支持下标索引)
2、基本语法:
| #定义集合字面量 {元素,元素,......,元素} #定义集合变量 变量名称 = {元素,元素,......,元素} #定义空集合 变量名称 = set() |
|---|
注意:集合和列表、元组、字符串等定义基本相同,不同的是:
列表使用:[] 元组使用:() 字符串使用:"" 集合使用:{}
3、常用操作
①、下标索引访问:
因为集合是无序的,所以集合不支持:下标索引访问
②、添加新元素
语法:集合.add(元素)。将指定元素,添加到集合内
结果:集合本身被修改,添加了新元素
my_set = {"ikun", "and", "geigei"}
my_set.add("lizhi")
print(my_set) # 结果{'lizhi', 'geigei', 'and', 'ikun'}
python
③、移除元素
语法:集合.remove(元素),将指定元素,从集合内移除
结果:集合本身被修改,移除了元素
my_set = {"ikun", "and", "geigei"}
my_set.remove("and")
print(my_set) # 结果{'ikun', 'geigei'}
python
④、随机取出元素
语法:集合.pop(),功能,从集合中随机取出一个元素
结果:会得到一个元素的结果。同时集合本身被修改,元素被移除
my_set = {"ikun", "and", "geigei"}
element = my_set.pop()
print(element) # 结果ikun
print(my_set) # 结果{'and', 'geigei'}
python
⑤、清空集合
语法:集合.clear(),将集合内所有元素清空
结果:集合本身被清空
my_set = {"ikun", "and", "geigei"}
my_set.clear()
print(my_set) # 结果set()
python
⑥、取出2个集合的差集
语法:set 1.difference(set 2)用于获得两个set之间的差集(即set 1包含而set 2不包含的元素)。
结果:得到一个新集合,集合1和集合2不变
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set3 = set1.difference(set2)
print(set3) # 结果:{2,3} 得到的新集合
print(set1) # 结果:{1,2,3} 不变
print(set2) # 结果:{1,5,6} 不变
python
⑦、消除2个集合的差集
语法:集合1.difference_update(集合2)
功能:对比集合1和集合2,在集合1内,删除和集合2相同的元素。
结果:集合1被修改,集合2不变
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set1.difference_update(set2)
print(set1) # 结果:{2,3}
print(set2) # 结果:{1,5,6}
python
⑧、2个集合合并
语法:集合1.union(集合2)
功能:将集合1和集合2组合成新集合
结果:得到新集合,集合1和集合2不变
set1 = {1, 2, 3}
set2 = {1, 5, 6}
set3 = set1.union(set2)
print(set3) # 结果:{1,2,3,5,6},新集合
print(set1) # 结果:{1,2,3},set1不变
print(set2) # 结果:{1,5,6},set2不变
python
⑨、统计元素数量
语法:len(集合)
功能:统计集合元素数量
结果:得到集合内元素的数量
#统计集合元素数量len()
set1 = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5}
num = len(set1)
print(num) # 结果:5
python
⑩、遍历
集合不支持下标索引,不能用while循环但是可以用for循环
⑪ 、小结
| 编号 | 操作 | 说明 |
|---|---|---|
| 1 | 集合.add(元素) | 集合内添加一个元素 |
| 2 | 集合.remove(元素) | 移除集合内指定的元素 |
| 3 | 集合.pop() | 从集合中随机取出一个元素 |
| 4 | 集合.clear() | 将集合清空 |
| 5 | 集合1.difference(集合2) | 得到一个新集合,内含2个集合的差集 原有的2个集合内容不变 |
| 6 | 集合1.difference_update(集合2) | 在集合1中,删除集合2中存在的元素 集合1被修改,集合2不变 |
| 7 | 集合1.union(集合2) | 得到1个新集合,内含2个集合的全部元素 原有的2个集合内容不变 |
| 8 | len(集合) | 得到一个整数,记录了集合的元素数量 |
4、集合总结
经过上述对集合的学习,可以总结出集合有如下特点:
可以容纳多个数据
可以容纳不同类型的数据居(混装)
数据是无序存储的(不支持下标索引)
不允许重复数据存在
可以修改文(增加或删除元素等)
支持for循环,不支持while循环
三十二、字典
1、定义:
字典的定义,同样使用{},不过存储的元素是一个个的:键值对。
2、基本语法:
| #定义字典字面量 {key: value, key: value,......,key: value} #定义字典变量 my_dict = {key: value, key: value,......,key: value} #定义空字典 my_dict = {} # 空字典定义方式1 my_dict = dict() # 空字典定义方式2 |
|---|
字典同集合一样,不可以使用下标索引
但是字典可以通过key值来取得对应的Value
#语法,字典[Key]可以取到对应的value
stu_score ={"ikun":99, "geigei":88}
print(stu_score["ikun"]) # 结果99
print(stu_score["geigei"]) # 结果88
python
注意:不能重复定义相同的Key,重复添加等同于覆盖原有数据
字典的Key和Value可以是任意数据类型(Key不可为字典)
那么,就表明,字典是可以嵌套的
#语法,字典[Key]可以取到对应的value
stu_score ={"ikun":{"语文":99, "数学":66}, "geigei":{"语文":88,"数学":77}}
print(stu_score["ikun"]["语文"]) # 结果99
print(stu_score["geigei"]["数学"]) # 结果77
python
3、常用操作
①新增元素
语法:字典[Key] = Value,结果:字典被修改,新增了元素
stu_score ={"ikun":99, "geigei":88}
# 新增,lizhi的分数
stu_score["lizhi"]=77
print(stu_score) # 结果:{'ikun': 99, 'geigei': 88, 'lizhi': 77}
python
②、更新元素
语法:字典[Key] = Value,结果:字典被修改,新增了元素
注意:字典Key不可以重复,所以对已存在的key执行上述操作,就是更新Value值
stu_score ={"ikun":99, "geigei":88}
# 修改元素
stu_score["ikun"]=25
print(stu_score) # 结果:{'ikun': 25, 'geigei': 88}
python
③、删除元素
语法:在Python中使用字典中的pop方法时会执行以下操作:首先从给定的字典中删除指定的关键码,并返回该关键码对应的值;这一过程会导致原始数据结构发生变化,并且相应关键码及其相关数据将被移除
stu_score ={"ikun":99, "geigei":88}
# 删除对应元素
value = stu_score.pop("ikun")
print(value) # 结果:99
print(stu_score) # 结果:{'geigei': 88}
python
④、清空字典
语法:字典.clear(),结果:字典被修改,元素被清空
stu_score ={"ikun":99, "geigei":88}
# 清空字典
stu_score.clear()
print(stu_score) # 结果:{}
python
⑤获取全部的Key
语法:字典.keys(),结果:得到字典中的全部Key
stu_score ={"ikun":99, "geigei":88}
# 获取字典的全部Key,可用于for循环遍历字典
keys = stu_score.keys()
print(keys) # 结果:dict_keys(['ikun', 'geigei'])
python
⑥统计字典元素数量
语法:len(字典),结果: 得到字典内元素的数量
stu_score ={"ikun":99, "geigei":88}
# 计算字典内的元素数量
num = len(stu_score)
print(num) # 结果:2
python
⑦小结
| 编号 | 操作 | 说明 |
|---|---|---|
| 1 | 字典[Key] | 获取指定Key对应的Value值 |
| 2 | 字典[Key] = Value | 添加或更新键值对 |
| 3 | 字典.pop(Key) | 取出Key对应的Value并在字典内删除此Key的键值对 |
| 4 | 字典.clear() | 清空字典 |
| 5 | 字典.keys() | 获取字典的全部Key,可用于for循环遍历字典 |
| 6 | len(字典) | 计算字典内的元素数量 |
4、总结
经过上述对字典的学习,可以总结出字典有如下特点:
可以容纳多个数据
可以容纳不同类型的数据
每一份数据是KeyValue键值对
可以通过Key获取到Value,Key不可重复夏(重复会覆盖)
不支持下标索引
可以修改文(增加或删除更新元素等)
支持for循环,不支持while循环
三十三、数据容器总结
1、简单分类
数据容器可以从以下视角进行简单的分类:
是否支持下标索引
支持:列表、元组、字符串-序列类型
不支持:集合、字典-非序列类型
是否支持重复元素:
支持:列表、元组、字符串-序列类型
不支持:集合、字典-非序列类型
是否可以修改
支持:列表、集合、字典
不支持:元组、字符串
2、使用场景
基于各类数据容器的特点,它们的应用场景如下:
列表:一批数据,可修改、可重复的存储场景
元组:一批数据,不可修改、可重复的存储场景
字符串:一串字符串的存储场景
集合:一批数据,去重存储场景
字典:一批数据,可用Key检索Value的存储场景
3、数据容器总结
| 列表 | 元组 | 字符串 | 集合 | 字典 | |
|---|---|---|---|---|---|
| 元素数量 | 支持多个 | 支持多个 | 支持多个 | 支持多个 | 支持多个 |
| 元素类型 | 任意 | 任意 | 仅字符 | 任意 | Key:Value Key:除字典外任意类型 Value:任意类型 |
| 下标索引 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 重复元素 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 可修改性 | 支持 | 不支持 | 不支持 | 支持 | 支持 |
| 数据有序 | 是 | 是 | 是 | 否 | 否 |
| 使用场景 | 可修改、可重复的一批数据记录场景 | 不可修改、可重复的一批数据记录场景 | 一串字符的记录场景 | 不可重复的数据记录场景 | 以Key检索Value的数据记录场景 |
4、容器的通用操作
①、遍历
5类数据容器都支持for循环遍历
列表、元组、字符串支持while循环,集合、字典不支持(无法下标索引)
尽管遍历的形式各有不同,但是,它们都支持遍历操作。
②、len(容器)
统计容器的元素个数
my_list = [1, 2, 3]
my_tuple =(1,2,3, 4, 5)
my_str = "ikun"
print(len(my_list)) # 结果3
print(len(my_tuple)) # 结果5
print(len(my_str)) # 结果4
python
③、max(容器)
统计容器的最大元素
my_list = [1, 2, 3]
my_tuple =(1,2,3, 4, 5)
my_str = "ikun"
print(max(my_list)) # 结果3
print(max(my_str)) # 结果u
print(max(my_tuple)) # 结果5
python
④、min(容器)
统计容器的最小元素
my_list = [1, 2, 3]
my_tuple =(1,2,3, 4, 5)
my_str = "ikun"
print(min(my_list)) # 结果1
print(min(my_str)) # 结果i
print(min(my_tuple)) # 结果1
python
⑤、通用转换功能
list(容器):将给定容器转换为列表
str(容器):将给定容器转为字符串
tuple(容器):将给定容器转为元组
set(容器):将给定容器转换为集合
⑥、通用排序功能
sorted(容器,[reverse = True])
对给定的容器进行排序操作后,在该排序结果中仅能排列在外层结构中的第一个元素的大小值
要对嵌套容器进行指定元素的排序需要用sort方法
语法为,定义一个排序函数接着用 容器.sort(key=排序函数,reverse = True)
# 如下嵌套列表,要求对外层列表进行排序,排序的依据是内层列表的第二个元素数字
# 以前学习的sorted函数就无法适用了。可以使用列表的sort方法
my_list =[["a",33],["b",55],["c",11]]
#定义排序方法
def choose_sort_key(element):
return element[1]
#将元素传入choose_sort_key函数中,用来确定按照谁来排序
my_list.sort(key=choose_sort_key,reverse=True)
print(my_list)
python
在学习了python小白学习笔记(05)后就会得到一个更加简便的用法:
就是用lambda函数完成上述内容的编写:
# 如下嵌套列表,要求对外层列表进行排序,排序的依据是内层列表的第二个元素数字
my_list=[["a",33],["b",55],["c",11]]
my_list.sort(key=lambda element:element[1],reverse=True)
print(my_list)
python
⑦、小结
| 功能 | 描述 |
|---|---|
| 通用for循环 | 遍历容器(字典是遍历key) |
| max() | 容器内最大元素 |
| min() | 容器内最小元素 |
| len() | 容器元素个数 |
| list() | 转换为列表 |
| tuple() | 转换为元组 |
| str() | 转换为字符串 |
| set() | 转换为集合 |
| sorted(序列,[revers=True]) | 排序,reverse=True表示降序 得到一个排好序的列表 |
| 容器.sort(key=排序函数,reverse = True) | 排序,针对于嵌套容器,对外层列表进行排序,排序的依据是内层列表的第X个元素 |
三十四、函数进阶
1、函数的多返回值
一个函数必须能够返回多种返回值,在处理这些返回值时应按照它们出现的顺序依次接受相应的变量;各变量之间可用逗号分隔,并且该函数应支持接收不同类型的数值数据
#演示使用多个变量,接收多个返回值
def test_return():
return 1,"ikun",True
x,y,z=test_return()
print(x) # 结果:1
print(y) # 结果:ikun
print(z) # 结果:True
python
2、函数参数种类
使用方式上的不同,函数有4中常见参数使用方式:
位置参数;关键字参数;缺省参数;不定长参数
①、位置参数:
调用函数时根据函数定义的参数位置来传递参数
def user_info(name, age, gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user_info('ikun',2.5,'man')
# 输出结果为:您的名字是ikun,年龄是2.5,性别是man
python
注意:传递的参数和定义的参数的顺序及个数必须一致
②、关键字参数:
函数调用时通过“键=值”形式传递参数
作用:可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求
def user_info(name, age, gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
# 关键字传参
user_info(name='ikun',age=2.5,gender='man')
# 可以不按照固定顺序
user_info(age=2.5,gender='man',name='ikun')
# 可以和位置参数混用,位置参数必须在前,且匹配参数顺序
user_info('ikun',age=2.5,gender='man')
# 上述的输出均是:您的名字是ikun,年龄是2.5,性别是man
python

特别注意,在函数调用过程中:当存在位置参数时,请确保这些位置参数应在关键字参数之前指定;且这些关键字参数之间没有指定先后顺序
③、缺省参数:
零参数或缺省值也被视为默认值的一种形式,并且在编程语言中通常以零参数或缺省值的形式为函数输入提供预设的预设值。在编程中,默认的数值会被优先处理,并且所有的位置参数必须位于这些默认值之前,在函数定义和调用过程中,默认的数值会被优先处理,并且所有的位置参数必须位于这些默认值之前
作用:当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值
def user_info(name, age, gender='man'):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user_info('ikun',2.5) # 您的名字是ikun,年龄是2.5,性别是man
user_info('geigei',2.5,'woman') # 结果:您的名字是geigei,年龄是2.5,性别是woman
python
请注意,在函数调用过程中,在传递缺省参数时会修改该函数的默认参数值;如果未传递缺省参数,则会使用该函数的默认值。
④、不定长参数:
不定长参数也可称为可变参数,在程序设计中主要用于处理调用时可能传递的任意数量的参数情况,并且即使不传递任何参数也是允许的。
作用:当调用函数时不确定参数个数时,可以使用不定长参数
不当初参数有2个类型:位置传递和关键字传递
关键字传递:
def user_info(**kwargs):
print(kwargs)
user_info(name='ikun',age=2.5,id=666) # 结果为:{'name':'ikun','age':2.5,'id':666}
python
请注意,在传递给字典的参数中,默认情况下每个键-值对都会被kwargs接收。
同时会按照指定的键-值对来构建字典。
位置传递:
def user_info(*args):
print(args)
user_info('ikun') # 结果为:('ikun',)
user_info('ikun',2.5) # 结果为:('ikun', 2.5)
python
注意:所有输入参数会被args变量接收,并按照输入参数的顺序整合到一个元组中。其中args已经被明确定义为元组类型结构体属性名,请确保理解其在位置传递中的作用机制。
⑤、小结
1.掌握位置参数
根据参数位置来传递参数
2.掌握关键字参数
通过“键=值”形式传递参数,可以不限参数顺序
可以和位置参数混用,位置参数需在前
3.掌握缺省参数
不传递参数值时会使用默认的参数值
默认值的参数必须定义在最后
4.掌握不定长参数
通过星号*的方式实现可变长度的参数传递,并将其打包成一个元组的形式;这些形式参数通常命名为args变量来表示
关键词不定长传递方式通常通过双星号**的方式标识一个形式参数,并且这些形式参数通常命名为kwargs变量
3、lamdba匿名函数
函数的定义中:
def关键字,可以定义带有名称的函数
lambda关键字,可以定义匿名函数(无名称)
有名称的函数,可以基于名称重复使用
无名称的匿名函数,只可临时使用一次
语法:
lambda 传入参数:函数体(一行代码)
lambda 是关键字,表示定义匿名函数
传入参数表示匿名函数的形式参数,如:×,y表示接收2个形式参数
函数体,就是函数的执行逻辑,要注意:只能写一行,无法写多行代码
#定义一个函数,接受其它函数输入
def test_func(compute):
result = compute(1,2)
print(f"结果是:{result}")
# 通过Lambda匿名函数的形式,将匿名函数作为参数传入
test_func(lambda x, y: x + y)
python
提示:采用def关键字与lambda关键字;所定义的功能完全相同;其中lambda关键字用于创建匿名函数;无法再次引用或调用。
三十五、文件
1、文件的编码:
编码技术相当于:负责记录这些编码规则,并且能够将这些规则转换为二进制形式;同时还能解码这些二进制形式以恢复原始信息。
计算机中有许多可用编码:
UTF-8;GBK;Big5;等等
多样化的编码会对应地将内容转换为二进制形式的不同表示。若采用不当的编码方式可能导致无法正确解码的信息出现。
注意:UTF-8是目前全局通用的编码格式,在没有特别的需求下,默认采用UTF-8格式对文件进行编码即可。
2、文件的读取操作:
首先我们先要知道什么是文件:
内存中的数据在计算机关机后会自动清除。为了长时间保存数据的需求,我们依靠硬盘、光盘和U盘等存储介质。为了方便地进行管理和检索操作,请引入了"文件"这一概念。
我们可以将一篇文章、一段视频或一个可执行程序存储为单独的文件,并为其分配命名。操作系统的管理架构是以处理单个文件为基础的。通常情况下,根据其属性和用途的不同,计算机中的数据可以分为多种类型:文本信息,多媒体对象如图片与音频,视频流以及供运行程序使用的可执行代码等
在日常生活中,文件操作主要包括:打开、关闭、读、写等操作。
①open()打开函数
在Python中,在调用open函数时会自动处理所有已有的文件,并根据指定参数创建新的空白文件。语法如下:
open(name,mode,encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用utf-8)
f = open('python.txt', 'r', encoding=" UTF-8 ")
#encoding的顺序不是第三位,所以不能用位置参数,用关键字参数直接指定
python
注意:此时的‘f’是‘open’函数的文件对象,对象会在后续的内容中更新
| 模式 | 描述 |
|---|---|
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
| w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。 如果该文件不存在,创建新文件。 |
| a | 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。 如果该文件不存在,创建新文件进行写入。 |
②read()读操作
语法:
文件对象.read(num)
num代表要从文件中读取的数据量(单位是字节)。若未提供num,则表明会读取文件中的全部数据。
③readlines()读操作
语法:
文件对象.readlines()
readlines能够以逐行方式进行整体内容的读入,并将其结果构成一个列表,每个元素对应一行数据
④readline()读操作
语法:
文件对象.readline()
readline对比于readlines的区别在于:一次读取一行内容
⑤for循环读取文件行
语法: for 临时变量 in open(name,mode):
输出内容
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
for line in open("python.text","r"):
print(line)
# 每一个line临时变量,就记录了文件的一行数据
python
⑥close()关闭文件对象
语法:
文件对象.close()
最后通过close,关闭文件对象,也就是关闭对文件的占用
如果一个文件在Python环境中存在,并且既没有被关闭(即close函数未被调用),又未停止运行(即程序仍在执行),那么该文件将在整个运行过程中持续被该Python程序占用内存空间。
⑦with open 语法
with open(“python.txt”,“r”)as f :
f.readlines()
通过在with open 的语句块中对文件进行操作
可以在操作完成后自动关闭close文件,避免遗忘close方法
⑧小结
| 操作 | 功能 |
|---|---|
| 文件对象 = open(file, mode, encoding) | 打开文件获得文件对象 |
| 文件对象.read(num) | 读取指定长度字节,不指定num读取文件全部 |
| 文件对象.readline() | 读取一行 |
| 文件对象.readlines() | 读取全部行,得到列表 |
| for line in 文件对象 | for循环文件行,一次循环得到一行数据 |
| 文件对象.close() | 关闭文件对象 |
| with open() as f | 通过with open语法打开文件,可以自动关闭 |
3、文件的写出操作
①、open函数的“w”模式进行写入
write(),写入内容
flush(),刷新内容到硬盘中
# 打开文件
f = open("ikun.txt", 'w', encoding='utf-8')
# 文件写入
f.write("geigei")
# 内容刷新
f.flush()
# 文件关闭
f.close()
python
注意:调用write函数时,默认情况下内容并未真正存储于文件中文件系统上实际会缓存在程序的内存缓冲区中并被称为缓冲区
当调用flush的时候,内容会真正写入文件
这样做是避免频繁的操作硬盘,导致效率下降(攒一陀,一次解决)
需要注意的地方包括:在使用w模式的情况下,在以下情况下需特别注意:如果一个文件在使用w模式的情况下不存在,则该操作将创建一个新的空白文档;如果该文件已经存在,则操作将清空现有内容;此外,在调用close()方法时,默认已集成flush()功能的作用
②、open函数的“a”模式进行写入
方法:与w模式一致
# 打开文件
f = open("ikun.txt", 'a', encoding='utf-8')
# 文件写入
f.write("2.5")
# 内容刷新
f.flush()
# 文件关闭
f.close()
python
请注意,在a模式下操作时需注意以下几点:
- 若目标文件不存在,则系统将自动创建新的空白文件;
- 若目标文件已存在,则操作将在现有内容的基础上追加写入;
- 所添加的内容需遵循Python编程语言中关于行尾处理的标准规范,
包括使用"\n"作为换行标识符等操作符。
三十六、异常
1、语法:
①、基础语法
| try: 可能发生错误的代码 except: 如果出现异常执行的代码 |
|---|
try :
print(name)
except:
print("出现异常啦")
python
②、捕获指定异常:
try :
print(name)
except NameError as e:
print("出现异常啦\n", e)
python
捕获异常只需要在except后面加上指定异常的类型即可。
注意:如果在运行代码时遇到的异常类型与预期设置的不同,则无法捕捉到指定类型的异常。
一般try下方只放一行尝试执行的代码
③、捕获多个异常:
try :
print(name)
except (NameError, ZeroDivisionError) as e:
print("出现异常啦\n", e)
python
在捕捉多个异常时,在Python中可以在except块后放置需要捕获的异常类型名称,并以元组的形式书写。
④、异常的else
try :
print(name)
except (NameError, ZeroDivisionError) as e:
print("出现异常啦\n", e)
else:
print("没有异常我会执行")
python
else表示的是如果没有异常要执行的代码
⑤、异常的finally
try :
print(name)
except (NameError, ZeroDivisionError) as e:
print("出现异常啦\n", e)
else:
print("没有异常我会执行")
finally:
print("不管有没有异常,我都会执行")
python
finally表示的是无论是否异常都要执行的代码,如关闭文件
2、异常的传递
该现象具有传递性特征,在程序流程中若出现此类问题,则表示该错误信息将依次被上层模块接收并继续传播下去;具体而言,在这种情况下如果上层模块同样未能完成相应的错误捕捉与处理操作,则错误信息将最终被主程序所接收并执行此错误的处理流程
在函数调用过程中,在最外层的函数进行过异常处理的情况下,则不会导致错误发生;只有当所有内部调用都没有捕捉到任何异常时才会引发错误
三十七、模块
1、定义
Python 包(module)是一个以.py为后缀名的Python代码文件。包能够定义函数、类以及变量。相应地,在包内部也可以包含可执行的代码块。
在Python编程语言中存在众多多样的预定义模组。每个模组都能提供特定的功能集。例如,在处理与时间相关的问题时,time模组尤为实用。每个这样的模组都可以被视为一个功能集合。
通俗易懂地说来,在编程中,“模块”其实就是指一个包含类、函数和各种变量的Python文件。它里面不仅有基本的数据类型还有各种操作方式。我们想要利用这些功能时就可以直接(导入该代码库后即可方便地调用这些功能)。
通俗易懂地说来,在编程中,“模块”其实就是指一个包含类、函数和各种变量的Python文件。它里面不仅有基本的数据类型还有各种操作方式。我们想要利用这些功能时就可以直接(导入该代码库后即可方便地调用这些功能)。
在pycharm按住ctrl点击模块名,就可以查看对应模块的详细代码了
2、模块的导入方式
模块在使用前需要导入,导入的语法如下:
[from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]
[]中的内容是可以缺省的,import是一定要写的
模块的导入一般写在代码文件的开头位置
常见的组合形式:
| import 模块名 from 模块名 import 类、变量、方法等 from 模块名 import * import 模块名 as 别名 from 模块名 import 功能名 as 别名 |
|---|
3、语法:
①、基本语法:
import 模块名
import 模块名1,模块名2
模块名.功能名()
#导入时间模块
import time
print('开始')
# 让程序睡眠1喵
time.sleep(1)
print('结束')
python
②、from 模块名 import 功能名
功能名()
from time import sleep
print('开始')
# 让程序睡觉一秒
sleep(1)
print('结束')
python
③、from 模块名 import *
功能名()
from time import *
print('开始')
# 让程序睡觉一秒
sleep(1)
print('结束')
python
注意:与直接import的区别在于调用时,不需要写模块名和“.”
④、as定义别名
#模块定义别名
import 模块名 as 别名
#功能定义别名
from 模块名 import 功能 as 别名
# 模块别名
import time as tt
tt.sleep(5)
print(123)
python
# 模块别名
from time import sleep as sl
sl(5)
print(123)
python
3、自定义模块
Python已经提供了许多功能完善的模块,
有时我们会根据需求开发一些特殊功能,
这里可以通过自定义模块来实现功能扩展。
任何一个Python文件都可以被视为一个独立的模块;其名称通常与文件名保持一致;这意味着在定义模块时必须遵循标识符命名规范。
需要注意的是,在导入多个模块时(且各个模块内部存在相同名称的功能),当我们调用该相同名称的功能时(会调用到后面被导入的那个模块的功能)。
在实际项目开发过程中, 当一个开发者完成了一个功能模块后, 为了以满足项目需求为目标, 他/她通常会在.py文件中增加必要的测试代码, 这样一来, 不论是在当前文件运行还是在导入该模块的其他任何地方运行时, 都会自动执行新增的测试代码以确保项目的稳定性和可靠性
def test(a,b):
print(a+b)
if __name__ == '__main__':
test(3,4)
python
上述代码中,在定义文件被调用的情况下(即当该模块在Python解释器中作为独立脚本被运行时),_name_变量会被赋值为_main_吗?因此,在这种情况下运行的if语句会触发相应的操作(即执行模块内的功能),而在其他非定义文件(如函数或其他模块)中则不会触发此操作。
除了__name__变量,python还提供了__all__变量,那么__all__变量有什么作用呢?
如果一个模块文件中定义了‘all’变量,则当使用from语句对整个模块进行导入时(即from 文件 import ),该模块将仅能获取该列表中的元素。需要注意的是该变量仅适用于操作,在这种情况下(即直接以文件名形式引用时),不会受到此变量的影响。
三十八、包
从物理学角度来看,包类似于一个目录,在这个目录中包含了初始化.py文件,并且这样的目录还可以容纳多个模块
从逻辑上看,包的本质依然是模块
包的作用:管理模块
使用方法跟模块一致,就是__all__这个变量要写在__init__.py文件中
就是因为有许多非常的第三方包,python才可以更加便捷的开发
安装第三方包——pip
打开命令符程序,在里面输入 pip install 包名称 就可以了
或者通过pycharm添加
具体的我就不细说了,如果需要具体的流程可以评论区发出或者私聊我
三十九、JSON
JSON是一种这一种轻量级的数据交换规范。必须按照JSON指定的规范进行分类整理和有条理地存储数据
JSON本质上是一个带有特定格式的字符串
作用:为了使不同语言之间能够相互传递数据而存在,JOSN是一种高效可靠的数据交换方案
语法:
# 导入json模块
import json
# 准备复合格式json格式要求的python数据
data = [{"name":"ikun","age":2.5},{"name":"geigei","age":3.5}]
# 通过json.dumps(data)方法把python数据转换为了json数据
data1 = json.dumps(data)
# 通过json.loads(data)方法把json数据转化为了python数据
data2 = json.loads(data1)
python
注意;如果有中文可以带上:ensure_ascii = False 参数来确保中文正常转换
json.loads()方法会把json数据转化为了python列表或字典
四十、类
1、定义:
在程序中能够实现类似生活中的方式:创建一个表格并生成数据表然后填充数据以完成数据管理任务
在程序中设计表格,我们称之为:设计类(class)
class student:
name = None #记录学生姓名
python
在程序中打印生产表格,我们称之为:创建对象
# 基于类创建对象
stu1 = student()
stu2 = student()
python
在程序中填写表格,我们称之为:对象属性赋值
stu1.name = 'ikun' # 为学生1对象赋予属性值
stu2.name = 'geigei' # 为学生2对象赋予属性值
python
2、语法:
在其中, 我们大致了解到了, 可以通过类来包装属性, 并基于类生成一系列的具体实例来实现功能。
现在我们来看看类的使用语法:
class 类名称: #class是关键字,表示要定义类了
类的属性 #类的属性,即定义在类中的变量(成员变量)
类的行为 #类的行为,即定义在类中的函数(成员方法)
创建类对象的语法:
对象 = 类名称()
成员方法的定义语法:
在类中定义成员方法和定义函数基本一致,但还是有细微区别:
def 方法名(self ,形参1,.......,形参N):
方法体
注意:在定义方法中self关键字是必须要填写的
当我们使用类对象调用方法的时,self会自动被python传入
在方法内部,想要访问类的成员变量,必须使用self
self关键字
尽管在参数列表中,但是传参的时候可以忽略它, 如:
class student:
name = None # 记录学生姓名
def say_hi(self, msg):
print(msg)
def say_name(self):
print(self.name)
# 基于类创建对象
stu1 = student()
stu1.name = 'ikun' # 为学生1对象赋予属性值
stu1.say_hi('hi') #调用的时候需要传入msg参数
stu1.say_name() #调用的时候无需传参
python

注意:在定义方法时必须使用self关键字,在调用类属性时也需使用self关键字;无需处理参数传递
3、思考
类和对象的关系?
类是程序的”设计图纸“;对象是基于图纸生产的具体实例
什么是面向对象编程?
面向对象编程本质上就是依靠对象来进行程序设计。换句话说,在开发过程中我们首先需要创建类并基于这些类生成相应的对象接着在这些对象的基础上展开具体的工作
4、init()方法
python类可以使用:init()方法,称之为构造方法
作用:
在创建类对象(构造类)的时候,会自动执行
在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用
class student:
name = None # 记录学生姓名
age = None # 记录学生年龄
def __init__(self, name, age):
self.name = name
self.age = age
print("创建了一个对象")
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
print(stu.name) # 输出:ikun
print(stu.age) # 输出:2.5
python

注意:
构建类时传入的参数会自动提供给__init__方法
构建类的时候__init__方法会自动执行
构造方法名称init前后都有2个下划线,同时不要忘记了self
同时在__init__方法内部使用过的变量,可以不需要在外部定义如:
class student:
def __init__(self, name, age):
self.name = name
self.age = age
print("创建了一个对象")
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
print(stu.name) # 输出:ikun
print(stu.age) # 输出:2.5
python
5、魔术方法
上面学习的__init__()方法是python内置的方法之一
这些内建的类函数,每个类函数都有其独特的功能;这些内建的方法我们称为特别的方法。
①、init()方法
上述已经介绍,不做过多赘述
②、__str__字符串方法
当我们需要将类对象转换为字符串时,在不使用str函数的情况下会直接输出内存地址;例如,在Python中使用id()函数即可实现这一功能。
class student:
def __init__(self, name, age):
self.name = name
self.age = age
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
print(stu) # 输出:<__main__.student object at 0x000002A9F0C64230>
print(str(stu)) # 输出:<__main__.student object at 0x000002A9F0C64230>
python
注
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'{self.name} is {self.age}'
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
print(stu) # 输出:ikun is 2.5
print(str(stu)) # 输出:ikun is 2.5
python

③、__lt__小于符号比较方法
直接比较两个对象是不被允许的,在类中定义__lt__成员函数,则可以同时实现对于<和>两种运算符的支持。
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
stu1 = student('geigei',25) # 输出:创建了一个对象
print(stu < stu1) # 结果:True
print(stu > stu1) # 结果:False
python

另一个类对象中other作为参数传递进来时,其返回值将是一个布尔类型的值,并且其具体内容则需根据具体需求自行设定.
④、__eq__比较运算符实现方法
未实现__eq__方法的情况下,默认情况下对象之间是可以相互比较的。这种比较仅基于对象内部存储的信息(如内存地址字段),并无实际意义。若要进行对象间的比较操作,则必须明确指定其比较逻辑,并且结果必然是False。一旦实现了该功能,则可以根据具体需求自行决定是否启用该功能。
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
stu1 = student('geigei',25) # 输出:创建了一个对象
print(stu == stu1) # 结果:False
python

其中other是一个另外的类实例,并且返回值是一个布尔类型的值;此外还可以根据需求自定义内容
⑤、__le__小于等于比较符号方法
在现实生活中,在某些情况下可能会遇到需要使用<=或>=这样的比较运算符的情况。那么是否应该使用对应的Python内置类如__eq__和__le__来进行实现呢?实际上这是不可能实现的,在编写代码时如果你直接使用这些符号进行运算系统会报错提示无法识别这些符号。因此我们需要采用我们的自定义处理方式来解决这个问题
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
return self.age <= other.age
# 基于类创建对象
stu = student('ikun',2.5) # 输出:创建了一个对象
stu1 = student('geigei',25) # 输出:创建了一个对象
print(stu <= stu1) # 结果:True
print(stu >= stu1) # 结果:False
python

其中other是一个其他类的对象,返回值是布尔类型的。其内容可根据具体需求自行设定。
⑥、小结
| 方法 | 功能 |
|---|---|
| init | 构造方法,可用于创建类对象的时候设置初始化行为 |
| str | 用于实现类对象转字符串的行为 |
| lt | 用于2个类对象进行小于或大于比较 |
| le | 用于2个类对象进行小于等于或大于等于比较 |
| eq | 用于2个类对象进行相等比较 |
6、封装
①、概念
将现实世界事物在类中描述为属性和方法,即为封装
②、私有成员、私有变量
大多数现实事物具有部分不可见的属性与行为。同样,在用类来描述这些属性与方法时也需遵循这一规定。这就需要为这些不可见的属性与行为创建私有成员变量。
③、如何定义:
成员变量和成员方法的命名均以__作为开头即可(2个下划线)
④、访问限制:
类对象受限于其权限设置而无法直接访问私有成员;然而可以通过类中其他成员的帮助或手段来实现对私有成员的间接访问
7、继承
①、定义:
继承就是一个类,继承另外一个类的成员变量和成员方法
②、语法:
| class 类(父类[,父类2,......,父类N]): 类内容体 |
|---|
在子类构造过程中,每个对象都可以拥有自定义的属性与操作;此外,在实际应用中,默认情况下还允许直接调用父类所定义的这些属性与操作。需要注意的是,在这种情况下,默认情况下不允许访问或使用父类中的私有属性与操作。
注意:单一 inheritance 关系指的是一个 class 从另一个 class 中直接获取属性和方法的一种关系模式;而 multiple inheritance 则是指允许一个 class 从多个 base class 中系统地继承属性和方法;在 multiple inheritance 的情况下,默认遵循从 left 到 right 的顺序依次进行;特别地,在 parent class 中存在具有相同名称的方法或 attribute 时,则优先采用左侧定义的版本
③、pass关键字
在子类中superclass variables and methods已经足够充分时,在不需要手动实现这些功能的情况下,在编译过程中不会出现错误的情况下,则需要使用pass关键字来指示编译器不要处理这些细节。
8、复写
子类继承父类的属性及操作方式后,则若对之表示不满,则可执行复制
即:在子类中重新定义同名的属性或方法即可
class ji:
IMEI = None # 序列号
producer = "ikun" # 厂商
def call_by_egg(self):
print("geigei")
class iji(ji):
producer = "IT" # 复写父类属性
def call_by_egg(self): # 复写父类方法
print("geigei的蛋")
python

一旦重写了父类的成员,在实例化该类对象并执行其成员调用操作时,就会导致该新实例自动绑定到被重写的父类的相应方法或属性。
如果需要使用被复习的父类的成员,需要特殊的调用方式:
方式1:
调用父类成员
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)
方式2:
使用super()调用父类成员
使用成员变量:super().成员变量
使用成员方法:super().成员方法()
class ji:
IMEI = None # 序列号
producer = "ikun" # 厂商
def call_by_egg(self):
print("geigei")
return None
class iji(ji):
producer = "IT" # 复写父类属性
def call_by_egg(self): # 复写父类方法
# 方式1调用父类成员
ji.call_by_egg(self)
# 方式2调用父类成员
super().call_by_egg()
return None
j = iji()
j.call_by_egg() # 输出俩个geigei
python

注意:只可以在子类内部调用父类的同名成员
9、类型注解
Python于3.5版本发布时引入了类型注解,并为静态类型检查工具以及如IDE等第三方应用提供了便利
在代码中涉及数据交互的区域进行详细说明,在这些地方明确标明所使用的数据类型。
主要功能:
帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释
并不会真正的对类型做验证和判断
也就是,类型注解仅仅是提示性的,不是决定性的
据类型和注解类型无法对应也不会导致错误
支持:
变量的类型注解
函数(方法)形参列表和返回值的类型注解
①、变量类型注解
基础语法1:变量:类型
# 基础数据类型注解
var1: int = 10
var2: float = 2.5
var3: bool = True
var4: str = "ikun"
# 类对象类型注解
class student:
pass
stu: student = student()
# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_set: set = {1, 2, 3}
my_dict: dict = {"ikun": 2.5}
my_str: str = 'ikun'
# 容器类型详细注解
my_list1: list[int] = [1, 2, 3]
my_tuple1: tuple[str, int, bool] = ('ikun', 2, True)
my_set1: set[int] = {1, 2, 3}
my_dict1: dict[str, float] = {'ikun': 2.5}
python

注意:元组类型设置类型详细注解,需要将每一个元素都标记出来
字典类型设置详细注解,需要2个类型,第一个是key第二个是value
基础语法2:#type:类型
# 除了使用变量:类型,这种语法做注解外,也可以在解释中进行类型注解。
import json
from random import random
from _ctypes_test import func
class student:
pass
var1 = random.randint(1,10) # type:int
var2 = json.loads(data) # type:dict[str,int]
var3 = func() # type:student
python
对变量进行标记,并使其实体呈现出来;通常情况下不需对变量进行标注,在无法直接查看其类型时,则会添加相应的类型标记
②、方法类型注解
形参注解:
def 函数方法名(形参名:类型,形参名:类型,......):
pass
def test(x:int,y:int):
return x+y
python
返回值注解:
def 函数方法名(形参:类型,......,形参:类型)-> 返回值类型:
pass
def test(x:int,y:int) -> int:
return x+y
python
③、Union类型
使用Union可以定义联合类型注解
语法:
导包:from typing import Union
使用:Union[类型,类型,类型]
在变量注解、函数(方法)形参和返回值注解等场景中,支持联合类型注解的应用
from typing import Union
my_list: list[Union[int, str]] = [1, 2, 'hello', 'world']
my_dict: dict[str,Union[int, str]] = {'name': 'ikun', 'age': 23}
def func(data: Union[int, str]) -> Union[int, str]:
pass
python
10、多态
多态指的是,同一个行为,使用不同的对象获得不同的状态
# 定义父类
class animal:
def speak(self):
pass
#子类继承
class dog(animal):
def speak(self):
print("汪汪汪")
#子类继承
class cat(animal):
def speak(self):
print("喵喵喵")
def main(animal):
animal.speak()
dog = dog()
cat = cat()
main(dog)
main(cat)
python

该物种动物类群的说话方法被空实现。这种设计意图表明:在父类中能够明确地确定由哪些具体的方法来进行交流。
具体的方法实现,由子类自行决定,这种写法叫抽象类(也可叫接口)
一般是由组长决定执行的内容,然后组员去实现具体的内容
父类做定义声明,子类做实际工作,用以获得同一行为,不同状态
四十一、数据库
在python中,使用第三方库:pymysql来完成对mysql数据库的操作
安装:
pip install pymysql
1、创建到MySQL的数据库连接
为了实现目标功能,首先需要导入必要的模块;随后生成一个链接实例,并根据需求设置相应的参数;填写完所有信息后即可完成整个操作流程;请确保在任务完成后关闭该连接以释放资源。具体代码如下:
from pymysql import Connection
# 获取到MySQL数据库的链接对象
coon = Connection(
host = 'localhost', # 主机名(或者IP地址)
port = 3306, # 端口,MySQL默认为3306
user = 'root', # 账户名
password = '123456' # 密码
)
# 打印MySQL数据库软件信息
print(coon.get_server_info()) # 当输出你数据库的相关版本时则证明已经成功链接了
# 关闭数据库的链接
coon.close()
python

2、执行非查询性质的sql语句:
基于已经成功实现了数据库连接的情境,在此之后的操作中,请利用游标对象来执行相应的SQL语句,并且请记住,在此之前需要用数据库对象选择所需的数据库。具体代码如下;
from pymysql import Connection
# 获取到MySQL数据库的链接对象
coon = Connection(
host = 'localhost', # 主机名(或者IP地址)
port = 3306, # 端口,MySQL默认为3306
user = 'root', # 账户名
password = '123456' # 密码
)
# 获取游标对象
cursor = coon.cursor()
coon.select_db('aaa') # 选择数据库,如果没有aaa则需要提前创建一个
# 使用游标对象,执行sql语句
cursor.execute('CREATE TABLE test(ID INT, INFO VARCHAR(255))')
#关闭数据库的链接
coon.close()
python

3、执行查询性质的sql语句:
前置内容与非查询情况相似,在调用fetchall()函数时会获取数据结果为元组类型。
from pymysql import Connection
# 获取到MySQL数据库的链接对象
coon = Connection(
host = 'localhost', # 主机名(或者IP地址)
port = 3306, # 端口,MySQL默认为3306
user = 'root', # 账户名
password = '123456' # 密码
)
# 获取游标对象
cursor = coon.cursor()
coon.select_db('TEST02') # 选择数据库,如果没有aaa则需要提前创建一个
# 使用游标对象,执行sql语句
cursor.execute('SELECT * FROM ACCOUNT')
result:tuple = cursor.fetchall() # 会以元组的形式输出
for row in result:
print(row)
#关闭数据库的链接
coon.close()
python

4、执行插入性质的sql语句:
虽然该功能可以直接针对数据库中的表执行操作但它对于插入事务存在特殊要求即必须完成一次完整的事务提交才能成功地将数据加入数据库系统因此处理插入事务需要在相应的SQL语句后增加一条Commit()语句以确保数据的一致性和完整性
from pymysql import Connection
# 获取到MySQL数据库的链接对象
coon = Connection(
host = 'localhost', # 主机名(或者IP地址)
port = 3306, # 端口,MySQL默认为3306
user = 'root', # 账户名
password = '123456' # 密码
)
# 获取游标对象
cursor = coon.cursor()
coon.select_db('TEST02') # 选择数据库,如果没有aaa则需要提前创建一个
# 使用游标对象,执行sql语句
cursor.execute('insert into classes values (999,2021,"计算机科学","20班")')
# 通过commit确认
coon.commit()
# 关闭连接
coon.close()
python

5、自动commit
无需手动提交确认的情况下,在构建连接对象时配置自动提交属性。
# 获取到MySQL数据库的链接对象
coon = Connection(
host = 'localhost', # 主机名(或者IP地址)
port = 3306, # 端口,MySQL默认为3306
user = 'root', # 账户名
password = '123456', # 密码
autocommit = True # 设置自动提交
)
python
