函数式编程是指用一系列函数解决问题

好处:用每个函数完成每个细小的功能,一系列函数任意组合能够解决大问题

函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态

函数之间的可重入性

当一个函数的输入实参一定,结果也必须一定的函数为可重入函数

例子:

#可重入函数
def myadd(x,y):
return x+y
#不可重入函数
s = 0
def myadd2(x,y):
global s
s+= x+y
return s

高阶函数

  • map
  • filter
  • sorted

什么是高阶函数

​ 满足下列条件中个任意一个的函数就是高阶函数

​ 条件一:函数接收一个或多个函数中用参数传入

​ 条件二:函数返回一个函数

map函数

​ map(func,*iterable)

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

例子:

对于list[1,2,3,4,5,6,7,8,9]

如果希望把list的每个元素都做平方,就可以用map()函数

因此,我们只需要传入函数f(x)==x*x,就可以利用mnap()函数完成这个计算

def f(x):
return x*x
print(map(f,[1,2,3,4,5,6,7,8,9]))
输出结果:
[1.4.9.10.25.36.49.64.81]
注意:map函数是不改变原有的list的,而是生成一个新的list

map()函数是python内置的高阶函数,对传入的list的每一个元素进行映射,返回一个新的映射之后的list

python3中,map函数返回的是一个map对象,需要list(map(fun,itor))来将映射之后的map对象转换成列表

map(func, *iterable) 返回一个可迭代对象,此可迭代

对象用函数 func对可迭代对象iterable中的每一个

元素作用参数计算后得一结果,当最短的一个可迭代对

象不再提供数据时可迭代对象生成数据结束

def mypower2(x, y):
return x ** y for x in map(mypower2,[1,2,3,4],[4,3,2,1]):
print(x)
# 看懂下面程序在做什么:
for x in map(pow, [1,2,3,4], [4,3,2,1],
range(5, 10)):
print(x)

filtert函数

filter(function,iterable)返回一个可迭代对象

​ 此可迭代对象将iterable提供的数据用函数function进行筛选

​ function将对iterable中的每个元素求值

​ 返回False将此数据丢弃,返回True则保留

示例:

def isood(x):
return x % 2 == 1

打印0~10之间的所有奇数

for x in filter(isood,range(11)):
print(X)
for x in filter(lambda x:x%2,range(11)):
print(X)
L = [x for x in filter(isood,range(11))]

sorted函数

作用:

将原可迭代对象提供的数据进行排序,生成排序后的列表

格式说明:

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

返回一个新的包含所有可迭代对象中数据的列表,新的列表是排序过的列表

参数说明:

  • iterable —–>可迭代对象
  • key———>函数是用来提供一个值,这个值将作为排序的依据
  • reverse—–>标志用来设置是否降序排序(默认为升序)

示例:

L = [5,-2,-4,0,3,1]
L2 = sorted(L)
k3 = sorted(L,keys=abs)
names= ['Tom','Jerry','Spike','Tyke']
sorted(names)
sorted(names,key=len,reverse=True)

递归函数

​ 什么叫递归函数?

​ 函数直接或者间接的调用自身

示例:

#函数直接调用自身
def f():
f()#调用自己
#函数间接调用自身
def fa():
fb()
def fb():
fa()
fa()

递归说明:

  • 递归一定要充值递归的成熟,当符合某一条件时要终止递归调用,几乎所有的递归都能用while循环来代替

    优点:递归可以把问题简单化,让思路清晰,代码简洁

    缺点:递归因系统环境影响大,当递归深度太大时,可以得到不可预知的结果

  • 递归函数的执行分为两个阶段

  • 递推阶段:调用进入函数内部

  • 回归阶段:返回结果,得到最终结果

闭包

什么是闭包?

  • 闭包是指引用了次函数外部变量的函数

    • (外部变量指:外部嵌套函数作用域内的变量)

闭包必须满足三个条件

  • 必须有一个内嵌函数
  • 内嵌函数必须引用外部函数的变量
  • 外部函数返回值 必须为内嵌函数

注意:

由于闭包会使函数中的变量都保存在内存中,计算机的内存消耗比较大,所以不能滥用闭包

示例

# 此示例示意闭包的定义及调用
def make_power(y):
def fn(x): # fn绑定一个闭包函数
return x ** y
return fn pow2 = make_power(2) # pow2绑定一个闭包函数
print("5的平方是:", pow2(5)) pow3 = make_power(3)
print("6的立方是:", pow3(6)) fp = make_power(100)
fp = make_power(10000)

闭包测试题:

试看下列程序的执行结果是什么?

  def get_funs(n):
L = []
for i in range(n):
L.append(lambda x: x * i)
return L funs = get_funs(4)
print(funs[0](10)) # 30
print(funs[1](10)) # 30
print(funs[2](10)) # 30
print(funs[3](10)) # 30

Python开发【第十三篇】高阶函数、递归函数、闭包的更多相关文章

  1. Python入门篇-高阶函数

    Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数  1>.First Class Object 函数在Python中是一等公民 函数也 ...

  2. 初学 Python(十二)——高阶函数

    初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...

  3. python笔记十三(高阶函数、装饰器)

    一.高阶函数 函数只要有以下两个特征中一个就可以称为高阶函数: a:函数名作为一个实参传入另一个函数中 b:函数的返回值中包含函数名 下面我们用代码来感受一下这两种形式: import time # ...

  4. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  5. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  6. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  7. python基础之常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  8. Python嵌套、递归、高阶函数

    一.嵌套函数 1.嵌套函数简单的理解可以看作是在函数的内部再定义函数,实现函数的“私有”. 2.特点: <1> 函数内部可以再次定义函数. <2> 只有被调用时才会执行(外部函 ...

  9. Learning Python 012 函数式编程 1 高阶函数

    Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...

  10. python六十四课——高阶函数练习题(二)

    总结:高阶函数以及匿名函数之间的配合使用 from functools import reduce #模块一:lambda和filter的结合使用 #lt = [1,2,3,4,5,6,7,8,9] ...

随机推荐

  1. Windows下如何调试驱动程序

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.配置Windbg使用双机调试 win10中“windbg+vm ...

  2. A-07 前向分步算法

    目录 前向分步算法 一.前向分步算法引入 二.前向分步算法详解 2.1 加法模型 2.2 加法模型目标函数优化问题 三.前向分步算法流程 3.1 输入 3.2 输出 3.3 流程 更新.更全的< ...

  3. python编程基础之二十

    字符串的其他常用方法: ord(char)  # 返回char字符对应的码值,可以是中文字符 chr(x)  # 输入一个unicode码,返回对应的字符 eval(str)  # 将str 中的内容 ...

  4. ACM-图论-同余最短路

    https://www.cnblogs.com/31415926535x/p/11692422.html 一种没见过的处理模型,,记录一下,,主要是用来处理一个多元一次方程的解的数量的问题,,数据量小 ...

  5. Ned 的难题

    题目描述 Ned 再也看不下去 Robert 的种种恶习, 于是他决定出一道题来让他醒悟. Ned 的题目是这样: 给出一个有 n 个数的序列, 求其中所有连续子序列的数的最大公因数的乘积模 1000 ...

  6. LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

    今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数. 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个 ...

  7. 树莓派(4B)Linux + .Net Core嵌入式-HelloWorld(二)

    一.新建.Net Core项目 新建.Net Core3.0的控制台应用,代码如下 namespace Demo { class Program { static void Main(string[] ...

  8. JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记

    2018年5月份开始在JZ2440上陆续移植了u-boot-2016.11.u-boot-spl-2016.11.linux-4.17和busybox-1.28.4,其中linux-4.17和busy ...

  9. 程序员IT狗有什么副业可以做呢?

    1. 开篇 副业有很多,全网有做什么公众号.闲鱼.手机卡,各种各样的都有,大部分是骗子,小部分是通过自己的努力,获得了成功. 从年初就开始实践如何做一个自由职业者,近大半年有一些感受正好一起分享交流一 ...

  10. 基于Spark的电影推荐系统(推荐系统~2)

    第四部分-推荐系统-数据ETL 本模块完成数据清洗,并将清洗后的数据load到Hive数据表里面去 前置准备: spark +hive vim $SPARK_HOME/conf/hive-site.x ...