zoukankan      html  css  js  c++  java
  • Python

    Python 中的函数是第一类对象

    • 好像很多地方都会看到这样一句话
    • Python 创始人也说过,所有的对象都是第一类对象

    什么是第一类对象

    • 在上面中所说的第一类对象,其实是指函数作为一个对象,与其它对象具有相同的地位
    • 具体来说,数值可以被赋值给变量、作为参数传递给函数、作为返回值
    • 因为函数和数值具有相同的地位,所以函数也可以被赋值给变量、作为参数传递给函数、作为返回值

    将对象赋值给变量

    可以将数值、字符串、列表、字典类型的对象赋值给变量

    number = 123
    string = "hello"
    list = [1, 2, 3]
    dict = {'name': 'tom', 'age': 12}

    将对象作为参数传递

    可以将数值、字符串、列表、字典类型的对象作为参数传递给函数

    print(123)
    print("hello")
    print([1, 2, 3])
    print({'name': 'tom', 'age': 12})

    将对象用作返回值

    可以将数值、字符串、列表、字典类型的对象作为函数的返回值

    def return_number():
        return 123
    
    def return_string():
        return "hello"
    
    def return_list():
        return [1, 2, 3]    
    
    def return_dict():    
        return {'name': 'tom', 'age': 12}

    将函数作为第一类对象

    将函数作为第一类对象,函数具有和数值、字符串、列表、字典等类型的对象具有相同的地位

    将函数赋值给变量

    def max(a, b):
        if a > b:
            return a
        else:
            return b
    
    
    var = max
    print(var(1, 2))
    
    
    # 输出结果
    2

    将函数作为参数传递

    def func():
        print("function")
    
    
    def pass_func(data):
        print("pass func")
        data()
    
    
    pass_func(func)
    
    
    # 输出结果
    pass func
    function

    将函数作为返回值

    def func():
        print("function")
    
    
    def return_func():
        print("pass func")
        return func
    
    
    # 等价 var = func
    var = return_func()
    var()

    将函数作为第一类对象的意义

    将函数作为第一类对象,是一种重要的抽象机制,极大的提升了程序的灵活性

    实战栗子

    • 存在一个列表 [1, -1, 2, -2, 3, -3]
    • 打印输出列表中的正数
    • 打印输出列表中的负数

    包含重复性代码的解决方法

    代码结构完全相同,只是条件判断不同

    # 重复性代码解决方法
    list = [1, -1, 2, -2, 3, -3]
    
    
    def print_positive(list):
        for item in list:
            if item > 0:
                print(item)
    
    
    def print_negative(list):
        for item in list:
            if item < 0:
                print(item)
    
    
    print_positive(list)
    print_negative(list)
    
    
    # 输出结果
    1
    2
    3
    -1
    -2
    -3

    将函数作为参数传递

    # 重复性代码解决方法
    list = [1, -1, 2, -2, 3, -3]
    
    def positive(x):
        return x > 0
    
    
    def negative(x):
        return x < 0
    
    
    def test(list, select_fun):
        for item in list:
            if select_fun(item):
                print(item)
    
    
    test(list, positive)
    test(list, negative)
    
    
    # 输出结果
    1
    2
    3
    -1
    -2
    -3

    匿名函数 lambda

    为什么有 lambda 匿名函数

    • 在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便
    • Python 提供了 lambda 表达式对匿名函数提供支持

    lambda 表达式的语法

    lambda args: expression

    expression 只允许是一条表达式,所以使用很受限  

    lambda 表达式小栗子

    lambda x:x>2

    等价函数写法

    def select_positive(x):
        return x > 0

    使用 lambda 表达式重写上面的将函数作为参数传递

    def test(list, select_fun):
        for item in list:
            if select_fun(item):
                print(item)
    
    
    list = [1, -1, 2, -2, 3, -3]
    
    test(list, lambda x: x > 0)
    test(list, lambda x: x < 0)
    
    
    # 输出结果
    1
    2
    3
    -1
    -2
    -3

    map 函数

    使用 Python 内置的 map 函数时,通常会用到 lambda 表达式 

    函数语法

    map(function, list)
    • map 函数接收两个参数 function 和 list
    • function 是一个函数,list 是一个可以被遍历的序列
    • map 将传入的函数依次作用到序列的每个元素,并把结果作为新的序列返回

    map 函数原理

    • 图的左边是一个序列 list,包含 3 个元素 1、2、3
    • 调用函数 map 时,需要提供一个函数 y = f (x),函数 f 将输入 x 映射为输出 y
    • 将函数 f 对图的左边的序列中的每个元素依次作用,得到图的右边的序列
    • 图的右边是一个序列 list,包含 3 个元素 f (1)、f (2)、f (3)

    非 lambda 的写法

    list = [1, 2, 3]
    
    
    def test(x):
        x += 5
        return x
    
    
    list1 = map(test, list)
    for i in list1:
        print(i)
    
    
    # 输出结果
    6
    7
    8

    lambda 的写法

    list = [1, 2, 3]
    
    list1 = map(lambda x: x + 5, list)
    for i in list1:
        print(i)
    
    
    # 输出结果
    6
    7
    8

    lambda 表达式栗子一:将 lambda 赋值给变量

    • 将 lambda 表达式赋值给一个变量
    • 这样调用这个变量,相当于调用了一个函数
    f = lambda a, b: a if a > b else b
    print(f(1, 2))
    
    
    # 输出结果
    2
    
    
    # lambda 表达式等价写法
    def test(a, b):
        if a > b:
            return a
        else:
            return b

    lambda 表达式栗子二:将 lambda 作为函数参数传递

    f = lambda x: x if x > 0 else 0
    
    
    def test(f, x):
        if f(x):
            print("正数")
        else:
            print("负数")
    
    
    test(f, 1)
    test(f, -1)
    
    
    # 输出结果
    正数
    负数
    
    
    # lambda 表达式等价写法
    def func(x):
        if x > 0:
            return x
        else:
            return 0

    lambda 表达式栗子三:将 lambda 作为函数返回值

    f = lambda a, b, c: a * b * c
    
    
    def test(a, b, c):
        a += 1
        b += 2
        c += 3
        return f(a, b, c)
    
    
    print(test(1, 2, 3))
    
    
    # 输出结果
    48
    
    
    # 等价写法
    def test(a, b, c):
        return a * b * c

    Python 内置函数接受函数作为参数

    • filter(function, iterable):用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
    • sorted(iterable, cmp=None, key=None, reverse=False):对所有可迭代的对象进行排序操作
    • map(function, iterable, ...):根据提供的函数对指定序列做映射
    • reduce(function, iterable[, initializer]):会对参数序列中元素进行累积

    后面再详说这些函数

    总结

    lambda 表达式常用场景:当某些功能代码只用一次的时候,可以用 lambda 代替
     
  • 相关阅读:
    poj2248
    poj2249
    poj2255
    电脑族每天必喝的四杯茶
    如何获得每一行的ROWID
    网上勾引MM定义大全
    A Forever Friend (永远的朋友)
    生活中的经典感人语句
    经理人必看的10个管理网站
    男人必须明白的22个道理
  • 原文地址:https://www.cnblogs.com/poloyy/p/15111410.html
Copyright © 2011-2022 走看看