一、filter()
filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
练习:回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数
def _is_pal(x):
kk = list[map(int, str(x))]
return kk == kk[::-1]
def gen_pal(n):
return list(filter(_is_pal, range(1, n)))
kk = gen_pal(1000)
list(map(int, str(value)))
用于将一个数的每一位保存在一个list中,其实这样多余了。更简单的,直接比较字符串形式的数字就可以了。因此可将kk = list[map(int, str(x))]
改为kk = str(x)
。
二、 Lambda表达式
带有一个参数的Lambda表达式和对应的非匿名函数:
def f(n):
return lambda x: x % n
print (f(1)(2)) # n=1; x=2
参数传入关系是什么?写成下面这种形式方便理解:
def g(n):
return lambda x: x % n
k = g(1) # n=1
print ((k(2))) # x=2
可以看出,执行k = g(1)
返回的是一个匿名函数lambda x: x % 1
,该匿名函数的功能与
def s(x):
return x % 1
是相同的。
执行k = g(1)
后k
就指向了这个函数,因此再传入参数x = 2
,得到结果。
注意:上面代码中,f(n)
只接收一个参数n,是不能写成两个参数形式的f(n, x)
,如果非匿名函数没有传入参数,调用的时候也必须写成f()(2)
,不能写成f(2)
三、sorted()
Python内置的sorted()
函数可以对list进行排序,此外还可以接收一个key
函数来实现自定义排序。如sorted([36, 5, -12, 9, -21], key=abs)
。
key
制定的函数将作用于list的每一个元素上。
因此在设计这个映射函数时,是对每个元素进行处理。
例:假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()
对上述列表分别按名字排序。
def by_name(t):
return t[0]
def by_score(t):
return -t[1]
函数by_name(t)
的传入元素的结构是这样的:('Bob', 75)
,是一个tuple,取出tuple的第一个元素并返回,即return t[0]
四、返回函数
利用闭包返回一个计数器函数,每次调用它返回递增整数。
def gen_count():
def seq():
n = 0
while True:
n = n + 1
yield n
f = seq()
return next(f)
counterA = gen_count()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = gen_count()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
输出“测试失败”。分析原因:
seq()
是一个自然数无限序列生成器,f = seq()
调用生成器,返回next()
。
当执行counterA = g()
后,从调试器可以看出counterA = {int} 1
,这是因为函数返回了next(f)
,这返回的不是一个函数,而是一个值,gen_count()
不是一个返回函数。
修改:
def gen_count():
def seq():
n = 0
while True:
n = n + 1
yield n
f = seq()
def g():
return next(f)
return g
counterA = gen_count()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = gen_count()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')
这样修改后,返回值就变成了函数,每次执行counterA()
就相当于执行next(f)
。
网友评论