Python Day04(案例:生者死者游戏)
嵌套循环的时间对比
这里引入了一个python内置模块: time
import time
# 模块
# 作用: 直接借用别人实现好的功能
print(time.time())
#python将1970-1-1 设定为第一天,time得到的结果是从第一天到这一行代码被执行的总秒数
# excel 将1900-1-1 设为第一天 ,9999年12月31日 设置为最后一天
start = time.time()
for x in range(0, 35):
# y代表中马
for y in range(0, 51):
if 6 * x + 4 * y + (100 - x - y) == 200:
print(f'大马使用{x}匹,中马使用{y}匹,小马使用{100 - x - y}匹')
end = time.time()
print(end-start)
# 以上代码就粗略的使用time()模块自带的方法打印出了完成循环所用时间
# 对于下面循环实现的时间同样可以使用time()来实现统计
print('——————————————————————————————————————————')
for i in range(0, 35):
for j in range(0, 51):
for z in range(0, 101):
if i + j + z == 100 and 6 * i + 4 * j + z == 200:
print(f'大马{i}匹,中马{j}匹,小马{z}匹')
break 和 continue 的使用
# 案例 : 数字炸弹。给定一个范围中的随机一个数字去猜这个数字
import random
# 随机模块
# randint(a,b) : 从[a,b]中随机选取一个整数
# num = random.randint(1,100)
# flag = True
# while flag :
# selfNum=int(input('请输入猜的数字'))
# if selfNum > num :
# print('再小点')
# elif selfNum<num:
# print('再大点')
# else:
# print('恭喜你猜对了,接受惩罚')
# flag = False
# break 和 continue
# break : 被触发时直接结束break所在循环
# continue: 被触发时直接结束当前循环进入下一次循环
for i in range(1, 21):
if i % 5 == 0:
print('*****')
# continue
break
print('=====')
else:
print(i)
for-else循环和while-else循环
# 案例: 判断1-100 之间所有素数 (质数)
# 素数 : 只有1 和他本身两个因子的数
for i in range (1,101):
if i == 1:
print(False)
elif i == 2:
print(True)
else :
for j in (2,i):
if i % j == 0:
print(f'{i}不是素数')
break
else:
print(f'{i}是素数')
# 应用场景 : 当所有情况都必须判断完才能下结论时使用for-else 结构
"""
语法:
for 变量 in 容器:
代码块
else:
代码块
当for循环正常结束时,else语句被执行,当for循环非正常结束时else语句不执行
break、return 等关键字会影响for循环的正常使用
"""
列表及其相关操作
初识列表
# 列表
# 作用: 一次性存放多个元素
# 数据类型: list
"""
1.列表是可变的。(可以增、删、改)
2.列表是有序的。(下标,每个元素有自己的固定位置)
3.列表的容器标志:[] ; 类型 list
4.列表中可以存放任意类型数据。
5.列表中允许出现重复元素。
"""
# 创建一个空列表:
list1 = []
list2 = list()
# 创建一个非空列表
list3 = [1, 1.1, True, None, 'abcde', [1, 2, 3], (1, 2, 3)]
print(list3)
# len(): 能够查看容器中元素个数
print(len(list3)) # 结果为7
# 遍历列表
for i in list3:
print(i, type(i))
# 列表的重复和拼接
# 拼接
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]
print(list1 + list2 + list3)#[1, 2, 3, 4, 5, 6, 7, 8, 9]
# 重复
print(list1 * 5) #[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
列表的切片
下标: 有序容器中每个元素的位置索引
# 下标分为正向下标和负向下标
# 正向下标: 从0开始,从左向右依次递增
# 负向下标: 从-1开始,从右向左递减
# 通过下标获取元素
# 切片
# 获取有序容器中部分元素
# 语法 : 容器[start:end:step]
# step默认为1,从左向右取元素。省略start和end不写表示完全遍历。
# 切片也是左闭右开区间
list1 = ['csgo','阴阳师','三国杀','和平精英','光遇']
print(list1[:]) # ['csgo','阴阳师','三国杀','和平精英','光遇']
print(list1[:-1]) # ['csgo', '阴阳师', '三国杀', '和平精英']
print(list1[-1:-5:-1]) #['光遇', '和平精英', '三国杀', '阴阳师']
print(list1[::-1]) #['光遇', '和平精英', '三国杀', '阴阳师', '王者荣耀']
"""
如果step>0,end对应的元素必须在start对应元素后面。
step<0,从end位置在start位置前
"""
# 练习:
list2 = ['柯南', '百变小樱', '奥特曼', '甄嬛传', '海贼王', '火影忍者', '斗破苍穹']
# 1.获取['柯南','奥特曼','海贼王','斗破苍穹']
print(list2[::2])
# 2.获取['斗破苍穹','甄嬛传','百变小樱']
print(list2[-1::-3])
# 3.获取['奥特曼','百变小樱','柯南']
print(list2[2::-1])
# 4.获取['柯南']
print(list2[0:1])
# 5.获取 柯南
print(list2[0])
# 下标不能越界,切片可以越界
# list2[8] #IndexError: list index out of range
print(list2[0:10000])
遍历列表
# 有序容器的循环遍历分为直接遍历和间接遍历
# 直接遍历
list1 = ['A','B','C','D']
for i in list1:
print(i)
#间接遍历
for index in range(len(list1)):
print(f'下标{index}----->元素{list1[index]}')
# 练习: 通过循环获取'C'的下标
for i in range(len(list1)):
if list1[i] == 'C':
print(i)
break
列表的增、删、改
list1 = []
# 增加
# append :在列表的末尾追加一个元素
# insert :在列表的任意位置添加一个元素(在指定位置插入数据)
# extend :将一个容器中的元素添加到列表中
list1.append('Python')
list1.append('Java')
print(list1)
list1.insert(1,'C++')
print(list1)
list2 = ['UI','C','GO','HTML','Python']
list1.extend(list2)
print(list1)
# 修改
# 通过下标修改元素
list1[1] = 'Python'
print(list1)
print('-'*10)
# 删除
# del :通过下标删除元素,下标超范围报错
# remove :删除指定元素,要删除的元素不存在,报错。 一次删除一个,从左向右
# pop : 通过下标删除元素,下标超范围报错(使用pop删除时,列表弹出删除的数据)
# pop 删除的元素还可以被找到
# clear :请空列表
del list1[0]
print(list1)
list1.remove('C')
print(list1)
list1.remove('Python')
print(list1)
content=list1.pop(0)
print(list1)
print(content)
list1.clear()
print(list1)
约瑟夫生者死者游戏
练习: 约瑟夫生者死者游戏。
# 30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。
# 报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
# 方法一
peopleList = list(range(1,31)) #对所有人生成编号
die_list=[] # 创建盛放下船人编号的容器
while len(die_list) <= 15: #当下船人数小于等于15人时循环继续
for _ in range (8): # 进行8次循环
peopleList.append(peopleList.pop(0)) #将排在第一个位置的元素放到列表末尾,如此循环8次,数1,2,3,4,5,6,7,8的人依次来到了队伍末尾(让报过数但没有下船的人到队伍末尾,为下一次报数做准备)
die_list.append(peopleList.pop(0))# 弹出此时排在列表的第一位的那个编号,即第9个位置的人放入下船人的列表。
# 不满足下船人数15人的条件,将再次执while循环
print(die_list)
# 方法二(这是我在csdn上找的的另外一种思路的解法)
people = list(range(1,31))
j = 0 #下标位置
while len(people)>15:
for i in range(9):# 报数9次
if i == 8 :#数到第九次
print(f'{people[j]}被抛下了' )
people.pop(j)
else:
j += 1 #移动下标
if j == len(people):# 当下标等于长度时归零返回表头,即下标到达最末尾
j = 0
print(f'{people}他们是幸存者' )
print(f'{die_list}下船了‘)