Chapter 5 结构化类型、可变性与高阶函数
1 结构化对象
int和float对象是标量类型,str对象是一种结构化的非标量类型,它具有可以访问的内部结构。本章将介绍四种新的结构化类型,它们均为序列类型:tuple、range、list和dict。下表总结了它们的一些异同。
类型 | 元素类型 | 示例 | 是否可变 | 索引和切片 |
---|---|---|---|---|
str | 字符型,有序 | ' ', 'a', 'abc' | 否 | str[i], str[start:end] |
tuple | 任意型,有序 | (), (3,), (1.2, '2', 'abc') | 否 | t[i], t[start:end] |
range | 整型,有序 | range(1,10,2), range(10,2), range(10) | 否 | range()[i], range()[start:end] |
list | 任意型,有序 | [],[3],[1.2, '2', 'abc'] | 是 | l[i], l[start:end] |
dict | 键值对(键和值均为任意型?),无序 | {}, {1:'Jan', 2:'Feb'}, {'Jim':31, 'Joy':29, 'Lily':28} | 是 | d[key], 无切片 |
如下为这些类型的常用操作。
可变性
list的别名问题,比如append方法的副作用。tuple没有别名问题。
2 列表推导和高阶函数
列表推导可以实现将某种操作应用到每个列表元素上。例如:
L = [x**2 for x in range(1,7)]
print(L)
会输出:
[1, 4, 9, 16, 25, 36]
for从句后面可以有一个或多个if语句和for语句,他们可以应用到for子句产生的值。
L = [x**2 for x in range(1,7) if x%2 == 0]
print(L)
会输出:
[4, 16, 36]
而高阶函数是指使用函数作为实参,可以方便的将某种操作应用到有序集合的每个值上。Python有一个内置的高阶函数map,它的第一个参数是一个具有n个参数的函数,后面跟着n个有序集合的参数(这些集合的长度都一样),集合中的值可以是n元函数的参数。例如:
L1 = [1,3,8]
L2 = [0,55,2]
for i in map(max, L1, L2):
print(i)
会输出:
1
28
9
Python还支持创建匿名函数,即lamda函数,其一般形式为:
lambda
lamda表达式经常作为高阶函数的参数,例如:
L = []
for i in map(lambda x, y: x**y, [1,2,3,4], [2,3,4,0])
L.append(i)
print(L)
会输出[1, 8, 81, 1]。