zoukankan      html  css  js  c++  java
  • 生成式,生成器,迭代器,装饰器

    列表生成式:可以对一组元素进行过滤,还可以对得到的元素进行转换处理;

    例子:a=[x*x for x in xrange(10) if x*x%2==0]

    列表生成器:最简单的办法,把原来的生成式的[]换成()就ok了;


    lt = (x*x for x in xrange(1,10) if x%2==0)
    print(type(lt))

    print(lt.next())

    for i in lt;
    print (i)

    生成式和生成器的区别:
    一个直接返回了表达式的结果列表,
    而另一个是一个对象,该对象包含了
    对表达式结果的计算引用,通过循环
    可以直接输出;
    生成器不会一次性列出所有的数据,
    当你用到的时候,在列出来,更加
    节约内存的使用率;

    yield语句:

    当函数被调用时,他们返回一个生成器对象,
    这个对象支持迭代器接口。每当遇到yield关键字
    的时候,你可以理解函数的return 语句,yield
    后面的值就是返回值,但是不像一般的函数在
    return后退出去,生成器函数在生成值后会
    自动挂起并暂停他们的执行和状态,他的本地变量
    将保存状态信息,这些信息在函数恢复时将再度
    有效;

    可迭代对象:可以通过循环调用出来的,就是可迭代的对象[],{},(),生成式;
    迭代器:生成器,必须通过next函数调用的;

    装饰器:其实就是一个以函数作为参数并返回一个替换函数的可执行函数;

    def outer(some_func):
    def inner():
    print "before some_func"
    ret = some_func()
    return ret + 1

    return inner


    def foo():
    return 1


    decorated = outer(foo)
    decorated()

    函数装饰器 @ 符号:

    @ wrapper
    def add(a, b):
    return Coordinate(a.x + b.x, a.y + b.y)

     调用wrapper函数来装饰add函数;

    练习题:用函数实现9*9乘法口诀
    def func(n):
    for i in xrange(1,n):
    yield " ".join(["{0}*{1}={2}".format(x,i,x*i) for x in xrange(1,i+1) ])
    for i in func(10):
    print i

  • 相关阅读:
    清北学堂2019NOIP提高储备营DAY1
    最小生成树--克鲁斯卡尔算法(Kruskal)
    关于队列(还有广度优先搜索的例题)
    染色问题
    行列式的相关知识
    素数筛法
    中国剩余定理(孙子定理)
    AOJ 9.University
    AOJ 8.童年生活二三事
    AOJ 7.Redraiment猜想
  • 原文地址:https://www.cnblogs.com/awenxianliao/p/7782205.html
Copyright © 2011-2022 走看看