高阶特性

python的高阶特性,包含切片、列表生成式、生成器、迭代器。   

切片

切片主要是序列的特性,序列(列表,元组,字符串)均可使用切片进行访问。

 
列表生成式

列表生成式是python内置的非常简单强大的可以用来创建list的生成式。
        如:[x * x for x in range(1,11)] #取平方
            [x * x for x in range(1,11) if x % 2 == 0] #筛选出偶数的平方
            [m + n for m in 'ABC' for n in 'XYZ'] #全排列
            import os
            [d for d in os.listdir('.')] #列出当前目录下的所有文件和目录
            
            d = {'x':'A', 'y':'B', 'z':'C'}
            [k + '=' + v for k,v in d.items()]
            
            L = ['Hello', 'World', 'IBM', 'Apple']
            [s.lower() for s in L]
     

       
生成器

创建一个generator,
        方法一:把一个列表生成式的[]改成(),就创建了一个generator。
                如:g = (x * x for x in range(10))
                generator保存的是算法,每次调用next(g),就计算出g的下一个元素值,直到计算到最后一个元素。
                然而,正常情况下,不会使用next()函数,而是使用for循环,因为generator也是可迭代对象。
        方法二:使用yield,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数了,而是一个generator。    
                如:斐波那契函数
                    def fib(max):
                        n,a,b = 0,0,1
                        while n < max:
                            print(b)
                            a, b = b, a+b
                            n = n + 1
                        return
                改变为一个生成器:
                    def fib(max):
                        n, a, b = 0, 0, 1
                        while n < max:
                            yield b
                            a, b = b, a+b
                            n = n + 1
                        return
        难点:generator和函数的执行流程是不一样的。函数是顺序执行的,遇到return语句或者最后一行函数语句就返回。
            而变成generator的函数之后,在每次调用next()的时候执行,遇到yield语句就返回,再次执行时从上次返回的yield语句处继续执行。
            
        同样,把函数改为generator后,基本上从来不用next()来获取下一个返回值,而是直接使用for循环来迭代。
        但是使用for循环调用generator之后,发现拿不到generator的return语句的返回值。如果想要获取返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。
        
        小结:generator是非常强大的工具,可以简单的把列表生成式改成generator,也可以通过函数来实现复杂逻辑的generator。
            要理解generator的原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
            注意区分普通函数和generator函数,普通函数调用直接返回结果,generator函数的调用实际返回一个generator对象。     

          
迭代器


        可直接作用于for循环的数据类型有以下几种:
            1、集合数据类型,如list、tuple、dict、set、str等。
            2、generator,包括生成器和带yield的generator function。
                这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
            可以使用isinstance()判断一个对象是否是Iterable对象。而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
            
            可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
            可以使用isinstance()判断一个对象是否是Iterator对象。
            
            from collections import Iterable
            from collections import Iterator
            
            生成器都是Iterator对象,但list,dict,str虽然是Iterable,却不是Iterator。
            把list,dict,str等Iterable变成Iterator可以使用iter()函数。
            
            Iterator对象是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时可以抛出StopIteration错误。
            
            Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
   

猜你喜欢

转载自my.oschina.net/u/3767248/blog/1795779