简析Python函数式编程字符串和元组及函数分类与高阶函数

目录
  • 函数式编程中的字符串
  • 不变类型元组
    • 普通元组的声明与访问
  • 函数式的分类
    • any() 、all() 、len()、sum() 对比学习
    • zip()、reversed()、enumerate()
  • 高阶函数
    • 函数 max 和 min()
    • map 函数
    • filter 函数
    • sorted 函数
    • 同一需求的不同效率问题

函数式编程中的字符串

在函数式编程中,经常用到 Python 字符串,因其是不可变数据结构。

字符串本身是一个对象,具备很多对象方法,与常识中函数的使用不太相同,例如下述代码

my_str = "xiangpica"
print(my_str.upper())
print(len(my_str.upper()))

其中 len() 函数的用法被称为前置写法,而 my_str.upper() 被称为后置写法,这样很容易造成函数式编程的理解问题,所以需要系统性的解决该问题。

如果上述代码可以修改为 len(upper(my_str)),就变得相对容易理解。

# 类型 Text 是 str 的别名
from typing import Text
my_str = "xiangpica"
def upper(str: Text) -> Text:
    return str.upper()
print(upper(my_str))
print(len(upper(my_str)))

上述代码重新定义了一个前置用法的函数 upper,用于解决函数式编程中的一致性问题,该解决办法在后续代码中会经常出现。

不变类型元组

除字符串外,Python 中的另一个不可变数据类型为元组,元组分为普通元组与命名元组。

普通元组的声明与访问

在之前的文章中对元组的基本知识,已经进行了说明,可以去稍微复习一下,然后在进入本文的学习。

先看一下代码,然后再判断是否可以理解。

from typing import Tuple, Text, Callable
LANGUAGE = Tuple[Text, Text, Text]
python: Callable[[LANGUAGE], Text] = lambda languages: languages[1]
items = ("c","python","js")
a = python(items)
print(a)

上述代码定义了一个新的类型 LANGUAGE,该类型是一个元组,具备三个元素。

python 类型注解是 Callable[[LANGUAGE], Text],即它的参数是 LANGUAGE 类型,返回值是字符串类型。

注意 typing 模块加入不会影响程序的运行不会报正式的错误,仅作为类型检查,防止运行时出现参数、返回值类型不符,开发人员查阅。

除上述内容外,还可以使用命名元组来实现。

from collections import  namedtuple
Language = namedtuple("Language",("name1", "name2", "name3"))
l = Language("c", "python", "js")
print(l)
print(l.name1)

或者直接使用 typing 模块的 NamedTuple 也可以。

from typing import NamedTuple, Text
class Language(NamedTuple):
    name: Text
    description: Text
l = Language("C", "C语言")
print(l)
print(l.name)
print(l.description)

函数式的分类

函数大类分为两种:

  • 标量函数:函数的返回结果为一个值;
  • 集合函数:函数的结果为可迭代的集合。

集合函数也可以细分:

  • 规约/累积函数:将集合内的元素进行累积计算,最后得到一个值;
  • 映射函数:将标量函数应用于几个的每个元素,最后得到一个与原集合相同长度的新集合;
  • 过滤函数:将标量函数应用于每个元素,保留一部分,得到一个子集。

有了上述概念之后,对于函数式编程的理解可以更进一步。

any() 、all() 、len()、sum() 对比学习

anyall 两个函数属于规约函数,进行的操作叫做布尔规约,即将一个集合的元素归约为 True 或者 False,all 需要所有值都是 True,any 只要有一个值是 True 即可。

lensum 也是归约函数,它们分别表示计算集合中所有值的个数和汇总值。

zip()、reversed()、enumerate()

zip 函数可以把多个可迭代对象或者序列,之间的数据进行交叉组合,即将 n 个元素的可迭代对象转换为 n 元组,然后返回一个生成器。

如果 zip 函数没有输入参数,那将返回一个空列表 []

a = zip()
print(list(a))

reversed 函数用于改变序列顺序,即反转序列。

enumerate 函数获取序列或者可迭代对象的下标值,转换成概念描述就是将可迭代对象映射为二元组序列(带上序号了),每个二元组序列中,第一个元素是下标值,第二个元素是值本身。

高阶函数

学习 Python 函数式编程,绕不开高阶函数的学习,高阶函数就是以函数为参数,或者以返回值为函数的函数。

函数 max 和 min()

上述两个函数是规约函数,即输入的是集合,输出的是单个值,主要用途就是寻找极值。

一般在学习的时候,可以把二者当成普通的函数,也可用于高阶函数,主要为参数位置的差异。

最简单的用法为:

max_num = max(1, 2, 3, 4)
min_num = min(1, 2, 3, 4)
print(max_num)
print(min_num)

接下来就是其高阶函数模式的实现,自定义比较规则。

# 第一种写法,比较字符串长度
max_num = max("a", "abc", "ceda", "aaaaa", key=lambda x: len(x))
min_num = min("a", "abc", "ceda", "aaaaa", key=lambda x: len(x))
print(max_num)
print(min_num)
# 第二种写法,比较字符串长度
max_num = max(["a", "abc", "ceda", "aaaaa"], key=lambda x: len(x))
min_num = min(["a", "abc", "ceda", "aaaaa"], key=lambda x: len(x))
print(max_num)
print(min_num)

上述代码的 key 为可选参数,默认值为 None。

map 函数

map 函数用于将一个集合映射到另一个集合,例如可以将一个由字符串组成的列表中的每一项,都转换为整数。

data = ["1", "2", "3"]
print(map(int, data))
print(list(map(int, data)))

代码 map(int, data) 的含义就是将 int 函数作用于 data 中的每一项。

map 函数的第一个参数也可以用 lambda 代替。

data = ["1", "2", "3"]
print(map(lambda x: int(x), data))
print(list(map(int, data)))

filter 函数

filter 函数主要用于将一个**判定函数(谓语函数)**用于集合的每一个元素,最后得到满足判定函数的结果集,测试代码如下:

data = [1, 3, 5, 7, 9]
print(filter(lambda x: x > 3, data))
print(list(filter(lambda x: x > 3, data)))

sorted 函数

sorted 函数也支持高阶函数 key 参数定制规则。

result = sorted(["afghsss", "abc", "ceda", "aaaaa"], key=lambda x: len(x))
print(result)

同一需求的不同效率问题

通过 map 函数,生成器表达式,存在迭代器的生成器函数分别多 一亿 数据量的列表进行测试。

import time
def demo(x):
    return x * 2
def demo1(f, l):
    for x in l:
        yield f(x)
my_list = list(range(1, 10000000))
start = time.perf_counter()
# map(lambda x: x * 2, my_list) # 程序运行耗时 3.904999999998493e-06
# (demo(x) for x in my_list) # 程序运行耗时 6.310000000009364e-06
demo1(demo, my_list) # 程序运行耗时 5.1070000000041915e-06
cost_time = time.perf_counter() - start
print("程序运行耗时", cost_time)

得到的结果是 map 最快,所以用就完事了。

以上就是简析Python函数式编程字符串和元组及函数分类与高阶函数的详细内容,更多关于Python字符串和元组及函数分类与高阶函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python函数式编程实例详解

    本文实例讲述了Python函数式编程.分享给大家供大家参考,具体如下: 函数式编程就是一种抽象程度很高的编程范式,从计算机硬件->汇编语言->C语言->Python抽象程度越高.越贴近于计算,但执行效率也越低.纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的.函数式编程的一个特点就是,允许把函数

  • python高级特性和高阶函数及使用详解

    python高级特性 1.集合的推导式 •列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if codition - 可选 •字典推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:{key_exp:value_exp for item in collection if codition} •集合推导式 语法:{exp for item in collection if

  • 详解python内置常用高阶函数(列出了5个常用的)

    高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数. python内置常用高阶函数: 一.函数式编程 •函数本身可以赋值给变量,赋值后变量为函数: •允许将函数本身作为参数传入另一个函数: •允许返回一个函数. 1.map()函数 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回 def add(x): ret

  • 详解Python函数式编程—高阶函数

    函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 高阶函数 变量

  • 简析Python函数式编程字符串和元组及函数分类与高阶函数

    目录 函数式编程中的字符串 不变类型元组 普通元组的声明与访问 函数式的分类 any() .all() .len().sum() 对比学习 zip().reversed().enumerate() 高阶函数 函数 max 和 min() map 函数 filter 函数 sorted 函数 同一需求的不同效率问题 函数式编程中的字符串 在函数式编程中,经常用到 Python 字符串,因其是不可变数据结构. 字符串本身是一个对象,具备很多对象方法,与常识中函数的使用不太相同,例如下述代码 my_s

  • JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析

    本文实例讲述了JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法.分享给大家供大家参考,具体如下: 高阶函数(higher-order functions),就是返回其它函数的函数,或者使用其它函数作为它的参数的函数. 使用函数作为参数 因为函数本身就是一个值,所以可以让函数作为参数传递给其它的函数.JavaScript 有些函数就需要用到函数类型的参数,比如 Array.map. 比如我有一组数据: con

  • Python编程functools模块中创建修改函数的高阶函数解析

    partial 函数 partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的部分参数提前绑定为指定值,然后再进行计算. 由于偏函数的可变参数少,因此函数调用的难度低. 直接展示代码: from functools import partial # 原函数声明 def show(name, level): print("name:", name, "level:", level) # 定义偏函数,封装 show() 函数,并为 na

  • Python编程functools模块创建修改的高阶函数解析

    目录 partial 函数 装饰器 @lru_cache reduce 函数 partial 函数 partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的部分参数提前绑定为指定值,然后再进行计算. 由于偏函数的可变参数少,因此函数调用的难度低. 直接展示代码: from functools import partial # 原函数声明 def show(name, level): print("name:", name, "level:&q

  • Python的函数的一些高阶特性

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身. 要获得函数调用结果,我们可以把结果赋值给变量: >>> x

  • 详解Python高阶函数

    本文要点 1.什么是高阶函数 2.python中有哪些常用的高阶函数 什么是高阶函数? 在了解什么是高阶函数之前,我们来看几个小例子.我们都知道在 python 中一切皆对象,函数也不例外.比如求绝对值函数 abs,我们可以用一个变量 f 指向 abs 函数,那么当调用 f() 的时候可以得到和 abs() 一样的效果,这说明变量可以指向函数! 同理我们将 abs 指向另一个函数 abs = len,那么 abs 将不再是求绝对值的函数了,abs指向的是求长度的 len 函数.这说明函数名其实就

  • Python常见内置高阶函数即高阶函数用法

    目录 1.什么是高阶函数? 2.高阶函数-map.filter.reduce 2.1map函数 2.2filter函数 2.3reduce函数 1.什么是高阶函数? 高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数. 参数为函数: #参数为函数 def bar(): print("in the bar..") def foo(func): func() print("in the foo

  • Python技巧匿名函数、回调函数和高阶函数

    目录 1.定义匿名或内联函数 2.在匿名函数中绑定变量的值 3.让带有n个参数的可调用对象以较少的参数调用 4.在回调函数中携带额外的状态 1.定义匿名或内联函数 如果我们想提供一个短小的回调函数供sort()这样的函数用,但不想用def这样的语句编写一个单行的函数,我们可以借助lambda表达式来编写"内联"式的函数. 如下图所示: add = lambda x, y: x + y print(add(2, 3)) # 5 print(add("hello", &

  • Python全栈之迭代器和高阶函数

    目录 1. lambda表达式 2. locals和globals 3. 迭代器 小提示: 4. map高阶函数 5. reduce高阶函数 6. filter高阶函数 7. sorted高阶函数 8. 小练习 总结 1. lambda表达式 # ### 匿名函数 : lambda表达式 """ 概念: 用一句话来表达只有返回值的函数 语法: lambda 参数 : 返回值 特点: 简洁,高效 """ # (1) 无参的lambda表达式 def

随机推荐