"""任务 2 · 带条件与嵌套的推导式

四件事，逐个来：

  ① 两个 if 子句：连着写两个 if，等价于循环版里连着写两个 if（是「与」的关系）；
  ② 两个 for 子句：把嵌套的列表展平；一行里 for 与 if 的先后，和循环版从上到下一致；
  ③ 推导式里再嵌一个推导式：外层每取一个值就构造一整行（转置矩阵）；
  ④ 目标名不泄漏：推导式的目标名只活在方括号里面，不会盖掉外面的同名变量 ——
     循环版正相反。这一份用「先给 y 一个旧值」的写法把它变成能看见的一行输出。

带 print 的行是判分接口，别改；要写的是标着 TODO 的那几行（现在都是占位值）。

跑： py task2_nested.py
判： py run_tests.py
"""

matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]     # 别改
vec = [[1, 2, 3], [4, 5, 6]]                              # 别改


# ══ TODO 01 ═════════════════════════════════════════════════
# 循环版：kept = [] 然后 for x in range(10): if x % 2 == 0: if x > 4: kept.append(x)
# 提示：条件写在方括号最后，两个条件各写一个 if 子句，顺序与循环版一致。
two_cond = None
print('01 两个条件', two_cond)             # 别改：期望 [6, 8]


# ══ TODO 02 ═════════════════════════════════════════════════
# 循环版：flat = [] 然后 for elem in vec: for num in elem: flat.append(num)
# 提示：方括号里先写 for elem in vec，再写 for num in elem —— 两个 for 的顺序不能对调。
flat = None
print('02 展平', flat)                     # 别改：期望 [1, 2, 3, 4, 5, 6]


# ══ TODO 03 ═════════════════════════════════════════════════
# 循环版：for i in range(4) 里面再 for row in matrix，把每行的第 i 个收成一行。
# 提示：外层推导式 for i in range(4)，里层推导式 [row[i] for row in matrix]。
transposed = None
print('03 转置', transposed)                # 别改：期望 [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]


# ══ TODO 04 ═════════════════════════════════════════════════
# 用推导式（不是循环）建一张 0²、1²、2²、3² 的表。
# 注意：这一行外面已经有一个 y 了，写的时候想想会不会把它盖掉。
y = '旧值'                                 # 别改
squares_y = None
print('04 平方表', squares_y)               # 别改：期望 [0, 1, 4, 9]
print('05 推导式外 y', y)                   # 别改：期望 旧值

# 给好的对照（别改）：同样的目标名用循环写，跑完它会留在外面
for y in range(4):
    pass
print('06 循环外 y', y)                     # 别改：期望 3
