首页 > 其他 > 详细

四、匿名函数/内置函数/递归/闭包

时间:2020-12-02 00:03:31      阅读:42      评论:0      收藏:0      [点我收藏+]

高阶函数:一个函数作为参数,传入另一个函数

一、匿名函数 

lambda表达式:简化函数的书写形式,适用于短小的函数 

lambda 参数1,参数2:返回值

等价于:

def 函数名(参数1,参数2):

  return 返回值 

def f(x):
  return x+1

g = lambda x : x+1 # 简化代码,x表示参数,x+1表示返回值

print(f(1))
print(g(1))

 举例:

def sort_test():
    students=[
        {name:zjx,age:19},
        {name:huahua,age:14}
        {name:乐乐,age:31}
    ]
    print(sorted(setudents,key=lamdba student:student[age]))   
    print(sorted(setudents,key=lamdba student:student[age],reverse=Ture)) 

二、内置函数

1:Map

功能:根据提供的函数对指定序列做依次映射 

map() 函数语法:map(function, iterable,...) 

  • function -- 函数
  • iterable -- 一个或多个序列

技术分享图片

举例1:

def add_list(list1,list2,list3):
    return list(map(lambda x,y,z: x+y+z, list1,list2,list3 ))


if __name__ == __main__:
    print(add_list([1,2,3,4],[2,3,4,5],[3,4,5,6])) # [6, 9, 12, 15]

注意:map函数的第一个参数是一个函数名,如果函数的实现比较简单的时候,可以用匿名函数--lambda

2.reduce函数

功能:会对参数序列中元素进行累积,reduce()方法接受一个function作为累加器,sequence中每个值(从左到右)开始缩减,最终计算为一个值

举例:

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

print(reduce(add,range(1,101))  # 累加1+2+3....+100
print(reduce(lambda x,y:x+y,range(1,101)))

3.filter

filter 函数 可迭代对象

功能:过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表 

filter()语法:filter(function, iterable) 

  • function -- 判断函数。
  • iterable -- 可迭代对象。

接收两个参数,第一个为函数名,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中

技术分享图片 

 举例:

def f(x):
    if x > 5:
        return x
print(list(filter(f,[11,2,33,4,5])))
print(list(filter(lambda x: x > 5, [11,2,33,4,5]))) 

 4.zip

功能:zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,返回的是一个zip对象

技术分享图片 

举例

def zip_fun():
    A = ["a","b","c"]
    B = [1, 2, 3]
    print(zip(A,B))       # <zip object at 0x0000027C5D32D8C8> 
    print(isinstance(zip(A,B),Iterator))   #True
    for item in zip(A,B):
        print(item)      # 依次输出 (‘a‘, 1)  , (‘b‘, 2)  ,(‘c‘, 3)  

    print(list(zip(A,B)))  # [(‘a‘, 1), (‘b‘, 2), (‘c‘, 3)]

if __name__ == __main__:
    zip_fun() 

三、递归

递归:函数在运行的过程中调用自己,如下图所示。

技术分享图片

构成递归的条件:

  • 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  • 必须有一个明确的递归结束条件
  • 递归调用的表达式

递归深度:最大递归次数

import sys
sys.setrecursionlimit(1000)  # 表示递归深度为1000,即只能递归1000次  

举例1:

def f(x=100):
    if x == 1:    # 递归结束的条件
        return 1  # 递归结束
    return f(x-1) + x    # 递归调用

if __name__ == __main__:
    print(f())  #累加1+2+3....+100=5050

举例2:

# 一个小球从100米高度自由落下,每次落地后反跳会原来的高度的一半再落下,求在第十次落地时,共经过多少米?用递归实现

def f(n, h=100):
    if n == 1:
        return h
    return f(n-1) + h/2**(n-1) * 2

举例3:

# 200元买200本书,A类5元一本,B类3元一本,C类1元2本,有多少种买法?
# 思路:先明确200元钱单独买每类书,可以买多少本,再进行for循环嵌套,最后输出符合条件的即可

def buy_book():
    money = 200
    nums = 200
    count = 0  # 记录买法的种类

    for a in range(int(money/5) + 1):
        for b in range(int(money/3) + 1):
            for c in range(int(money/0.5) + 1):
                if 5 * a + b * 3 + c * 0.5 <= 200 and a + b + c ==200:
                    count += 1
    return count

四、闭包

闭包:函数可以作为参数传给另一个函数

def outer():
    result = 0  # local变量 局部变量
    def inner():
        nonlocal result
        result += 1
        print(f"result的值{result}")
    return inner  # 把函数返回

if __name__ == __main__:
    f = outer()
    f()   # result的值1
    f()   # result的值2
    f()   # result的值3

包:一个函数包着另外一个函数

闭:用函数中的函数来操作函数中的变量。(操作函数中的局部变量的一种方法)

好处:上次的操作状态被保存下来(保存函数中某个变量的值)。如上例中,执行多次f(),查看结果

闭包是一种编成思想,其他语言也有,如JavaScript

 

四、匿名函数/内置函数/递归/闭包

原文:https://www.cnblogs.com/zhangjx2457/p/14044498.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!