函数的高级特性

    2.Python函数是对象,自身存储在内存块中,它可以自由地传递与引用。

    • 函数对象支持一个特殊操作:有括号()以及参数列表执行调用行为
    • 我们可以通用地检查函数对象的某些属性:如.__name__属性、.__code__属性
    • 可以向函数对象附加任意的用户自定义属性,如func.count=0。这样的属性可以用来直接将状态信息附加到函数对象上
    • Python3中,可以给函数对象附加注解。注解不作任何事情,而且注解是可选的,它被附加在函数对象的.__annotaions__属性中。注解的格式为:

      • 当出现注解时,Python将它们收集到字典中并附加到.__annotations__属性中
      • 注解可以与默认值同时出现,此时形参形式为c:float=4.0
      • 注解只有在def中有效,在lambda表达式中无效

    3.匿名函数:lambda表达式
    表达式创建了一个函数对象,它返回该函数对象而不是将其赋值给一个变量名。
    创建lambda表达式的语法为:

    • lambda表达式是个表达式而不是语句,它能出现在不允许def出现的某些地方,比如参数中
    • lambda的主体是一个单一的表达式,而不是一个代码块。因此lambda通常比def功能简单

    • lambda主体中表达式的值就是调用时的返回值,不需要显式return
    • 表达式也能使用默认实参
    • lambda表达式主体中遵循def内一样的名字作用域查找法则
      lambda表达式

    4.出于可读性要求,最好不要嵌套使用lambda表达式

    6.Python是静态检测局部变量的:

    编译时,Python看到了赋值语句x=3,因此决定了在函数内的任何地方,x都是本地变量。但是print(x)时赋值语句并未发生,此时即使全局中有全局的x,也会报错。

    7.Python在内部会将每个默认实参保存成对应的对象,附加在这个函数本身。在不同的函数调用期间,这些默认实参会保存同一个对象。因此对于可变对象作为默认实参注意保持警惕。