美文网首页
第011篇:高阶函数

第011篇:高阶函数

作者: yydafx | 来源:发表于2019-11-18 18:49 被阅读0次

1、高阶函数

函数即变量

1.1、函数作为变量
  • Python中声明函数就是声明一个类型是function的变量,函数名就是变量名
  • 普通变量能做的事情函数都能做

声明函数就是声明变量,函数名就是变量名

def func1():
    print('函数1')
    return 100


print(type(func1))  # <class 'function'>

func2 = lambda x: x * 2
print(type(func2))  # <class 'function'>

num = 100
print(type(num))  # <class 'int'>

1.2、普通变量能做的函数都能做
 1)一个变量可以给另外一个赋值
a = 12
b = a
print(b, a + b)  # 12 24


def func3():
    print('函数3')
    return 120


b2 = func3
print(type(b2), b2())  # <class 'function'> 120
 2)修改变量的值
a = 'abc'
print(a, a[-1])

func3 = [10, 12]
func3.append(23)
print(type(func3), func3)   # <class 'list'> [10, 12, 23]
 3)变量作为序列元素
a = 10
list1 = [a, 10, 'abc']
print(list1)


def func4():
    print('函数4')
    return 112


list1 = [func4, func4(), 10]
print(list1)  # [<function func4 at 0x016647C8>, 112, 10]
print(list1[0]())  # 112  调用函数
 4) 变量作为函数的参数
def func5(x):
    print('函数5:', x)  # 函数5: 100


a = 100
func5(a)  # 函数5: 100
func5(func4)  # 函数5: <function func4 at 0x033747C8>

1.3、实参高阶函数
 1)将函数作为函数的参数 -- 实参高阶函数
def func4():
    print('函数4')
    return 112


def func6(x):
    y = x()  # 执行:func4()  打印:函数4
    print(y)  # 接收func4的返回值并打印:112


func6(func4)
 2)系统的实参高阶函数
  • 列表.sort()、sorted()、max()、min() 都是实参高阶函数,因为这四个函数中都有一个参数key,要求是一个函数
nums = [12, 32, 23, 34]
nums.sort(reverse=True)  # [34, 32, 23, 12]
print(nums)

 a、排序方法:参数key,要求是一个函数,作用是用来定制排序的规则(默认按元素大小从小到大排序)

  • 参数key的要求:
    ①、key是一个函数
    ②、函数中只有一个参数,这个参数指向的是系列中的每个元素
    ③、函数需要一个返回值,这个返回值就是排序的时候比较大小的对象

将nums中的元素按个位数从小到大排序

nums = [100, 39, 61, 52, 58]

# 常规函数
# def func_key(item):
#     return item % 10
# nums.sort(key=func_key)

# lambda函数
nums.sort(key=lambda item: item % 10)
print(nums)  # [100, 61, 52, 58, 39]

将学生按成绩从大到小进行排序

students = [
    {'name': '大黄', 'age': 16, 'score': 78},
    {'name': '大毛', 'age': 21, 'score': 68},
    {'name': '大白', 'age': 18, 'score': 76},
    {'name': '大龟', 'age': 26, 'score': 98},
]

# 按成绩从大到小排序
students.sort(key=lambda item: item['age'])
print(students)

# 按年龄和分数的和从小到大排序
students.sort(key=lambda item: item['age'] + item['score'], reverse=False)
print(students)

max、min默认是直接比较序列元素的大小求出最大值和最小值

nums = [100, 39, 61, 52, 58]
max1 = max(nums)
print(max1)

# 求nums个位数最大元素
max2 = max(nums, key=lambda item: item % 10)
print(max2)

students = [
    {'name': '大黄', 'age': 16, 'score': 78},
    {'name': '大毛', 'age': 21, 'score': 68},
    {'name': '大白', 'age': 18, 'score': 76},
    {'name': '大龟', 'age': 26, 'score': 98},
]
# 求年龄最大的学生
print(max(students, key=lambda item: item['age']))

 3)max函数的原理(作为了解)

def yyd_max(seq, key=None):
    yd_seq = list(seq)
    yd_max = yd_seq[0]
    if not key:
        for item in yd_seq[1:]:
            if item > yd_max:
                yd_max = item
    else:
        for item in yd_seq[1:]:
            if key(item) > key(yd_max):
                yd_max = item
    return yd_max


max1 = yyd_max((10, 21, 23, 12))
print(max1)
max2 = yyd_max((18, 21, 23, 12), key=lambda item: item % 10)
print(max2)

1.4、返回值高阶函数
  • 函数作为函数的返回值 -- 返回值高阶函数
 1)变量可以作为函数的返回值
def yyd_sum(x, y):
    t = x + y  # q0 + 20 = 30
    return t  # return 30


print(yyd_sum(10, 20))

func1就是一个返回值高阶函数

def func1():
    def func2():
        print('函数2')

    return func2


print(func1())  # <function func1.<locals>.func2 at 0x038247C8>
print(func1()())  # func1() = func2  -->  func2() --> None
 2)闭包
  • 函数1中声明了一个函数2,,并且在函数2中使用了函数1的值,那么这个函数1就是闭包
  • 闭包的特点:闭包函数中的数据不会因为函数调用结束而销毁
def func3():
    a = 10

    def func4():
        print(a)    # 10

    return func4


t = func3()

t()

面试题1:函数中在声明的时候不会执行函数体(考点)

list1 = []
for i in range(5):
    # def test(x):
    #     return x * i
    # test(x)
    list1.append(lambda x: x * i)

print(list1[1](2), list1[2](2), list1[3](2))  # 8 8 8

# 步骤分析
i = 0,1,2,3,4
i = 0;  list1 = [lambda x: x*i]
i = 1;  list1 = [lambda x: x*i, lambda x: x*i]
i = 2;  list1 = [lambda x: x*i, lambda x: x*i, lambda x: x*i]
i = 3;  list1 = [lambda x: x*i, lambda x: x*i, lambda x: x*i, lambda x: x*i]
i = 4;  list1 = [lambda x: x*i, lambda x: x*i, lambda x: x*i, lambda x: x*i, lambda x: x*i]

list1[1](2)  -->  i = 4, x = 2;

面试题2:不传参使用默认值(考点)

def func2(seq=[]):
    seq.append(10)
    return seq


print(func2())  # [10]
print(func2())  # [10, 10]

面试题3:写出打印结果

list1 = [1, 2]
def func3(seq=list1):
    seq.append(10)
    return seq

func3()

# 第一种情况
list1 = [11, 12]
print(func3())  # [1, 2, 10, 10]

# 第二种情况
# list1.append(100)
# print(func3())  # [1, 2, 10, 100, 10]

相关文章

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • 11.Lambda和高阶函数(Lambda and Higher

    高阶函数 kotlin_Lambda,高阶函数 *swift_高阶函数

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

  • 四、函数进阶

    一. 高阶函数 参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数。 常见的高阶函数 高阶函数的调用 二....

  • Kotlin 高阶函数

    什么是高阶函数 将函数作为参数或者返回值的,称高阶函数。 定义高阶函数 action是一个高阶函数,(Int) -...

  • 高阶组件

    高阶组件 先来引入这个概念 高阶函数是什么? 高阶函数就是一个函数返回一个函数eg: 高阶组件 类同 高阶组件就是...

  • [JS函数] (Array)の高阶函数

    JS函数 高阶函数 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScr...

  • HOC - High Order Component 高阶组件

    高阶函数 简而言之,可以接收函数作为参数的函数就是一个高阶函数。 上面的hoc函数就是一个高阶函数。 高阶组件 高...

  • Kotlin 函数式编程思想 FP in Kotlin

    Kotlin 函数式编程思想 : FP in Kotlin 函数式编程特性 闭包和高阶函数 函数编程支持函数作为第...

  • Day10. 高阶组件

    1. 认识高阶函数 什么是高阶组件呢?认识高阶函数.png 高阶函数: 接收一个或多个函数作为输入, 输出一个函数...

网友评论

      本文标题:第011篇:高阶函数

      本文链接:https://www.haomeiwen.com/subject/jnpbictx.html