0 作业与复习
作业 1. 三合一 2. 当天练习独立完成 3. 自学教程的字符串新版占位符f-string https://www.runoob.com/python3/python3-string.html 4. 模拟登录 如果账号的密码错误3次,提示锁定账户,效果如下: 请输入账号:qtx 请输入密码:1234 登录失败 你还剩余 2 次机会 请输入账号:Qtx 请输入密码:1234 登录失败 你还剩余 1 次机会 请输入账号:Qtx 请输入密码:123456 登录成功 6. (选做)赌大小游戏 玩家的身家初始10000,实现下列效果: 少侠请下注: 30000 超出了你的身家,请重新投注。 少侠请下注: 8000 你摇出了5点,庄家摇出了3点 恭喜啦,你赢了,继续赌下去早晚会输光的,身家还剩18000 少侠请下注: 18000 你摇出了6点,庄家摇出了6点 打平了,少侠,在来一局? 少侠请下注: 18000 你摇出了4点,庄家摇出了6点 少侠,你输了,身家还剩 0 哈哈哈,少侠你已经破产,无资格进行游戏 7. (选做)一个小球从100m高度落下,每次弹回原高度一半. 计算: -- 总共弹起多少次?(最小弹起高度0.01m) -- 全过程总共移动多少米? 提示: 数据/算法 8.阅读 https://unicode-table.com/cn/ 程序员的数学第四章:数学归纳法
""" 如果账号密码错误3次,提示锁定账户,效果如下: """ count = 0 while count < 3: mima = input("please mima") if mima == "123456": print("ok") break else: count += 1 print("have %s ji hui" % (3 - count)) else: print("no")
""" 赌大小游戏 """ import random my_money = 10000 while my_money > 0: bet = input("qing xia zhu") if bet == "": print("zhu dong tui chu") break bet = int(bet) if bet > my_money: print("mei you nan mei duo qian") continue my_dian = random.randint(1, 7) other_dian = random.randint(1, 7) if my_dian > other_dian: my_money += bet print("your score %s other score %s" % (my_dian, other_dian)) print("my momey = %s" % (my_money)) else: my_money -= bet print("your score %s other score %s" % (my_dian, other_dian)) print("my momey = %s" % (my_money)) else: print("have no money")
""" 一个小球从100m高度落下,每次弹回原高度一半. """ count = 0 height = 100 while height/2 >= 1e-2: height /= 2 count += 1 print(f"tan qi {count} ci")
1 容器通用操作
切片 slice
-
作用:定位多个容器元素。
-
语法:容器[开始索引:结束索引:步长]
-
说明:结束索引不包含该位置元素;步长是切片每次获取完当前元素后移动的偏移量;开始、结束和步长都可以省略
内建函数
-
len(x) 返回序列的长度
-
max(x) 返回序列的最大值元素
-
min(x) 返回序列的最小值元素
-
sum(x) 返回序列中所有元素的和(元素必须是数值类型)
""" 切片 slice """ memo = "0123456789" print(memo[1:3:1]) # 1 2 print(memo[1:3]) # 1 2 print(memo[:3:]) # 0 1 2 print(memo[:3]) # 0 1 2 开头默认0 间隔默认1 print(memo[::]) # "0123456789" print(memo[:]) # "0123456789" print(memo[5:]) # 结尾默认最后,间隔默认1 print(memo[-5:-1]) # 5678 print(memo[-5:]) # 56789 print(memo[::-1]) # 翻转记住 print(memo[2:-3:]) # 23456 print(memo[-1:1:-1]) # 98765432 倒着走得加-1
""" 字符串: content = "我是京师监狱狱长金海。" 打印第一个字符、打印最后一个字符、打印中间字符 打印字前三个符、打印后三个字符 """ content = "我是京师监狱狱长金海" print(content[0]) print(content[len(content) - 1]) print(content[len(content) // 2]) print(content[:3]) print(content[-1:-4:-1]) # 海金长 print(content[-3:]) # 长金海
2 列表
列表 list定义:由一系列变量组成的可变序列容器。
基础操作
-
创建列表: 列表名 = [] ;列表名 = list(可迭代对象)
-
添加元素:列表名.append(元素);列表.insert(索引,元素)
-
定位元素:列表名[索引] = 元素
变量 = 列表名[索引]
变量 = 列表名[切片] # 赋值给变量的是切片所创建的新列表
列表名[切片] = 容器 # 右侧必须是可迭代对象,左侧切片没有创建新列表。
遍历列表:
正向:
for 变量名 in 列表名:
变量名就是元素
反向:
for 索引名 in range(len(列表名)-1,-1,-1):
列表名[索引名]就是元素
-
删除元素:
列表名.remove(元素)
del 列表名[索引或切片]
""" 列表 list 定义由一系列变量组成的可变序列容器 列表里面存变量,不是数据 """ # 创建 list_name = ["dpq", "bac", "rgz"] # 创建方法一 list02 = list("haaaa") # 创建方法二 print(list02) # 追加 list02.append("jin") print(list02) # 插入 list02.insert(0, "aaa") print(list02)
""" 练习 1:创建地区列表、新增列表、现有列表,至少存储 3 行信息 练习 2:向以上三个列表追加数据第 4 行数据 在第 1 个位置插入第 5 行数据 """ list_area = ["JS", "HB", "LN"] list_new = [1, 2, 4, 5] list_now = [23, 45, 67] list_area.append("NJ") list_new.insert(0, 22)
""" 列表基础操作list 定位与切片 """ list_area = ["JS", "HB", "LN"] # 定位 print(list_area[0]) # 读取 name = list_area[-1] # 读取 list_area[0] = "DJS" # 修改 #切片 # 切片读取--会创建新列表即拷贝动作; 优点是灵活,缺点是占用内存 new_list = list_area[:2] print(new_list) # 切片修改---这里不会创建新的列表 list_area[-2:] = ["hello", "world"] print(list_area)
""" 打印香港疫情信息(xx 地区新增 xx 人现存 xx 人) 将地区列表后 2 个元素修改为 ["XJ","SC"] """ list_area = ["JS", "HB", "LN"] list_new = [1, 2, 4, 5] list_now = [23, 45, 67] print("%s diqu new %d now %d" % (list_area[0], list_new[0], list_now[0])) # print(f"{list_area[0]} diqu new {list_new[0]} now {list_now[0]}") list_new[-2:] = [3, 6]
""" 列表的 遍历与删除 """ list_area = ["JS", "HB", "LN"] # 从头到尾读取 for item in list_area: print(item) # 错误修改 for item in list_area: # 这样修改无效,只是改变量,不是改列表 item = "1" print(list_area) # 正确修改 for i in range(len(list_area)): if list_area[i] == "JS": list_area[i] = "DJS" print(list_area) # 从尾巴到头读取 for item in list_area[::-1]: # 不建议 切片读取会创建新列表,占内存 print(item) for i in range(len(list_area) - 1, -1, -1): # 强烈建议通过索引读取 print(list_area[i])
""" 练习:打印地区列表元素(一行一个) """ list_area = ["JS", "HB", "LN"] for item in list_area: print(item) for i in range(len(list_area) - 1, -1, -1): print(list_area[i]) for item in list_area[::-1]: # 读取切片拷贝动作 print(item)
""" 列表删除 remove del """ list_area = ["JS", "HB", "LN"] #根据元素的删除 list_area.remove("JS")#元素不存在会报错,改进一下代码 print(list_area) if "JS" in list_area: list_area.remove("JS") print(list_area) #根据定位删除,不知道元素 del list_area[0:1] #此时没有数据的拷贝动作,拷贝是对于读取 print(list_area)#函数是带括号的,del等只是一个关键字
""" 在地区列表中删除“新疆” 在新增列表中删除第 1 个元素 在现有列表中删除前 2 个元素 """ list_area = ["JS", "HB", "LN","XJ"] list_area.remove("XJ") print(list_area) del list_area[1] del list_area[0:2] print(list_area)
""" 列表综合练习 八大行星:"水星" "金星" "地球" "火星" "木星" "土星" "天王星" "海王星" -- 创建列表存储 4 个行星:“水星” "金星" "火星" "木星" -- 插入"地球"、追加"土星" "天王星" "海王星" -- 打印距离太阳最近、最远的行星(第一个和最后一个元素) -- 打印太阳到地球之间的行星(前两个行星) - - 删除"海王星",删除第四个行星 -- 倒序打印所有行星(一行一个) """ list_star = ["水星", "金星", "火星", "木星"] list_star.insert(2, "地球") list_star += ["土星", "天王星", "海王星"] # list_star.append("土星") # list_star.append("天王星") # list_star.append("海王星") print(list_star[0]) print(list_star[-1]) for i in range(0, 2, 1): print(list_star[i]) list_star.remove("海王星") del list_star[3] for i in range(len(list_star) - 1, -1, -1): print(list_star[i])
深拷贝和浅拷贝
浅拷贝:复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程。
深拷贝:复制整个依懒的变量。
""" 列表内存图 """ list01 = [10, 20, 30] data01 = list01 # 给的是列表的地址,不是列表本身,区别于data01 = list01[::] 切片拷贝列表 data02 = list01[0] # 索引表示CPU内存寻址 data03 = list01[:2] # 切片会拷贝列表 list01[0] = 100 list01[:2] = [1000, 2000] # 创建了一个无名列表[1000, 2000] #[1000, 2000]这个列表引用计数为0.内存自动回收 print(list01) print(data01) print(data02) print(data03)
""" 练习 1:画出下列代码内存图 """ list01 = ["北京", "上海"] list02 = list01 list01[0] = "广州" list03 = list01[:] list03[-1] = "深圳" print(list01) # ?
""" 列表内存图: 添加内存图:append 与 insert 原理图不一样 删除内存图:del 与 remove 原理图一样,都是从后一个元素往前挤 """ list01 = [10, 20, 30] list01.append(40)#直接在最后一个添加 list01.insert(1, 50) #一定是从最后一个开始往后挪 麻烦别人,性能没有append高 list02 = [10, 20, 30, 40] list02.remove(20)#remove函数内部实现有for查询 效率低 del list02[1] #直接删除效率高
""" 练习 2:画出下列内存图 list01 = ["北京", "上海", "深圳"] list02 = list01 list01.insert(0,"天津") del list01[1] print(list02)# ? """ list01 = ["北京", "上海", "深圳"] list02 = list01 list01.insert(0, "天津") del list01[1] print(list02) # ?
""" 浅拷贝 深拷贝:占内存多但是数据修改不影响另外一份 浅拷贝:占内存少但会影响另外一份数据 """ list01 = [10, [20, 30], [40, 50]] list02 = list01[::] # 浅拷贝 只复制第一层列表 list01[0] = 100 # 修改第一层,互不影响 list01[1][0] = 200 # 修改第二层,相互影响
""" 深拷贝 """ import copy # 准备工具 list01 = [10, [20, 30], [40, 50]] list02 = copy.deepcopy(list01) # 浅深 拷贝 复制二层列表 list01[0] = 100 # 修改第一层,互不影响 list01[1][0] = 200 # 修改第二层,互不影响
""" 练习 3:画出下列内存图 """ import copy list01 = ["北京", ["上海", "深圳"]] list02 = list01 list03 = list01[:] list04 = copy.deepcopy(list01) list04[0] = "北京 04" list04[1][1] = "深圳 04" print(list01) # ? list03[0] = "北京 03" list03[1][1] = "深圳 03" print(list01) # ? list02[0] = "北京 02" list02[1][1] = "深圳 02" print(list02) # ?
作业 1. 三合一(文档/demo/图片) 2. 当天练习独立完成 3. 根据列表中的数字,重复生成*. list01 = [1, 2, 3, 4, 5, 4, 3, 2, 1] 效果: * ** *** **** ***** **** *** ** * 4. 将列表中的数字累乘 list02 = [5, 1, 4, 6, 7, 4, 6, 8, 5] 结果:806400 5. 将列表中整数的个位不是5和3的数字存入另外一个列表 list03 = [25, 63, 27, 75, 70, 83, 27] 结果:[27, 70, 27] 6. 计算列表中字符串⻓度⼤于2,并且第⼀个和最后⼀个字符相同的字符串个数 字符串列表:words =["qtx","看一看","想啊想","练练"] 结果:2 7. 在终端中录入疫情地区名称,如果输入空字符串,则停止。 最后倒序打印所有地区名称(一行一个) 要求:录入的名称已经存在不要再次添加. 提示: in 8. 在终端中录入5个疫情省份的确诊人数 最后打印最大值、最小值、平均值. (使用内建函数实现) 9. 阅读 程序员的数学第三章 - 余数 Python入门到实践第三章第四章 - 列表