zoukankan      html  css  js  c++  java
  • 第六章:函数与函数式编程——参考手册笔记

    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
    执行表达式字符串,返回结果
    在调用者命名空间执行
    接手可选的映射对象,分别作为:全局,局部命名空间
    缺省:当前值

  • 相关阅读:
    2021NUAA暑假集训 Day3 题解
    2021NUAA暑假集训 Day2 题解
    2021NUAA暑期模拟赛部分题解
    CodeForces 1038D Slime
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 10689 Yet another Number Sequence
    HDU 4549 M斐波那契数列
    HDU 4990 Reading comprehension
    CodeForces 450B Jzzhu and Sequences
  • 原文地址:https://www.cnblogs.com/qmcj/p/9108199.html
Copyright © 2011-2022 走看看