Python 第五天

时间:2023-03-08 16:31:03

函数式编程

高阶函数

1.变量可指向函数

func = abs
print(func(-1)) #1

2.函数可以作为参数传入另外的函数这也就是高阶函数

def add(x,y,func):
print(func(x) + func(y)) arr1,arr2 = (1,2),(2,3)
add(arr1,arr2,list) #[1,2,2,3]
map() 与 reduce()

1.map() 函数接收两个参数,一个函数,一个 Iterable ,map() 函数会将函数作用于 Iterable 并把结果作为新的 Iterable 返回

def func(x):
return x * x ita = [1,2,3,4,5,6]
print(list(map(func,ita)))

2.reduce() 函数接收两个参数,一个至少有两个参数的函数,一个序列。reduce() 函数会把结果和序列的下一个元素做积累计算。reduce() 函数需要从 functools 模块进行引用

from functools import reduce

def f(x,y):
return 10 * x + y def char2num(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s] r = reduce(f,map(char2num,'13547'))
print(r)
filter()
  1. filter() 函数接收两个参数,一个函数,一个序列。filter() 把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    def is_odd(x):

    return x and x.strip()

    print(list(filter(is_odd,['0','',none,'A'])))

sorted()
  1. sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。它接收两个参数,一个序列,一个可选参数 key 函数作为排序参数依据

    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

    def by_score(L):

    return sorted(L,key=lambda L: L[1])

    print(by_score(L))

返回函数

  1. 函数可以作为函数返回值

    from functools import reduce

    def sun_in(L):

    def a(x,y):

    return x + y

    def sum():

    print(reduce(a,L))

    return sum

    func = sun_in(list(range(0,11)))

    func()

  2. 闭包问题

    再创建一个函数,用该函数的参数绑定循环变量当前的值,可以解决闭包问题

    def count():

    fs = []

    def f(j):

    def g():

    return j**2

    return g

     for i in range(0,3):
    fs.append(f(i)) return fs

    f1,f2,f3 = count()

    print(f1(),f2(),f3())

匿名函数

匿名函数 lambda x:x * x

print(list(map(lambda f : f**3 , [1,2,3])))

装饰器

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

import functools

def log(text):
def decorator(func):
@functools.wraps(func)
def wraaper(*args,**kw):
print('%s %s()' % (text,func.__name__))
return func(*args,**kw)
return wraaper
return decorator @log('调用')
def pr(text):
print(text) pr(input('请输入随便什么东西:'))

偏函数

functools.partial可以帮助我们返回新的偏函数,即把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

import functools 

def func(a,b,c=2):
print(a ** c + b ** c) newfunc = functools.partial(func,c=1) func(2,2) #8
newfunc(2,2) #4