列表 与 循环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])
效果

把相关的数据,收集到一个变量里

创建列表

创建一个暂时没有东西的列表

1
digits = []

元素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 有没有可能不执行 ?
A

一定会执行

B

可能不执行

利用 i 值

1 2 < < <
for i in range(3): print(i)012

for 语句 编写技巧

案例

输出 9 - 0

1.

先写出不循环的版本

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)
2.

准备模板

1 2
for i in range(<次数>): <statements>
3.

填次数

1*2
for i in range(9): <statements>
4.

填相同

相同
1
print(<不同>)
填进去
1 2*
for i in range(9): print(<不同>)
5.

找规律 填公式

数据
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)

描述的是 0<=x<50 <= x < 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 有没有可能不执行
A

一定会执行

B

可能不执行

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.

原始代码

写出非循环版本

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("再见")
2.

死循环

找到重复单元,套在 死循环里

1*2 3 4 5 6
while True: print("查询余额请按 1") print("结束请按 9") int(input()) print("您的余额为 100 元")print("再见")
3.

找出口

找到跳出情况,写 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("再见")
4.

校验

运行,测试次数是否正确

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)

循环 语句 对比

whilefor 的区别

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="")}

ZZAX 微信公众

文档一更新,立刻告诉你