"""任务 1 · 十段循环，逐段改写成一行

循环版就在同目录的 loops_original.py 里（给好的基准，别改）：它用「先建一个空容器、
再写一层 for、再往里 append」的老写法打印十行结果。这一份要交出**输出逐字一致**的
一行版 —— 能写推导式的写推导式，能换现成函数的换现成函数。

十段分别在做什么（左边是循环版，右边是它该换成什么）：

  01 每个元素平方                    → 列表推导式
  02 只留正数                        → 带 if 的列表推导式
  03 从头累加求和                    → 现成的求和函数
  04 擂台法求最大                    → 现成的求最大值函数
  05 数有几个正的                    → 把每个满足条件的元素算作 1，再求和
  06 「有没有大于 5 的」这种判定      → 「存在一个满足就为真」的函数
  07 「是不是全部非负」这种判定       → 「全部满足才为真」的函数
  08 每个词的长度                    → 列表推导式
  09 一串字符串转成整数              → 转换函数已经有现成的，把它交给 map
  10 排行榜（分数降序、同分编号升序） → 排序时指定比较依据（key）

接口：文件名、数据那几行、带 print 的行都是判分接口，别改；要写的是标着 TODO 的
那几行（现在都是占位值）。每行 print 后面写了期望值，自己先跑一遍就能对。

跑： py task1_rewrite.py
判： py run_tests.py
"""

data = [3, -1, 4, 0, 7, 2]                                         # 别改
words = ['pear', 'fig', 'apple']                                   # 别改
data_str = ['3', '-1', '4']                                        # 别改
records = [('A03', 80), ('A01', 95), ('A02', 80), ('A04', 95)]     # 别改


# ══ TODO 01 ═════════════════════════════════════════════════
# 循环版：sq = [] 然后 for x in data: sq.append(x ** 2)
# 提示：方括号里先写「算出什么」，再写 for 子句；这里的 for 子句末尾不写冒号。
sq = None
print('01 平方', sq)                     # 别改：期望 [9, 1, 16, 0, 49, 4]


# ══ TODO 02 ═════════════════════════════════════════════════
# 循环版：kept = [] 然后 for x in data: if x > 0: kept.append(x)
# 提示：条件写在方括号的最后。
kept = None
print('02 正数', kept)                    # 别改：期望 [3, 4, 7, 2]


# ══ TODO 03 ═════════════════════════════════════════════════
# 循环版：total = 0 然后 for x in data: total += x
# 提示：这种累加有一个现成函数一次算完，把 data 整批交给它。
total = None
print('03 总和', total)                   # 别改：期望 15


# ══ TODO 04 ═════════════════════════════════════════════════
# 循环版：best = data[0] 然后逐个比大小
# 提示：擂主那套循环有一个现成函数替它做。
best = None
print('04 最大', best)                    # 别改：期望 7


# ══ TODO 05 ═════════════════════════════════════════════════
# 循环版：pos_count = 0 然后 for x in data: if x > 0: pos_count += 1
# 提示：这一行是「数有几个」，不是「求和」——把每个满足条件的元素算作 1，
#       再把这些 1 加起来。喂进去的写成生成器表达式（圆括号），不用先建表。
pos_count = None
print('05 正数个数', pos_count)            # 别改：期望 4


# ══ TODO 06 ═════════════════════════════════════════════════
# 循环版：has_big = False 然后 for x in data: if x > 5: has_big = True
# 提示：「有任意一个满足就为真」的那个函数；条件与循环版一致（大于 5）。
has_big = None
print('06 有大于5', has_big)              # 别改：期望 True


# ══ TODO 07 ═════════════════════════════════════════════════
# 循环版：all_nonneg = True 然后 for x in data: if x < 0: all_nonneg = False
# 提示：「要一个反例都没有才为真」的那个函数；条件与循环版一致（非负）。
all_nonneg = None
print('07 全部非负', all_nonneg)           # 别改：期望 False


# ══ TODO 08 ═════════════════════════════════════════════════
# 循环版：lens = [] 然后 for w in words: lens.append(len(w))
# 提示：表达式写「算出什么」——这里要的是每个词的长度，不是词本身。
lens = None
print('08 词长', lens)                    # 别改：期望 [4, 3, 5]


# ══ TODO 09 ═════════════════════════════════════════════════
# 循环版：nums = [] 然后 for s in data_str: nums.append(int(s))
# 提示：转换用的函数（int）已经有现成的，把它与列表交给 map，再用 list 收成一张表。
nums = None
print('09 转整数', nums)                  # 别改：期望 [3, -1, 4]


# ══ TODO 10 ═════════════════════════════════════════════════
# 排行榜：分数从高到低；分数相同的，编号从小到大。
# 提示：key 交回一个元组，元组按字典式顺序比（先比第一项，相同再比第二项）。
#       分数要降序、元组默认升序，所以第一项要取负号；同分再比编号。
#       排序那一行换成 sorted(records, key=你的键函数)。
def rank_key(rec):
    return 0


board = None
print('10 排行榜', board)                 # 别改：期望 [('A01', 95), ('A04', 95), ('A02', 80), ('A03', 80)]
