第011篇:高阶函数

2019-11-18  本文已影响0人  yydafx

1、高阶函数

函数即变量

1.1、函数作为变量

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

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)系统的实参高阶函数
nums = [12, 32, 23, 34]
nums.sort(reverse=True)  # [34, 32, 23, 12]
print(nums)

 a、排序方法:参数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)闭包
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]
上一篇 下一篇

猜你喜欢

热点阅读