Python Day04

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}下船了‘)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值