map && reduce
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# map
'''
1. map()函数接收两个参数,一个是函数,一个是Iterable
2. map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
'''
def a(x):
return x * x
b = map(a,[1,2,3,4,5,6,7,8,9])
print(list(b)) # 使用list()函数将整个序列计算并返回一个list
# 把所有数字转换为字符串
print(list(map(str, [1,2,3,4,5,6,7,8,9])))
# reduce
'''
1. 把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数
2. reduce把结果继续和序列的下一个元素做累积计算
3. reduce(f, [x1,x2,x3,x4]) = f(f(f(x1,x2), x3) x4)
'''
from functools import reduce
def add(x, y):
return x + y
print(reduce(add, [1,3,5,7,9]))
# 把str转换成int函数
'''
def fn(x,y):
return x * 10 + y
def char2num(s):
digits = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
return digits[s]
print(reduce(fn, map(char2num, '13579')))
'''
# 优化方式1
'''
DIGITS = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
def str2num(s) :
def fn(x, y) :
return x * 10 + y
def char2num(s) :
return DIGITS[s]
return reduce(fn, map(char2num, s))
print(str2num('13579'))
'''
# 进一步优化
DIGITS = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
def char2num(s):
return DIGITS[s]
def str2num(s):
reduce(lambda x, y: x * 10 + y, map(char2num, s))
print(str2num('13579'))
filter
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# filter()函数:用于过滤序列
'''
1. 接收一个函数和一个序列
2. 把传入的函数依次作用于每个元素,然后根据返回值是True或False决定保留还是丢弃该元素
3. 结果返回迭代器,Iterator
'''
# 删掉偶数,保留基数
def is_odd(n):
return n % 2 == 1
print(list(filter(is_odd, [1,2,4,5,6,9,10,15])))
# 用filter()求素数
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x : x % n > 0
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible, it) # 构造新序列
# 打印1000以内的素数
for n in primes():
if n < 1000:
print(n)
else:
break
sorted
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 排序算法
print(sorted([23,2,34,56,1,-20]))
# 接收一个key函数来实现自定义排序.
'''
key指定的函数将作用域list的每一个元素上,并根据key函数返回的结果进行排序。
'''
print(sorted([36,-5,-12,9,-21],key=abs))
# 忽略大小写排序
print(sorted(['Bob','tom','james','Credit'],key=str.lower))
# 反向排序,传入第三个参数reverse=True
print(sorted(['Bob','tom','james','Credit'],key=str.lower,reverse=True))
网友评论