• Python学习笔记九:装饰器,生成器,迭代器


    装饰器

    本质是函数,装饰其他函数,为其他函数添加附加功能

    原则:

    1不修改原函数的源代码

    2不修改原函数的调用方式

    知识储备:

    1函数即变量

    使用门牌号的例子说明函数,调用方式与变量一致

    2高阶函数

    bar()

    bar(内存地址门牌号,指针)

    例子:在不修改源码的情况下附加功能,把一个函数当做实参传给另一个函数,返回值中包含函数名

    3嵌套函数

    在函数体中定义新函数,注意调用方式与作用域

    利用高阶函数和嵌套函数实现装饰器的效果

    几种情况,从简单到复杂:

    被装饰函数无参数

    被装饰函数多参数

    被装饰函数有返回值

    对于不同函数,采用不同认证方式:给装饰器传参

    匿名函数

    lambda

    calc = lambda x : x*3

    calc()

    生成器

    列表生成式:[i*2 for I in range(10)]

    使代码简洁

    一面循环一面计算的机制:generator

    1将列表生成式的[]改为()

    只有在调用时才会生成相应数据,只能循环顺序访问,不能切片随机访问,只记住当前位置

    2加yield声明

    例:斐波那契数列

    a, b = b, a+b 含义是tuple

    想返回哪个值就加yield声明,作用是中断,返回当前状态的值,可以在计算过程中加入其他动作

    使用__next(),next()调用

    捕获异常try

    生成器并行计算

    生产者、消费者模型

    yield:保存当前状态,返回,__next()返回此状态

    send(x):给yield传值

    单线程下的并行效果(协程)

    必须先__next执行

    迭代器

    可迭代对象:Iterable,from collections import Iterable

    isinstance([],Iterable)

    可以被next()调用并不断返回下一个值的对象称为迭代器Iterator

    from collections import Iterator

    list, dict, str等使用iter()转换为迭代器:iter([])

    迭代器的计算在需要返回下一个数据时才进行,3.0的for就是迭代器

    内置函数(查看文档全面学习)

    abs()

    all(iterable):全为真,返回True

    any(iterable):任意一个为真,返回True

    ascii(object):将一个对象转换成一个字符串的表现形式

    bin(x):将数字转换成二进制表现形式,例如:’0b011’

    bool([x]):判断真假

    bytearray(source, encoding, errors):可修改的二进制字节格式(实际是一个二进制列表?),必须使用ASCII赋值(以数字赋值)

    二进制格式以b开头

    a=bytes(“abcdef”,encoding=”utf-8”)

    b=bytearray(“abdef”,encoding=”utf-8”)

    print(b[0]):97

    b[0]=100

    print(b)

    bytes():创建二进制流

    callable([]):是否可调用,后面可以加括号的可调用

    chr(i):返回数字的ASCII对应字符

    ord(c):返回字符对应的ASCII数字

    classmethod(function):类方法

    compile(…):底层用于代码编译

    complex():复数

    delattr():面向对象用

    dict():生成一个默认字典{}

    dir(a):查看变量的方法

    divmod(a,b):返回商和余数

    enumerate()

    eval():字符串变为字典

    filter(func,iterable):与lambda结合使用,过滤出一组数据中想要的内容

    (lambda n: print(n))(5)

    或者

    calc = lambada n: print(n)

    calc(5)

    lambda n: 3 if n<4 else n

    res = filter(lambda n:n>5,range(10))

    for i in res:

      print(i)

    map:将列表的每一个值进行处理

    res = map(lambda: n: n*n,range(10))

    for i in res

      print(i)

    reduce:累计运算

    import functools

    res = functools.reduce(lambda x,y:x+y,range(10))

    print(res)

    float:

    format:

    frozeset([iterable]):创建不可变集合

    globlals():返回当前文件所有变量的键值对

    hash(object):将对象变成固定的映射关系,hash(‘alex’)

    hex(x):将数字转换为十六进制,0x开头

    id(object):返回内存地址

    locals():打印局部变量

    max([]),min([]):列表最大值最小值

    oct(x):转换为八进制,0c开头

    pow(x,y):x的y次方

    repr(object):用字符串表示对象

    reversed():反向排序

    round(x,y):截断还是四舍五入?

    slice(x,y):切片

    sorted(iterable[, key]):排序,sorted(a.items(), key = lambda x:x[1])按照value排序(a是一个字典(无序))

    vars([object]):返回对象中所有变量的列表

    zip():拼接两个列表

    __import__(name):只知道模块字符串格式时进行导入

  • 相关阅读:
    【转】 【技巧 】 数学难题大揭秘:减少计算错误的技术
    [转]Mathematical Induction --数学归纳法1
    Vector Calculus
    test latex1
    [转]架构蓝图--软件架构 "4+1" 视图模型
    What Is Mathematics?
    二项式展开
    游戏系统设计
    Golang游戏服务器与skynet的个人直观比较
    [转]透过 Linux 内核看无锁编程
  • 原文地址:https://www.cnblogs.com/koctr/p/7473895.html
Copyright © 2020-2023  润新知