• 《Python 学习手册4th》 第十九章 函数的高级话题


    '''
    时间: 9月5日 - 9月30日
    要求:
    1. 书本内容总结归纳,整理在博客园笔记上传
    2. 完成所有课后习题
    注:“#” 后加的是备注内容
    (每天看42页内容,可以保证月底看完此书)
    “重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题、习题题目- 加粗,16px
    '''

    重点笔记

    一. 函数设计概念

    • 耦合性: 对于输入使用参数并且对于输出使用return语句  1
    • 耦合性: 只有在真正必要的情况下使用全局变量
    • 耦合性: 不要改变可变类型的参数,除非调用者希望这样做
    • 聚合性: 每一个函数都应该有一个单一的、统一的目标
    • 大小:    每一个函数应该相对较小
    • 耦合:    避免直接改变在另一个模块文件中的变量

    (注:耦合性 也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。)

    二. 递归函数

      递归可以要求遍历任意形状的结构。

      

    def sumtree(L):
        total = 0
        for x in L:
            if not isinstance(x,list):
                total += x
            else:
                total += sumtree(x)
        return total
    L = [1,[1,[2,3],4],5]
    print(sumtree(L))

    注:

    isinstance(object, classinfo)
    如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。

    三. 匿名函数:lambda

      lambda表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给了一个变量名。

    • lambda 是一个表达式,而不是一个语句
    • lambda 的主体是一个单个的表达式,而不是一个代码块

      除了这些,def和lambda都能够做同样种类的工作。

    四. 为什么使用lambda

      lambda起到了函数速写的作用,允许在使用的代码内嵌入一个函数的定义。

    五. 在序列中映射函数: map

      map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。

      

    >>> l = [1,2,3]
    >>> def add(x): return x + 10
    
    >>> list(map(add,l))
    [11, 12, 13]

      由于map期待传入一个函数,它恰好是lambda通常出现的地方之一:

    >>> list(map(lambda x : x+10,l))
    [11, 12, 13]
    >>> list(map(pow,[1,2,3],[1,2,3]))
    [1, 4, 27]

    六. 函数式编程工具: filter 和reduce

      map函数是用来进行函数式编程的这类工具中最简单的内置函数代表: 函数式编程的意思就是对序列应用一些函数的工具。

    >>> list(filter((lambda x :x > 0), range(-5,5)))#return great more zero
    [1, 2, 3, 4]

      reduce

    >>> from functools import reduce
    >>> reduce((lambda x,y : x+y),[1,2,3,4,5])
    15

      此外,内置的reduce还允许一个可选的第三个参数置于序列的各项之前,从而当序列为空时充当一个默认的结果。

    >>> import operator,functools
    >>> functools.reduce(operator.add,[2,12,5])
    19

     


    本章习题:

    1. lambda表达式和def语句有什么关系?

    答:lambda和def都会创建函数对象,以便稍后调用。但是,lambda是表达式,可以嵌入函数定义的def语法上无法出现的地方。

      lambda的使用,总是可以用def来替代,并且通过变量名来引用函数。

      语法上来看,lambda只允许单个返回值表达式,因为它不支持代码块,不适用于较大的函数。

    2. 使用lambda的要点是什么?

    答:lambda允许“内联”小单元可执行代码,推迟其执行,并且以默认参数和封闭作用域变量的形式为其提供状态。lambda不是必须的,总是可以被def替代。它通常出现在GUI这样的基于回调的程序中,并且它们与map和filter这些期待一个处理函数的函数工具密切相关。

    3. 比较和对比map、filter和reduce

    答:map把每一项传递给函数并收集结果

      filter收集那些函数返回一个True值的项

      reduce 通过对一个累加器和后续项应用函数来计算一个单个的值。

    4. 什么是函数注解,如何使用它们?

    答:Python为声明注解提供了特殊的语法,但是,它本身不做任何事情,注解完全是可选的,并且出现的时候只是直接附加到函数对象__annotations__属性以供其他用户使用。

    5. 什么是递归函数,如何使用它们?

    答:递归函数调用本身可以直接地或间接地进行,从而实现循环。它们可以用来遍历任意形状的结构,但是,也可以用来进行一般性迭代。

    6. 编写函数的通用设计规则是什么?

    答:函数通常应该较小,尽可能自包含,拥有单一的,统一的用途,并且与输入参数和返回值等其他部分通信。 

  • 相关阅读:
    16解释器模式Interpreter
    15适配器模式Adapter
    14桥接模式Bridge
    13组合模式Composite
    12外观模式Facade
    11代理模式Proxy
    10享元模式Flyweight
    09观察者模式ObServer
    08策略模式Strategy
    07装饰模式Decorator
  • 原文地址:https://www.cnblogs.com/wuzhiming/p/3981560.html
Copyright © 2020-2023  润新知