python学习笔记3.3-高级函数技巧

在使用函数的时候,如果能合理的使用一些技巧,对于代码的阅读性以及程序的结构都是很有帮助的。常用的技巧有递归函数、高阶函数等。

1 递归函数

递归函数的定义就是在函数的内部调用自身,这样的函数就称为递归函数。其实递归是一种思想,将一个复杂问题分为很多步,上一步的输出结果会作为下一步的输入。例如:求解1*2*3*...*n

def get_n(n):
    if n==1:
        return 1
    return n*get_n(n-1)

运用这个思想就能够求等比数列的乘积了。 我们从函数定义也可以看出,递归函数是一层一层的函数不断的嵌套实现的,同时我们也知道在调用函数的时候会将正在运行的地址和数据存在栈中,如果递归的层数很多,就容易导致栈溢出,最终使得程序运行错误,所以要谨慎使用递归函数。

2 高阶函数

高阶函数这种称谓比较难理解,通俗的说就是让函数的参数能够接受别的函数,也就是说函数也是变量的一种表现形式,也就是说,函数名本质上是指向函数的变量。知道了这些我们就可以这样去定义一个函数了:

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

def get_add(x,y,func):
    return x+y+func(x,y)

a = get_add(2,3,get_mul)
print(a)

python中内置了几个比较实用的高阶函数,这里不得不提。 - 2.1 map()

map()函数接收两个参数:一个函数,一个可迭代的对象(list,字符串等),map函数的功能就是把这个函数分别应用到可迭代对象上并返回一个新的可迭代对象。

def get_add(x,y=10):
    return x+y

a = map(get_add, [1,2,3,4,5])
print(a)  #a 是对象的地址

b = list(a)  # 将对象转换为list
print(b)
  • 2.2 filter()

filter函数用于过滤可迭代对象(list等),过滤的原则是根据传入的函数应用到传入的可迭代对象的元素上,根据返回值来决定该元素是否删除,如果返回值为True,则保留;同样,返回值为False则删除该元素。

def is_zero(x):
    if x == 0:
        return False
    else:
        return True

a = filter(is_zero, [1,2,0,4,0])
print(a)

b = list(a)
print(b)

3 函数名作为返回值

在函数嵌套的过程中,也就是在函数中还声明了函数,函数名可以作为内层函数的返回结果直接使用。

def get_add(x,y):
    def get_mal():
        return x*5
    return get_mal()+y

a = get_add(5,10)
print(a)

这种用法也充分说明了函数名是指向函数的变量。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时...

1850
来自专栏java学习

Java每日一练(2017/6/18)

题目要求 本期题目: (单选题) 1、覆盖与重载的关系是( ) A 覆盖只有发生在父类与子类之间,而重载可以发生在同一个类中 B 覆盖方法和重载方法都可以不...

2795
来自专栏编程

每日一练:阶乘序列求和

问题:求前n项和:1+2!+3!+4!+5!+......+n! 解题思路: 这么简单,不需要思路吧。 解题源码分享: # 法一:通过递归实现 deffacto...

1967
来自专栏Java3y

归并排序就这么简单

归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是归并排序,希望大家看完能够理解并手写出归并排序快速排序的代码,然后...

5997
来自专栏LanceToBigData

JavaSE(一)之类与对象

终于到了要学习面向对象程序设计了,其中可能很多东西以前都知道怎么去用,但是却不知道怎么来的,或者怎么样写会出错,所以今天总结起来。 一、OOP概述   Java...

1925
来自专栏猿人谷

数组和链表的区别

数组: 数组是将元素在内存中连续存放,由于每个元素占用内存 相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内...

1917
来自专栏静晴轩

Javascript数组操作

使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间;思虑下,堪能如此...

4188
来自专栏Brian

Scala Turtuial-容器(集合)类型

集合 scala的集合分为可变集合和不可变集合,其中可变集合的增删改查都是作用于它本身;而不可变集合的增删改操作返回的是一个新的集合,原不可变集合保持不变。函数...

2994
来自专栏xingoo, 一个梦想做发明家的程序员

Kruskal算法

同样是求最小生成树,kruskal适合从边的角度出发,因此适合稀疏图。而prim算法从点的角度出发,适合稠密图。 时间复杂度为O(eloge)。因为外层循环了e...

1995
来自专栏我是攻城师

Scala中的Map使用例子

2737

扫码关注云+社区