• 第六章:函数与函数式编程——参考手册笔记


    6.1函数

    python简化函数定义过程
    作用域规则,闭包,装饰器,生成器,协程:函数式编程特性
    列表推导,生成器表达式:声明式编程与数据处理的工具

    def定义函数

    调用时参数的顺序数量匹配:位置参数
    定义时指定默认值,则参数可选

    默认参数值:定义时作为传入的对象,定义时复制一次
    不可变对象:默认参数调用间保持一致
    可变对象:调用间保留之前的修改。声明为None

    只完成一次赋值?赋值发生在定义处?调用处?

    函数参数是局部变量,静态分配默认值:用于初始化赋值

    可变数目参数*args

    关键字参数调用时指定参数名

    位置参数,关键字参数,可变长位置参数,关键字字典

    **kargs传递关键字参数字典

    可变长参数通常用于编写其他函数的包装器与代理


    6.2参数传递与返回值


    函数参数按复制传递?
    不同于按值传入或按引用传入


    不可变对象:按值
    可变对象:按引用

    修改了输入值:副作用

    return 缺省,返回None

    6.3作用域规则

    执行函数时,创建新的局部命名空间

    变量被赋值时,变量始终被绑定在该函数的局部命名空间

    global:声明变量属于全局空间(导入)

    #####同条语句出现的相同名字只能是同一变量:不能突然改变作用域

    嵌套函数中的变量:静态作用域限定

    python3 nonlocal,把变量绑定到外层嵌套的局部变量,依然是静态作用域

    局部变量没赋值:unbondingLocalError

    6.4 作为对象与闭包的函数

    作为数据处理时,隐式携带定义函数时的环境信息(深约束?)
    x
    def fun

    函数中出现变量:向外层搜索局部——全局——内置

    fun,可使用x,且优先级高,类似于静态变量(可访问性不一样)

    定义时环境,调用时环境,优先级

    闭包:代码地址与其执行环境(定义处环境)打包

    .__globals__

    .__closure__
    执行环境是定义处作用域,访问至全局空间

    使用嵌套函数时,闭包捕捉内部函数执行所需的整个环境

    用于惰性求值,延迟求值

    嵌套函数:定义时参数缺省

    调用时绑定参数,返回可调用对象(参数作为环境的一部分:缺省——得到)

    闭包:传递不同的调用对象

    传参——执行环境完整——可调用

    不同环境不同闭包不同对象

    一系列函数调用中保持某个值:静态变量

    对嵌套函数传参定制不同的可调用对象


    闭包作为函数的定制化(缺省一部分引用环境:参数提供)
    闭包作为静态变量的实现(函数内部保持环境,keep)


    闭包捕捉内部函数的环境,可用于包装现有函数添加额外功能


    6.5装饰器

    一个函数,用于包装另一个函数(方法)或类
    修改或增强对象的行为
    @

    定义为闭包,嵌套在要修饰函数外层
    def 装饰器(real)
    def fun
    强化函数real
    return real处理后

    return fun

    类装饰器返回类

    6.6生成器与yield

    生成器函数对象,yield

    yield关键字定义生成器函数
    生成值的序列,以便在迭代时使用

    调用函数,返回生成器函数对象
    __next__(调用)执行函数,直到yield
    用于消耗序列的操作,要求迭代器对象的操作?

    StopIteration异常标志迭代结束

    部分消耗:close()方法

    6.7协程与yield表达式

    协程:函数,使用yield表达式,出现在运算符右边
    向函数发送值时执行
    生成器对象.send(数据)

    r=receiver()

    r.send("")

    r.close()

    close在生成器/协程内部生成GeneratorExit异常

    如果yield表达式中提供了值,协程可使用yield语句同时接收/发送值

    6.8使用生成器与协程

    生成器模拟管道,内存占用小

    协程反向管道,编写数据流处理程序,嵌套连接协程,进而实现并发


    6.9列表推导
    列表——操作——新列表
    [expression for item in iterable if condition
    item in iterable if condition]
    表达式构造出的元组必须加()去歧义
    在当前作用域求值,保留修改
    py3迭代变量为私有变量

    6.10生成器表达式()

    创建生成器对象,用于迭代操作
    提高性能,减少内存使用

    list(可迭代对象)——列表
    元组
    字典
    集合


    6.11声明式编程

    源自数学集合论
    声明式特性:程序组织为 一系列(可同时操作的)数据计算
    不关心循环的具体实现

    可用于模拟数据库操作

    6.12lambda运算符
    lambda语句:创建表达式形式的匿名函数
    lambda args : expression
    不能出现 多个语句或其他表达式语句

    用于指定短小的回调函数


    6.13递归
    不做尾递归优化
    不能用于生成器协程
    递归调用只会创建一个新的?生成器对象,不会实际迭代

    对递归程序使用装饰器:所有内部递归调用也装饰后进行
    装饰器用于系统管理时,少用递归


    6.14文档字符串
    装饰器包装函数破坏文档字符串
    @wraps

    6.15函数属性
    任意添加,在__dict__中
    @wraps

    6.16

    eval
    exec
    complie
    执行表达式字符串,返回结果
    在调用者命名空间执行
    接手可选的映射对象,分别作为:全局,局部命名空间
    缺省:当前值

  • 相关阅读:
    什么是PostBack(译)
    GridView 多余字符显示省略号,并在Tooltip中显示完整信息
    GridView中添加行单击事件.md
    ASP.NET WebForm 通过 PagedDataSource 实现 Repeater 的分页
    回发或回调参数无效(译)
    jQuery UI Autocomplete Combobox 配 ASP.NET DropDownList
    6个重要的.NET概念:
    ASP.NET 使用Session,避免用户F5刷新时重复提交(转)
    支持行单击、双击事件的GridView和DataList控件(译)
    在TextBox中敲击回车执行ASP.NET后台事件
  • 原文地址:https://www.cnblogs.com/qmcj/p/9108199.html
Copyright © 2020-2023  润新知