人生苦短我用Python(三)——函数式编程

本文深入探讨了Python的函数式编程,包括函数式编程特点、高阶函数的应用,如map()、reduce()、filter(),自定义排序函数,以及返回函数和闭包的概念。通过示例展示了如何使用这些特性来实现更简洁、高效的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模块:如何使用模块

面向对象编程:面向对象的概念、属性、方法、继承、多态等

定制类:利用python的特殊方法定制类

一.函数式编程

函数式:functional,一种编程范式,函数式编程是一种抽象计算的编程模式。

1. 函数式编程的特点:

  •    把计算视为函数而非指令;
  •    纯函数式编程:不需要变量,没有副作用,测试简单;
  •    支持高阶函数,代码简洁.

 2. python支持的函数式编程:

  •     不是纯函数式编程,允许有变量;
  •     支持高阶函数:函数也可以作为变量传入;
  •     支持闭包,有了闭包就能返回函数;
  •     有限度的支持匿名函数。

3. 高阶函数

变量可以指向函数,并且可以直接对变量进行调用,和调用函数的效果是一样的。

(1)demo:

函数名就是指向函数的变量,函数名和普通变量名没有什么区别,指向的只是一个函数对象。

(2)高阶函数定义:

  •          能接受函数做参数的函数;
  •          变量可以指向函数;
  •          函数的参数可以接收变量;
  •         一个函数可以接收另一个函数作为参数;
  •         能接收函数作为参数的函数就是高阶函数;

(3)demo--接收abs函数:

定义一个函数,接收x、y、f三个参数

其中x、y是普通参数,接收一个数值,f是函数

4.  python把函数作为参数

利用add(x,y,f)函数,计算:

 

import math


def add(x, y, f):
    return f(x) + f(y)


print(add(25, 9, math.sqrt))

 5. python中的map()函数

     map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

     注意:map()函数不改变原有的 list,而是返回一个新的 list。

     利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。

     由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

# 将list中的数据首字母转化成大写
def format_name(s):
    return s[0].upper() + s[1:].lower()


print(list(map(format_name, ['adam', 'LISA', 'barT'])))

6. python中的 reduce()函数

   reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

   reduce()还可以接收第3个可选参数,作为计算的初始值。

# python3之后reduce() 函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里
# 利用reduce函数来求奇
from functools import reduce

def prod(x, y):
    return x * y

print(reduce(prod, [2, 4, 5, 7, 12]))

# 第三个参数表示初始值
print(reduce(prod, [2, 4, 5, 7, 12],4))

7. python中的filter()函数

    filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

# coding:utf-8
import math

# Demo1:利用filter过滤掉偶数
def is_odd(x):
    return x % 2 == 1
print(list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17])))


# Demo2:利用filter删除None或者空字符串
def is_not_empty(s):
    return s and len(s.strip()) > 0
print(list(filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])))
# 注意:s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')
a = '     123'
print(a.strip())
a='\t\t123\r\n'
print(a.strip())


# Demo3:利用filter()过滤出1~100中平方根是整数的数
def is_sqr(x):
    r = int(math.sqrt(x))
    return r*r == x
# range()可以创建一个从x起,到y结束,不包括y的一个整数列表
print(list(filter(is_sqr, range(1, 101))))

 8.python中的自定义排序函数

    Python内置的 sorted()函数可对list进行排序。

    sorted()也是一个高阶函数,在python3 以后sorted取消了对cmp的支持。

    sorted(iterable, key=None, reverse=False)

  •     reverse是一个布尔值。如果设置为True,列表元素将被倒序排列,默认为False
  •     key接受一个函数,这个函数只接受一个元素,默认为None

Python3实现方式:

# coding:utf-8
# 任务:对字符串排序时,有时候忽略大小写排序更符合习惯。请利用sorted()高阶函数,实现忽略大小写排序的算法。
# 输入:['bob', 'about', 'Zoo', 'Credit']
# 输出:['about', 'bob', 'Credit', 'Zoo']
# python3实现方式
# by : kimtian 20190701
import functools


def cmp_ignore_case(s1, s2):
    u1 = s1.upper()
    u2 = s2.upper()
    if u1 < u2:
        return -1
    if u1 > u2:
        return 1
    return 0


print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=functools.cmp_to_key(cmp_ignore_case)))

Python2实现方式:

def cmp_ignore_case(s1, s2):
    u1 = s1.upper()
    u2 = s2.upper()
    if u1 < u2:
        return -1
    if u1 > u2:
        return 1
    return 0

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

9.python中返回函数

   Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数。

  (1)返回函数和返回值的区别:

def myabs():
    return abs   # 返回函数
def myabs2(x):
    return abs(x)   # 返回函数调用的结果,返回值是一个数值

  (2)返回函数可以把一些计算延迟执行。

    如:

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

   调用:

   f = calc_sum([1, 2, 3, 4])   # 调用calc_sum()并没有计算出结果,而是返回函数。

   f()  # 对返回的函数进行调用时,才计算出结果。 

  (3)练习:编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。

    python 3实现方式:

# coding:utf-8
# kimtian 2019.07.11
from functools import reduce


def calc_prod(lst):
    def calc_cheng():
        def cheng(x, y):
            return x * y

        return reduce(cheng, lst, 1)

    return calc_cheng


f = calc_prod([1, 2, 3, 4])
print(f())

  python 2实现方式: 

def calc_prod(lst):
    def calc_cheng():
        def cheng (x,y):
            return x * y
        return reduce(cheng, lst, 1)
    return calc_cheng

f = calc_prod([1, 2, 3, 4])
print f()

10.python中闭包

这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)

闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

练习:编写一个函数,让它正确返回能计算1x1、2x2、3x3的函数。

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        r = f(i)
        fs.append(r)
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值