python基础—函数式编程

news/2024/7/5 2:59:06

函数式编程

  1.不可变数据

  2.第一类对象

  3.尾调用优化(尾递归) 

1.高阶函数

 满足两个条件任意一个为高阶函数:

  1.函数的传入参数是一个函数名

  2.函数的返回值是一个函数

#非函数式
a = 1
def test():
    global a
    a += 1
    return a
test()
print(a)

#函数式
n=1
def test1():
    return n+1
print(test1())

把函数当作参数传给另一个函数

def foo(n):
    print(n)
def bar(name):
    print('My name is %s'%name)

foo(bar('alex'))
My name is alex
None

返回值中包含函数

def foo():
    print('from foo')
    return bar
def bar():
    print('from bar')

foo()()
from foo
from bar
def foo():
    print('from foo')
    return foo
foo()()
from foo
from foo

2.尾调用

  在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步)

  尾调用的关键在于函数的最后一步调用别的函数,根据函数即变量的定义,定义a函数,b内调用函数c,在内存中形成一个调用记录,又称为调用栈,

用于保存调用位置以及变量信息,即a->b->c,直到c返回结果给b,c的调用记录才会消失,b返回a,b的调用结果消失,a返回结果,a的调用记录消失,所有的调用

记录都是“”先进后出”,形成一个‘’调用栈‘’。

 

3.map函数

处理序列中每个元素,得到的结果是一个“列表”,该“列表”元素个数及位置与原来一样

num = [1,2,3,4]
def add(x):
    return x+1

def map_test(func,array):
    ret = []
    for i in array:
        res = func(i)
        ret.append(res)
    return ret
print(map_test(add,num))
[2, 3, 4, 5]

配合匿名函数

num = [1,2,3,4]
def map_test(func,array):
    ret = []
    for i in array:
        res = func(i)
        ret.append(res)
    return ret
print(map_test(lambda x:x+1,num))
num = [1,2,3,4]
def add(x):
    return x+1
msg='xiaob'
print(list(map(lambda x:x+1,num)))
print(tuple(map(lambda x:x.upper(),msg)))
print(list(map(add,num)))
[2, 3, 4, 5]
('X', 'I', 'A', 'O', 'B')
[2, 3, 4, 5]

filter函数

遍历序列中每个元素,判断每个元素得到一个布尔值,如果是True则留下来

movie_people = ['alex_sb', 'wupeiqi_sb', 'linhaifeng', 'yuanhao_sb']

def sb_show(n):
    return n.endswith('sb')

def filter_test(func, array):
    ret = []
    for p in array:
        if not func(p):
            ret.append(p)
    return ret
res = filter_test(sb_show, movie_people)
print(res)
['linhaifeng']

 

def sb_show(n):
    return n.endswith('sb')

res=filter(sb_show,movie_people)
print(list(res))
res = filter(lambda n:not n.endswith('sb'),movie_people)
print(list(res))
print(list(filter(lambda n:not n.endswith('sb'),movie_people)))
['alex_sb', 'wupeiqi_sb', 'yuanhao_sb']
['linhaifeng']
['linhaifeng']

 

people = [{'name':'alex','age':1000,
           'name':'seven','age':1000,
           'name':'Christian','age':18}
          ]
print(list(filter(lambda x:x['age']<=18,people)))
[{'name': 'Christian', 'age': 18}]

 

reduce
处理一个序列,然后把序列进行合并

num = [1,2,3,10]
def multi(x,y):
    return x*y
def reduce_test(func,array,init=None):
    if init is None:
        res = array.pop(0)
    else:
        res = init
    for i in array:
        res = func(res,i)
    return res
print(reduce_test(multi,num,10))
600

 

from functools import reduce
num = [1,2,3,10]
print(reduce(lambda x,y:x*y,num,2))
120

 

 

转载于:https://www.cnblogs.com/huiyichanmian/p/8807912.html


http://www.niftyadmin.cn/n/735346.html

相关文章

Http 缓存: 强缓存与协商缓存

Http 缓存: 强缓存与协商缓存 文章目录Http 缓存: 强缓存与协商缓存简介参考完整示例代码正文Http 缓存机制&#xff1a;强缓存 & 协商缓存强缓存&#xff1a;Expires & Cache-ControlHttp 1.0&#xff1a;ExpiresHttp 1.1&#xff1a;Cache-Control协商缓存&#xff1…

Docker网络基础

目录 网络bridge网络none网络host网络端口端口绑定自定义网络网络 docker提供几种网络&#xff0c;它决定容器之是以及外界和容器之间怎么样去通信。 可以通过如下方法查看docker的网络&#xff1a; docker network ls null&#xff1a;无网络&#xff0c;使用这种网络的容器会…

CVPR 2022 Paper Reading List

Best Paper —— Learning to Solve Hard Minimal Problems Best Student Paper —— EPro-PnP: Generalized End-to-End Probabilistic Perspective-n-Points for Monocular Object Pose Estimation Best Student Paper Mention —— Ref-NeRF: Structured View-Dependent A…

基于OpenResty和Node.js的微服务架构实践

什么是微服务&#xff1f; 传统的单体服务架构是单独服务包&#xff0c;共享代码与数据&#xff0c;开发成本较高&#xff0c;可维护性、伸缩性较差&#xff0c;技术转型、跨语言配合相对困难。而微服务架构强调一个服务负责一项业务&#xff0c;服务可以单独部署&#xff0c;独…

JS 前端路由:单页面应用的路由原理和实现

JS 前端路由&#xff1a;单页面应用的路由原理和实现 文章目录JS 前端路由&#xff1a;单页面应用的路由原理和实现简介参考完整示例代码正文从页面刷新到路由跳转单页面应用的优劣前端路由分类前端路由实现项目架构Hash 实现History 实现结语简介 在浏览器的默认行为中&#…

Base64 Base64URL 编码方案(附 js 代码实现)

Base64 & Base64URL 编码方案(附 js 代码实现) 文章目录Base64 & Base64URL 编码方案(附 js 代码实现)简介参考完整示例代码正文什么是 Base64&#xff1f;Base64 转换规则Base64URL 规则Base64 转换字符表转换规则图解在 JavaScript 中进行 Base64 编码Base64 编码 js…

获取 CSS样式

兼容写法 &#xff1a; 我们这个元素里面的属性很多&#xff0c; left top width 我们想要某个属性&#xff0c; 就应该 返回改属性&#xff0c;所有继续封装 返回当前样式的 函数。 1 var demo document.getElementById("demo"); 1 function getStyle(obj,…

JS 动画:给网页下个雪吧

JS 动画&#xff1a;给网页下个雪吧 文章目录JS 动画&#xff1a;给网页下个雪吧简介参考完整示例代码正文1. 一朵雪花2. 很多雪花3. 让雪花动起来4. 快速划过的雪花5. 雪花摇曳6. 最终效果结语简介 前些日子面试的时候被问到 raf 的问题&#xff0c;写了篇 JS 动画基础: 细说…