列表 与 循环Lists and Loops
元组Tuple
什么是
非常轻量级的数据打包
案例
1 2 items = (3, 7)print(items)
元组组装
可以将一些 数据 或者 变量 组装到一个变量里
完整写法
1 items = (3, 7)
省略写法
小括号可以省略
1 items = 3, 7
类型检查
1 2 <items = 3, 7print(type(items))class 'tuple'
元组拆解
可以将元组里面的数值,拆解出来,存到变量里
完整写法
1 2 3 4 < <items = (3, 7)(a, b) = items print(a)print(b)37
省略写法
小括号可以省略
1 2*3 4 < <items = (3, 7)a, b = items print(a)print(b)37
元组达到多变量一次性赋值
使用前
1 2 a = 3b = 4
使用后
1 a, b = 3, 4
元组达到变量值交换
使用前
1 2 3 4 5 6 7 < <a = 3b = 4temp = a a = b b = tempprint(a)print(b)43
使用后
1 2 3*4 5 < <a = 3b = 4a, b = b, aprint(a)print(b)43
元组的限制
组装后 不能改变 里面元素的值
组装后 不能改变 元组的大小
列表List
什么是
数据收集器
跟 元组类似,但功能更强大
案例对比
使用前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 number = int(input()) digit1 = number % 10number //= 10 digit2 = number % 10number //= 10 digit3 = number % 10number //= 10 print(digit3)print(digit2)print(digit1)
使用后
1 2 3+4 5*6 7 8*9 10 11*12 13 14*15*16*number = int(input()) digits = [] digits.append(number % 10)number //= 10 digits.append(number % 10)number //= 10 digits.append(number % 10)number //= 10 print(digits[2])print(digits[1])print(digits[0])
效果
把相关的数据,收集到一个变量里
创建列表
创建一个暂时没有东西的列表
1digits = []
元素Elements
管列表里的每个变量叫元素
基本 API
增加元素
可以不受限制的,一直往列表里加东西
1 2 digits = []digits.append(1)
查询长度
可以获取列表的长度,也就是列表里现在有几个元素
1 2 3 digits = []digits.append(1)print(len(digits))
列表字面量
格式
[<元素字面量1>, <元素字面量2>, ..., <元素字面量n>]
样例
1 digits = [2, 7, 3, 8, 4]
索引Index
列表使用索引定位数据格
格式
1<列表名>[<索引值>]
样例
1 2 3 4 5 # 赋值digits[2] = number % 10 # 取值print(digits[2])
索引范围
索引值范围从 -尺寸 开始 到 尺寸 - 1

列表越界
1 2!3!digits = [6, 7, 3, 8, 4]print(digits[5])print(digits[-6])
访问越界的索引会导致运行时报错
一维列表 和 条件语句 的关系
使用前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 number = int(input())if number == 0: code = "-----"elif number == 1: code = ".----"elif number == 2: code = "..---"elif number == 3: code = "...--"elif number == 4: code = "....-"elif number == 5: code = "....."elif number == 6: code = "-...."elif number == 7: code = "--..."elif number == 8: code = "---.."elif number == 9: code = "----."print(code)
使用后
1*2*3 4 5*6 7 codes = ["-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."] number = int(input())code = codes[number] print(code)
特性
分支结构的判断是一个变量
值是连续的
for 语句for Statements
作用
用于机械式重复一段代码
案例对比
使用前
1 2 3 4 name = "ZZAX"print(name)print(name)print(name)
使用后
1 2*3 name = "ZZAX"for i in range(3): print(name)
语法
for <次数变量> in range(<次数>): <需要重复的语句>
注意缩进
执行顺序
1 for i in range(x): 2 3
1 222222 3
2 有没有可能不执行 ?
一定会执行
可能不执行
利用 i 值
1 2 < < <for i in range(3): print(i)012
for 语句 编写技巧
案例
输出 9 - 0
先写出不循环的版本
1 2 3 4 5 6 7 8 9 print(9)print(8)print(7)print(6)print(5)print(4)print(3)print(2)print(1)
准备模板
1 2 for i in range(<次数>): <statements>
填次数
1*2 for i in range(9): <statements>
填相同
相同
1print(<不同>)
填进去
1 2*for i in range(9): print(<不同>)
找规律 填公式
数据
v: 9 8 7 6 5 4 3 2 1 i: 0 1 2 3 4 5 6 7 8
规律
v = 9 - i
填进去
1 2+3*for i in range(9): value = 9 - i print(value)
挑战
输出 1 3 5 7 9
for 语句 x 列表
改善项目代码
使用前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 number = int(input()) digits = [] digits.append(number % 10)number //= 10 digits.append(number % 10)number //= 10 digits.append(number % 10)number //= 10 print(digits[2])print(digits[1])print(digits[0])
使用后
1 2 3 4 5 6 7 8 9 10 number = int(input()) digits = [] for i in range(3): digits.append(number % 10) number //= 10 for i in range(3): print(digits[2 - i])
生成有规则的列表
使用前
1 2 3 numbers = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
使用后
1 2 3 numbers = []for i in range(12): numbers.append(0)
循环控制
循环 内嵌 if 语句
可以内嵌 if 语句, 实现循环时达到分支效果
1 2 3 for ... : if ... : ...
挑战
基于下面的代码。写 循环输出
1 2 arr = [6, 7, 3, 8, 4]# todo
使得输出
6, 7, 3, 8, 4
循环 与 boolean 运算 做假设验证
1 2 3 4 test = Falsefor ... : if ... : test = True
特性
只有每次循环,if
语句条件都不成立时,test
才会是 False
假设一个很难证明的
条件内赋值一个很好推翻的
挑战
检测列表里是否有 0,输出 True
或者 False
break 控制
立刻停止下面语句, 跳出循环
一般内嵌在条件语句里
代码
1 for 2 : 31 if 32 : break 33 4
执行顺序
1 2 31 32 33 31 32 break 4
for else 语句
for 语句 可以携带 else 结尾,如果 for 完整的运行完了就会执行
使用前
1 2 3 4 5 6 7 8 9 10 11 arr = [6, 7, 3, 8, 4] exist_zero = Falsefor i in range(5): if arr[i] == 0: exist_zero = True breakif exist_zero: print("exist zero")else: print("not exist zero")
使用后
1 2 3 4 5 6 7 8 arr = [6, 7, 3, 8, 4] for i in range(5): if arr[i] == 0: print("exist zero") breakelse: print("not exist zero")
continue 控制
立刻停止下面语句, 尝试下次循环
一般内嵌在条件语句里
代码
1 for 2 : 31 if 32 : continue 33 4
执行顺序
1 2 3 31 32 33 31 32 continue 31 32 33 4
早退出Early Exit
输出有几个 不是 0 的数
使用前
1 2 3 4 5 6 arr = [6, 7, 3, 8, 4]count = 0for i in range(5): if arr[i] != 0: count += 1print(count)
使用后
1 2 3 4*5+6*7 arr = [6, 7, 3, 8, 4]count = 0for i in range(5): if arr[i] == 0: continue count += 1print(count)
效果
使得主逻辑的代码 的缩进 减少1个
字面量规范
使用原值
代码中 如果有 计算出来的字面量, 那么需要写是怎么计算的
使用前
1 2 3 4 5 6 arr = [6, 7, 3, 8, 4] for i in range(5): print(arr[i], end="") if i != 4: print(", ", end="")
使用后
1 2 3 4 5*6 arr = [6, 7, 3, 8, 4] for i in range(5): print(arr[i], end="") if i != 5 - 1: print(", ", end="")
为业务值定义变量
使用前
1 2 3 4 5 6 arr = [6, 7, 3, 8, 4] for i in range(5): print(arr[i], end="") if i != 5 - 1: print(", ", end="")
使用后
1 2+3*4 5*6 arr = [6, 7, 3, 8, 4]size = 5for i in range(size): print(arr[i], end="") if i != size - 1: print(", ", end="")
注意
引用变量
任何值 如果能从已知变量中计算出来, 那么就使用 已知变量
使用前
1 2 3 4 5 6 arr = [6, 7, 3, 8, 4] for i in range(5): print(arr[i], end="") if i != 5 - 1: print(", ", end="")
使用后
1 2 3*4 5*6 arr = [6, 7, 3, 8, 4] for i in range(len(arr)): print(arr[i], end="") if i != len(arr) - 1: print(", ", end="")
最终效果
程序中只能出现 业务数据 和 -1, 0, 1, 2
原始数据值 只能出现一次
for 语句 实质
for 语句的实质 是 遍历出来 一个集合里所有的数据
经典版
1 2 3 4 5 arr = [6, 7, 3, 8, 4] for i in range(len(arr)): item = arr[i] print(item)
遍历版
1 2 3 4 arr = [6, 7, 3, 8, 4] for item in arr: print(item)
区间Range
什么是
描述一段数值范围
案例
range(5)
描述的是
区间 x 索引
1 2 <r = range(5)print(r[2])2
区间 x for 语句
for 语句遍历区间,其实是把里面的值都一个个遍历出来
1 2 < < <for item in range(3): print(item)012
区间生成
生成不是 0 开始的区间
两个值时,第一个代表开始,第二个代表结束
1 2 < < < <for item in range(1, 5): print(item)1234
生成不连续的区间
第三个 代表 跳跃
1 2 < <for item in range(1, 5, 2): print(item)13
while 语句while Statements
案例
获取用户名
1 2 3 4 5 name = input()while not name: print("没有输入,请重新输入") name = input()print("你好," + name)
用途
用于执行不确定次数的重复
while
语法
while <condition>: <statements>
while
执行顺序
1 while 2: 3 4
1 2 32 32 ... 32 4
3 有没有可能不执行
一定会执行
可能不执行
while 循环控制
死循环
1 2 while True: ...
跳出循环
1 2 3 4 5 while True: ... if ... : break ...
其它
while 里 也可以写 continue
while 语句 编写技巧
案例
< < > < < < > < < < > <查询余额请按 1结束请按 91您的余额为 100 元查询余额请按 1结束请按 91您的余额为 100 元查询余额请按 1结束请按 99再见
原始代码
写出非循环版本
1 2 3 4 5 6 7 8 9 10 11 12 print("查询余额请按 1")print("结束请按 9")int(input())print("您的余额为 100 元")print("查询余额请按 1")print("结束请按 9")int(input())print("您的余额为 100 元")print("查询余额请按 1")print("结束请按 9")int(input())print("再见")
死循环
找到重复单元,套在 死循环里
1*2 3 4 5 6 while True: print("查询余额请按 1") print("结束请按 9") int(input()) print("您的余额为 100 元")print("再见")
找出口
找到跳出情况,写 if break
1 2 3 4*5+6+7 8 while True: print("查询余额请按 1") print("结束请按 9") option = int(input()) if option == 9: break print("您的余额为 100 元")print("再见")
校验
运行,测试次数是否正确
while 语句 死循环 简化 一般 while 语句
规则
如果 if break
在 第一句,可以转为 while condition
其它情况,不能简化
注意:转换时,逻辑需要反转
案例
使用前
1 2 3 4 5 6 7 name = input()while True: if name: break print("没有输入,请重新输入") name = input()print("你好," + name)
使用后
1 2 3 4 5 name = input()while not name: print("没有输入,请重新输入") name = input()print("你好," + name)
循环 语句 对比
while
和 for
的区别
for
用于 知道 次数的循环 更贴切
while
用于 不知道 次数的循环 更贴切
案例分析
输出一个列表里的值,遇到 0 就停,不输出 0
程序会因为 不确定的 0 的出现 而停止
程序也会因为 确定的 元素结束 而停止
for x 早推出 版本
1 2 3 4 5 6 arr = [6, 7, 0, 8, 4] for item in arr: if item == 0: break print(item)
while x 断义 版本
1 2 3 4 5 6 arr = [6, 7, 0, 8, 4] i = 0while i < len(arr) and arr[i] != 0: print(arr[i]) i += 1
存储介质
一些练习中,你需要好好考虑,使用什么存储介质(专业名词叫 数据结构)更恰当
整数补 0 循环版
Q2 E02
使用 存储输入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 number = int(input()) # 探测 number 的位数 digit_size = ... # 计算 前面需要补0 的个数leading_zero_size = ... # 打印 前面的 0 for i in range(leading_zero_size): ... # 打印 原始数据print(number)
使用 列表 存储输入的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 limit = 4number = int(input()) # 构建 列表digits = []for i in range(limit): digits.append(0) # 存入 列表for i in range(limit) index = limit - i - 1 ...} # 打印 出来for digit in digits: print(digit, end="")}