文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2019-09-11   854

Python函数式编程之高阶函数

今天我们就来看几个Python的高级函数:MapReduceFilterSorted

Map Function

Definition

map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterable返回。

Example

1
2
3
4
5
6
7
8
9
10
11
>>> def f(x):
... return x*x
...
>>> r = map(f, [1,2,3,4,5,6,7,8,9,10])
>>> r
<map object at 0x0000020AAF4C1668>
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
>>> list(map(str, [1,2,3,4,5,6,7,8,9,10]))
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

Reduce Function

Definition

reduce()函数和map()相似,接收两个参数,一个是函数,一个Iterable。不同的是,reduce()把一个函数作用在一个序列[x1, x2, x3, ...]上,并且这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,形如:

1
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> from functools import reduce
>>> def fn(x, y):
... return x*10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

# 配合map(),我们就可以写出把str转换为int的函数
>>> def char2nums(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]
...
>>> reduce(fn, map(char2nums, '1234'))
1234

使用lambda表达式可以进一步化简:

1
2
3
4
5
6
7
8
9
from functools import reduce

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 str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))

Exercise

利用mapreduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456

1
2
3
4
5
6
7
8
9
10
11
12
def f(dig):
dict = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
return dict[dig]

def g(x, y):
return x*10+y

def h(a, b):
return (a/10+b)

def str2float(s):
return reduce(g, map(f,s[:s.find('.')])) + reduce(h, map(f, s[-1:-(len(s)-s.find('.')):-1]))/10

Filter Function

Definition

map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter()函数返回的是一个Iterator,也就是一个惰性序列。

Example

在一个list中,删掉偶数,只保留奇数:

1
2
3
4
def is_odd(n):
return n % 2

list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7]))

把一个序列中的空字符串删掉:

1
2
3
4
def not_empty(s):
return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))

Exercise

回数是指从左向右读和从右向左读都是一样的数,例如12321909。请利用filter()筛选出回数:

1
2
3
4
def is_palindrome(n):
return str(n)==str(n)[::-1]

output = filter(is_palindrome, range(1, 1000))

Sorted Function

Definition

sorted()函数除了可以对list进行排序之外,它还可以接收一个key函数来实现自定义排序。

Example

1
2
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
1
2
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
Copyright © ca01h 2019-2020 | 本站总访问量