zoukankan      html  css  js  c++  java
  • python【5】-生成式,生成器

    一、条件和循环

    1. if语句

    if <条件判断1>:
        <执行1>
    elif <条件判断2>:
        <执行2>
    else:
        <执行4>

    例如:

    age=5
    if age>=18:
      print 'adult'
    elif age>=6:
      print 'teenager'
    else:
      print 'kid'

    一定要注意条件语句结尾的冒号,以及代码段的缩进。

    只要if参数是非零数值、非空字符串、非空list等,就判断为True,否则为False

    2.循环

    range(num):返回0到num-1之间的整数。例如:

    print range(5)
    
    >>>[0,1,2,3,4]

    for循环for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。

    s=0
    for i in range(101):
      s+=i
    print s

    while循环:只要条件满足,就不断循环,条件不满足时退出循环。

    i=1
    s=0
    
    while(i<=100):
      s=s+i
      i=i+1
    
    print s

    3.迭代

    dict类型for ..in ..迭代有以下几种方式:

    d={'a':1,'b':2,'c':3}

    默认迭代key

    for k in d:
        print k

    iterkeys()返回key迭代器

    for key in d.iterkeys():
        print key

    itervalues()返回value迭代器

    for value in d.itervalues():
        print value

    iteritems()返回键值对迭代器

    for key,value in d.iteritems():
        print key+"="+str(value)

    判断对象是否可迭代:通过collections模块的Iterable类型判断

    from collections import Iterable
    print isinstance(d,Iterable)

    带下标迭代:Python内置的enumerate函数可以把一个list变成索引-元素对

    l=range(5)
    for i,value in enumerate(l):
    
    print i,value

    二、生成式

    1.列表生成式

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

    [exp for val in collection if condition]

    相当于

    result=[]
    for val in collection:
        if(condition):
            result.append(exp)

    我们看个例子:将列表中的字符串转换为小写组成新的列表。

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

    2.字典生成式

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

    {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}

    3.集合生成式

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

    {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])

    4.嵌套列表生成式

    嵌套列表生成式要注意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)。

    定义生成器的两种方式:

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

    l=[x for x in range(1,10)]
    print l
    
    g=(x for x in range(1,10))
    print g.next()
    print g.next()
    
    for x in g:
        print x
    
    运行结果:
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    1
    2
    3
    4
    5
    6
    7
    8
    9

    generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

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

    def fib(n):
        a=1
        b=1
        i=0;
    
        yield a
        yield b
    
        while(i<n):
            a,b=b,a+b
            i+=1
            yield b
    
    for x in fib(10):
        print x
    
    运行结果:
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144

    生成器和普通函数区别:

    普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回;

    而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    def test():
        print 1
        yield
        print 2
        yield
        print 3
        yield
    
    t=test()
    t.next()#运行结果1
    t.next()#运行结果2
    t.next()#运行结果3

     如需转载,请标明原文链接:http://www.cnblogs.com/janes/

  • 相关阅读:
    3D打印技术大潮
    有用网址
    linux下scp命令详解
    使用 GDB 调试多进程程序
    linux下top命令参数解释
    Sql动态查询拼接字符串的优化
    vmstat参数详解
    freebsd破解密码
    freebsd防火墙
    freebsd无法输入汉字
  • 原文地址:https://www.cnblogs.com/janes/p/5530979.html
Copyright © 2011-2022 走看看