
03 for循环语句与列表、元组
作业演示
# 导入random模块
import random
# 随机生成1到100的任意整数存储在变量num中
num = random.randint(1, 100)
count = 0 # 记次数
while True:
result = int(input('请输入您猜测的数字:'))
if 1 <= result <= 100:
if num == result:
print('恭喜您猜对啦!')
break
else:
count += 1
if count == 5:
print(f'对不起,您所有猜测次数已用完,生成的随机数为:{num}')
break
elif result > num:
print(f'您猜的太大了,您还有{5 - count}次猜测机会,请继续猜测')
elif result < num: # 或者写成else
print(f'您猜的太小了,您还有{5 - count}次猜测机会,请继续猜测')
else:
print('输入范围为1-100,请重新输入')
在开始今天的新内容之前,咱们要先学习一个概念
字符串的索引
"""
概念
下标/索引:
索引是指用于访问数据中的某个元素或部分元素的数字或标识符
(在已创建的字符串、列表、元组的数据中提取某一个数值或者是某一部分数字)。
在Python中,索引通常指从0开始依次递增的整数,用于访问字符串、列表、元组等元素。
在这里,我们把字符串、列表、元组三种数据类型称为序列类型,只有序列类型才会有索引/下标
索引取值的格式:搭配中括号([]),里面填写需要提取字体的索引位置
索引的位置顺序:
从左到右 从0开始
从右到左 从-1开始
"""
# 如何提取该字符串内的‘师’字
str1 = '欢迎同学们进入孑然老师的课堂!' # 该字符串一共有15个字符 索引值为0-14
print(str1[10]) # 师
print(str1[-2]) # 堂
以上的内容是提取单个字符,那怎么提取两个或者一部分的字符呢?
字符串的切片
"""
在Python中,可以通过字符串的切片(slicing)操作来提取字符串中的一部分字符。切片操作通过两个下标来指定切片的开始和结束位置
语法为:
string[start:end]
其中string是要提取的字符串,start是索引的起始位置,end是结束位置,而end的索引不包含在切片内
"""
str1 = '欢迎同学们进入孑然老师的课堂!' # 该字符串一共有15个字符 索引值为0-14
print(str1[0:5]) # 欢迎同学们
print(str1[-3:]) # 课堂
以上的内容,是对于字符串如何提取其中一个或者一部分的字符,此时,如果咱们又有了一个需求,需求内容是,如何将一个字符串内的所有字符一个一个打印出来呢?
在上一节课我们说过,对于重复执行某一段代码的功能,我们会称为循环。这里我们可以使用while循环来对于这个需求进行实现。
遍历
对于这一种形式,在python中我们可以称为遍历,其中简单的含义,就是将字符串内的所有字符一个一个打印出来。
"""
遍历:
将字符串内的所有字符一个一个打印出来
"""
str1 = '今天是2023年xx月xx日,星期X' # 该字符串一共有18个字符,索引长度为0-17
i = 0 # 设置循环初始值
while i < 18: # 创建while循环,让while循环18次,每一次循环后i的值都会加1
print(str1[i])
i += 1
运行之后的显示,无论是中文还是数字,以及标点符号,都进行了一个打印,那这一个过程的话,是我们通过while循环去对于字符串的内容进行一个循环打印,也就是叫我们的遍历。
但是通过while循环打印的话,同学们有没有觉得这样非常的麻烦,因为我每一次使用while循环进行遍历的时候,都需要先要知道字符串里字符的长度,每一次进行遍历时都需要先数一下字符串里面的有几个字符。
那么假设,现在有一个字符串里的字符非常的多,可能有上百个上千个值,我无法确定它的字符长度到底是多少,那我该怎么样去设置循环的一个次数呢?
所以对于这个问题,我们就可以来了解一下今天我们所要学习到的另一个循环,for循环
for循环
我们可以先来看一下ppt,像for循环可以将可迭代对象里面的元素依次取出赋值给循环变量,然后执行循环语句,所有元素取完,即可循环结束。
"""
for循环遍历
"""
str1 = '今天是2023年xx月xx日,星期X'
for i in str1: # for循环不需要考虑循环次数,循环次数由后面的对象长度来决定
print(i)
对于上面的while循环来说,for循环会简单得多,因为for循环是不需要考虑循环次数,即可遍历字符串。
对于for循环语法格式中,in后面的是可迭代对象,可能有一些同学就会有疑问了,什么是可迭代对象呢,其实,可迭代对象就是指可以遍历的对象,像字符串类型就是可迭代对象之一,在我们之后的学习中也会学到一系列的可迭代对象,例如待会儿就会学习到的列表、元组,还有在之后也会学习到字典与集合,这一些内容都是算可迭代对象。
而在之前所说到的,列表、元组、字符串这三种被称为序列类型。对于序列类型来说,只有序列类型才具有下标与切片的操作,而像字典、集合的这一种可迭代对象是不一定有下标和切片操作的。
总的来说,序列类型可以看作是一种具有下标和切片操作的可迭代对象,而可迭代对象则是可以遍历的对象的多种类型的统称。
对于for循环遍历,也可以使用一个debug的功能,给代码添加断点,使得代码一步一步进行运行。
搭配range函数使用for循环
在我们学习while循环的时候写过一个需求:
# 在控制台里打印输出1-100的数字
# while循环
i = 1
while i < 101:
print(i)
i += 1
既然while循环可以做到,那for循环可不可以做到呢,答案也是可以的,在for循环中,可以搭配一个range函数进行使用
"""
语句格式:
for 循环变量 in range(start, end, step)
start:默认范围起始值为0
end:数值范围结束值,end参数的本身是不会参与进去的
step:默认步长为1
"""
# 如何使用for循环打印出1-100这些数字在控制台
# for i in range(100): # 单输入100,会默认为循环打印从0开始,到99结束的数
# print(i+1)
#
# for i in range(1, 101): # 输入两个数的含义为打印从1开始,到100结束
# print(i)
for i in range(1, 101, 2): # 输入三个数的含义为打印从1开始,到100结束,且每次循环变量i都会成+2的指数增长
print(i)
没有什么问题的话呢,我们就接着往下走,接下来咱们要学习的是与break为兄弟关系的一个关键字continue
continue
continue在英文翻译的意思是继续的意思,在我们之前所写的循环中,一般都是从头到尾直接循环结束了,如果使用break就是直接在所需要的地方强行结束循环,那么continue是什么意思呢,continue在循环中为跳过这一次的循环,直接进行下一次的循环,这句话是什么意思呢,对于continue使用的情况,老师在这里给大家创造一个情景进行一个演示
"""
假设目前需要打印1-10十个数字,但是,对于被3整除的数,需要打印 过 字进行代替
continue
跳过当前循环,执行下一次循环
"""
for i in range(1, 11):
if i % 3 == 0: # 创造if条件:当循环里的数对3取余为0时(也就是被3整除时),则执行以下代码
print('过')
continue # 使用continue跳过本次循环(不再执行continue以下的代码),直接开始下一次循环
print(i)
这里也可以给大家进行一个break跟continue同时使用的一个情景
"""
创造一个1-10的循环进行打印,
但是对于被3整除的时候,需要打印过字进行代替,
并且当循环变量i等于10时就直接使用break跳出,不打印数字10
"""
for i in range(1, 11):
if i % 3 == 0: # 创造if条件:当循环里的数对3取余为0时(也就是被3整除时),则执行以下代码
print('过')
continue # 使用continue跳过本次循环(不再执行continue以下的代码),直接开始下一次循环
elif i == 10:
break
print(i)
同时在for循环中也可以和else一起使用,当循环被break终止时,else是不会执行的
for i in range(1, 11):
if i % 3 == 0:
print('过')
continue
elif i == 10:
break
else:
print(i)
else: # else也可以和for循环一起使用,当循环被break终止时,else是不会执行的
print('打印完成')
如果没有什么疑问的话,接下来将是对于for循环的最后一个知识点,for循环嵌套,既然while循环可以进行嵌套,那么,for循环也可以进行一个循环嵌套,在学while循环的知识点时,咱们使用while循环嵌套打印了一个长为5,宽为3的矩形,那在这里,咱们也可以使用for循环嵌套来打印出这一个矩形
"""
使用for循环嵌套打印一个长为5,宽为3的矩形
"""
for i in range(3): # 先定义外层循环,使用三次循环,打印三行空字符串
row = ''
for j in range(5): # 定义内层循环,使用五次循环,用字符串拼接的方式将每一行的空字符串上拼接成5个星号(*)
row += '*'
print(row)
如果没有什么问题呢,咱们可以接着往下走,现在我们要学习的是列表,在我们之前有简单了解过python中的六大基础数据类型中的数值类型以及字符串类型,那既然有六大数据类型,剩下的几种数据类型我们也是都要学到的,现在我们就要学习第三种数据类型:列表
列表
首先我们可以来看一下思考一,假设一个班有50个学生,如果要存储这个班级的所有同学名字该怎么办,
我们可以再pycharm里将这个需求缩小来试一下。
"""
如何创建 5个学生的名字
# 创建张三、李四、王五、小红、小明5个学生的名字
"""
# 使用字符串
stu1 = '张三'
stu2 = '李四'
stu3 = '王五'
stu4 = '小红'
stu5 = '小明'
# 使用列表
li = ['张三', '李四', '王五', '小红', '小明']
如果使用字符串创建5个学生名字的话必须要有5个变量,但是如果使用列表的话,就只需要一个列表就能涵盖这一些学生的内容,再如果,我想在这个列表里添加一个小明的学号,可以使用小括号或者中括号将小明的学号以及他的姓名括起来,并且用逗号分隔
# 给小明添加一个为10的学号
li = ['张三', '李四', '王五', '小红', ['10', '小明']]
li1 = ['张三', '李四', '王五', '小红', ('10', '小明')]
然后在之前说过,字符串、列表、元组这三种类型都是序列类型,所以在这里的列表也可以进行索引取值与切片,在列表中的索引就不是像字符串一样每一个字符都是一个索引值,在列表中,每一个元素都是用逗号分隔,每一个元素值都对应一个索引。
但如果在列表中有中括号括起来的元素,为列表中的嵌套,那么他们即算作一个元素,且索引值只有一个。使用len()函数即可查看当前列表的长度。
"""
索引
在列表中,每一个元素都是用逗号分隔,每一个元素值都对应一个索引。
但如果在列表中有中括号括起来的元素,为列表中的嵌套,那么他们即算作一个元素,且索引值只有一个。
索引值
从左到右:从0开始,每往右边一个元素,索引的值都会在0的基础上加1
从右到左:从-1开始,每往左边一个元素,索引的值都会在-1的基础上减1
"""
li = ['张三', '李四', '王五', '小红', ['10', '小明']]
# 使用len()函数即可查看当前列表的元素长度
print(len(li)) # 5
# 打印王五
print(li[2])
# 打印小红
print(li[-2])
# 只打印小明的学号
print(li[4][0])
# 如果超出索引的范围就会报错
# print(li[5])
既然能使用索引取值,当然也能使用切片
li1 = ['张三', '李四', '王五', '小红', ['10', '小明']]
# 使用切片获取前三个元素的内容
print(li1[0:3]) # 切片范围后面的值不包括在切片里面
# 打印李四跟王五
print(li1[1:3])
# 切片也可以指定步长
# 打印所有的偶数索引的元素
print(li1[0::2])
对于列表来说,还有一些功能能对于存在的列表进行增加、删除、修改、查询(增删改查)的功能
增加
"""
对于列表来说,还有一些功能能对于存在的列表进行增加、删除、修改、查询(增删改查)的功能
增加:对于增加的方法有三种,在末尾添加、指定位置添加和批量添加
append:在列表的末尾添加想要加入的元素
insert:在指定的索引位置添加指定元素
extend:将另一个列表中的内容逐一添加
"""
li2 = ['张三', '李四', '王五', '小红', ['10', '小明']]
li2.append('孑然') # 在列表的末尾添元素
li2.insert(1, '杨过') # 在指定的索引位置添加元素(在索引1的位置添加'杨过'这个元素)
li3 = ['同学1', '同学2']
li2.extend(li3) # 批量添加元素至列表末尾(将另一个列表的元素逐一添加)
print(li2)
修改
"""
修改
利用索引的位置可以直接修改指定位置的值
"""
li4 = ['张三', '李四', '王五', '小红', ['10', '小明']]
print(li4)
# 把小红的名字改成李华
li4[3] = '李华'
print(li4)
删除
"""
列表元素的删除
pop
remove
clear
del
"""
li5 = ['张三', '杨过', '李四', '王五', '小红', ['10', '小明'], '孑然', '同学1', '同学2']
# 单使用pop()将为默认移除最后一个元素
li5.pop()
print(li5)
# 在pop()方法括号里输入的数字为指定删除元素的索引
li5.pop(1) # 删除索引为1的元素
print(li5)
# remove为删除指定的元素
li5.remove('孑然')
print(li5)
# 使用del关键字可以配合切片的方式进行批量删除
del li5[0:3]
print(li5)
# clear:使用clear方法为将列表里所有的元素清空
li5.clear()
print(li5)
# 注意:删除是不可逆的,在以后编写程序中,删除的内容将无法恢复。
查询
"""
列表的查询
1、使用关键字in和not in判断元素是否在列表中
2、使用index查询元素存在列表中的索引位置,如果输入的元素在列表中并不存在,就会报错
"""
li = ['张三', '杨过', '李四', '王五', '小红', ['10', '小明'], '孑然', '同学1', '同学2']
# 使用关键字in和not进行判断,输出为布尔类型
print('张三' in li) # True
print('熊大' in li) # False
print('同学3' not in li) # True
print('杨过' not in li) # False
# 使用index方法查询元素在列表中的索引位置
print(li.index('小红')) # 4
# print(li.index('小白')) # 报错,因为该元素为列表中不存在的值
列表的其他方法
列表推导表达式
利用循环可以快速生成一个数值类型的列表
"""
列表推导表达式
使用列表推导表达式可以快速生成一个列表,并能快速添加列表的值
"""
# 正常使用for循环新增数值列表
li_num = []
for i in range(100): # 创建一个从0-99的100次循环
if i % 2 == 0: # 当本次循环内i的值对2取余为0时(i的值能整除2时),则将i的值添加至空列表内
li_num.append(i)
print(li_num)
# 列表推导表达式
li_num_new = [i for i in range(100) if i % 2 == 0]
print(li_num_new)
# 以上两种方式一样
列表其他使用方法
列表除了增删改查,还有一些其他的方法
"""
列表中的其他方法
copy() 复制列表
count() 计数,统计列表中一个元素出现的次数
reverse() 将列表的内容反转变为从后往前排序
sort() 对于列表中的元素进行一个排序,默认为升序。如果在sort括号中使用sort(reverse=True)将会为降序排序
"""
numbers = [4, 5, 7, 9, 7, 4, 4, 3, 5, 6]
# 使用copy方法将存在的列表内容复制给新的列表
new_numbers = numbers.copy()
print(numbers)
print(new_numbers)
# 使用count方法统计列表中某一个元素出现的次数
print(numbers.count(4)) # 3
print(numbers.count(9)) # 1
# 用reverse方法反转将列表中内容从后往前排序
numbers.reverse()
print(numbers)
# 使用sort方法将元素进行排序,默认为升序
numbers.sort()
print(numbers)
# sort括号中使用reverse=True即可让元素为降序排序
numbers.sort(reverse=True)
print(numbers)
元组
"""
元组
元组与列表的结构类似,但是比起列表来说,元组的元素无法使用方法修改,也就是无法进行增删改三种方式,只能进行查询
创建方式,使用小括号进行包裹,其中,每个元素用逗号分隔。
"""
# 元组的创建,使用括号包裹内容,其中用逗号分隔
tuple_one = ('苹果', '香蕉', '西瓜', '葡萄')
print(type(tuple_one)) # 元组的类型名:tuple
print(tuple_one)
# 元组为不可变类型,只能对元组内容进行查询
# 使用元组内元素的索引进行查询:查询香蕉
print(tuple_one[1]) # 香蕉
# 如果元组中只有一个元素,还是要跟上逗号,否则程序只会当作它是一个字符串类型
tuple_two = ('狮子', )
print(type(tuple_two))
"""
元组的拆包
元组的拆包是指,将元组中的每个元素都赋值给变量,以方便访问和操作
操作方法:
用逗号分隔变量名,将元组中的内容赋值给变量名
"""
a, *b, c = tuple_one # 元组还可以同时将多个内容赋值给变量,在变量名前加上*号则可以将多余元素都接收,并返回一个列表
print(a)
# 元组还可以同时将多个内容赋值给变量,在变量名前加上*号则可以将多个元素接收,接收多个元素的变量为列表类型
print(b)
print(type(b))
print(c)