zoukankan      html  css  js  c++  java
  • python初步学习-生成式、生成器、迭代器、装饰器

    生成式

    • 列表生成式
    • 字典生成式
    • 集合生成式
    • 嵌套列表生成式

    列表生成式

    列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理。语法格式为:

    [exp for val in collection if condition]
    

    看几个例子:

    1、将列表中的字符串转换为小写组成一个新的列表

    L = ['HELLO','WORLD']
    print [s.lower() for s in L if isinstance(s,str)]
    
    运行结果:['hello','world']
    

    2、获取1-20中的奇数

    L = [x for x in range(20) if x%2 == 1]
    print L
    
    运行结果:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
    

    字典生成式

    字典生成式基本格式如下:

    {key-exp:val-exp for value in collection if condition}
    

    例如:

    print {i:i*10 for i in range(1,10) if(i%2==0)}
    
    运行结果为: {8: 80, 2: 20, 4: 40, 6: 60}
    

    集合生成式

    集合生成式格式和列表生成式类似,只不过用的是大括号:

    {exp for value in collection if condition}
    

    例如:统计列表中字符串元素的各种长度。

    L=['Hello',10,'World',None,'aa']
    print {len(x) for x in L if isinstance(x,str)}
    
    运行结果: set([2, 5])
    

    嵌套列表生成式

    嵌套列表生成式要注意for循环的顺序。
    例如:我们想提取由两个列表组成的嵌套列表中,含有a的字符串:

    L1=[['Cathy','Li'],['Zhang','Wang','Mike','Tom','Jack']]
    print [name for list in L1 for name in list  if name.count('a')>0]
    
    运行结果: ['Cathy', 'Zhang', 'Wang', 'Jack']
    

    我们还可以将嵌套列表中的数据进行扁平化展现,例如:

    L2=[(1,3,5),(2,4,6),(100,200)]
    print [value for t in L2 for value in t]
    
    运行结果: [1, 3, 5, 2, 4, 6, 100, 200]
    

    生成器

    在Python中,有一种自定义迭代器的方式,称为生成器(Generator)。
    generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
    定义生成器的两种方式:

    1.创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator:

    g=(x for x in range(1,10))
    print g.next()
    
    

    2、定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

    #!/usr/bin/env python
    #coding:utf8
    
    def fun1(n):
        for x in range(n):
            yield x
    
    print fun1(5)   #结果为<generator object fun1 at 0x7f50de2e9730>
    for y in func1(5):
        print y
    #结果为:
    0
    1
    2
    3
    4
    5
    

    生成器和普通函数区别:

    • 通函数是顺序执行,遇到return语句或者最后一行函数语句就返回;
    • 而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    迭代器

    __iter__就是对象的一个特殊方法,它是迭代规则(iterator potocol)的基础。或者说,对象如果没有它,就不能返回迭代器,就没有next()方法,就不能迭代。
    提醒注意,如果读者用的是python3.x,迭代器对象实现的是__next__()方法,不是next()。并且,在python3.x中有一个内建函数next(),可以实现next(it),访问迭代器,这相当于于python2.x中的it.next()(it是迭代对象)。

    装饰器(待补充)

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

    概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能。

  • 相关阅读:
    MySQL根据逗号将一行数据拆成多行数据
    pyhon实现excel的转置
    python批量加入数据库
    jieba词频统计
    python 求顾客相邻两次购买周期
    mysql求取最后两次价格上涨趋势
    mysql求每一个顾客购买商品的相邻时间间隔
    利用Python从一个数据库中查询结果插入到另一个数据库中
    电商项目数据分析
    线程的两种调用方式
  • 原文地址:https://www.cnblogs.com/pingqiang/p/7781146.html
Copyright © 2011-2022 走看看