疾风小站-电影动漫图社

python基础的高级用法-函数式编程

高级特性

     切片

l = ['c','java','python']
print(l[0:3])
print(l[0:1])

结果:
['c', 'java', 'python']
['c']

  迭代

l = ['c','java','python']
for i in l:
    print(i)

结果:
c
java
python

  列表生成式

l  = [ x+x for x in range(1,10)]
print(l)

结果:
[2, 4, 6, 8, 10, 12, 14, 16, 18]

  生成器

个列表生成式的[]改成(),就创建了一个generator

g  = ( x+x for x in range(1,10))
print(g)
for i in g:
    print(i)

结果:
<generator object <genexpr> at 0x000001F4C0EA93B8>
2
4
6
8
10
12
14
16
18

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

解释说明:
赋值语句:a, b = b, a + b 相当于:
t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

高阶函数

map函数

def f(x):
    return x+x
r = map(f,[1,2,3,4,5,6,7,8,9])
print(list(r))

结果:[2, 4, 6, 8, 10, 12, 14, 16, 18]

reduce函数

from functools import reduce
def f(x,y):
    return x+y

#reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
r = reduce(f,[1,2,3,4,5,6,7,8,9])
print(r)

结果:45

 

filter函数

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

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序

列表数子默认从大到小

列表字符串默认情况下,对字符串排序,是按照ASCII的大小比较

要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True

sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

 sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

闭包

在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

>>> f1()
9
>>> f2()
9
>>> f3()
9

全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9

 

lambda 匿名函数

def f(x):
    return x * x

相当于:
lambda x: x * x