序列遍历 在许多情况下,我们希望依次遍历序列的元素并根据元素值执行一些计算。这种情况十分常见,所以 Python 提供了一个额外的控制语句来处理序列的数据:for 循环语句。考虑统计一个值在序列中出现了多少次的问题。我们也可以使用 while 循环实现一个函数。
1 2 3 4 5 6 7 8 9 10 11 12
defcount(s, value): """统计在序列 s 中出现了多少次值为 value 的元素""" total = 0 for elem in s: if elem == value: total = total + 1 return total >>> count(digits, 8) >>> list(range(5, 8)) [5, 6, 7] >>> list(range(4)) [0, 1, 2, 3]
# 树的遍历 defcount_leaves(tree): if is_leaf(tree):# 是叶子就回复1 return1 else: branch_counts = [count_leaves(b) for b in branches(tree)]# 从头到尾遍历 returnsum(branch_counts)
e.g. 依然是分割树,思想还是一样的,但是用树,会多一个label,并且是以T/F来判断分支的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13
>>> defpartition_tree(n, m): """返回将 n 分割成不超过 m 的若干正整数之和的分割树""" if n == 0: return tree(True) elif n < 0or m == 0: return tree(False) else: left = partition_tree(n-m, m) right = partition_tree(n, m-1) return tree(m, [left, right])
>>> defextend_link(s, t): """返回一个在 s 链表的末尾连接 t 链表后的延长链表""" assert is_link(s) and is_link(t) if s == empty: return t else: return link(first(s), extend_link(rest(s), t))
>>> defapply_to_all_link(f, s): """应用 f 到 s 中的每个元素""" assert is_link(s) if s == empty: return s else: return link(f(first(s)), apply_to_all_link(f, rest(s)))
defpressure(v, t, n=6.022e23): """计算理想气体的压力,单位为帕斯卡 使用理想气体定律: v -- 气体体积,单位为立方米 t -- 绝对温度,单位为开尔文 n -- 气体粒子,默认为一摩尔 """ k = 1.38e-23 # 玻尔兹曼常数 return n * k * t / v
= 符号在此示例中表示两种不同的含义,具体取决于使用它的上下文。在 def 语句中,= 不执行赋值,而是指示调用 pressure 函数时使用的默认值。相比之下,函数体中对 k 的赋值语句中将名称 k 与玻尔兹曼常数的近似值进行了绑定。
defcount_partitions(n, m): """计算使用最大数 m 的整数分割 n 的方式的数量""" if n == 0: return1 elif n < 0: return0 elif m == 0: return0 else: return count_partitions(n-m, m) + count_partitions(n, m-1)
使用最大数为 m 的整数分割 n 的方式的数量等于
使用最大数为 m 的整数分割 n-m 的方式的数量,加上//即,存在一个m,继续分割,这个直到n-m-m-m….每一次减就是一层,直到小于m,这个分之就变成余数被m-1分割……(即2的情况)
使用最大数为 m-1 的整数分割 n 的方式的数量,递归,直到变成最小,不是最小就回到1的情况分割 分割(6,4) 即包含4和不包含4的,不包含4的再分成包含3和不包含3的……