博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高阶特性
阅读量:5873 次
发布时间:2019-06-19

本文共 2129 字,大约阅读时间需要 7 分钟。

hot3.png

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是永远不可能存储全体自然数的。
   

转载于:https://my.oschina.net/u/3767248/blog/1795779

你可能感兴趣的文章
MonoRail学习笔记七:页面交互的输入输出方式总结
查看>>
项目利益相关者
查看>>
android window.requestWindowFeature()常用方法
查看>>
【Javascript Demo】移动端访问PC端网页时跳转到对应的移动端网页
查看>>
走在网页游戏开发的路上(四)
查看>>
Linux内核【链表】整理笔记(2) 【转】
查看>>
android152 笔记 4
查看>>
全国各地电信DNS服务器地址
查看>>
jquery 拖动改变div 容器大小
查看>>
解决并清除SQL被注入<script>恶意病毒代码的语句
查看>>
Linux资源控制-CPU和内存
查看>>
对makefile中 $? 的理解
查看>>
HTML5 WebStorage
查看>>
TclError: no display name and no $DISPLAY environment variable
查看>>
Unity的AssetDatabase路径格式
查看>>
jrebel使用
查看>>
JavaScript prototype 属性
查看>>
RedHat系统的Yum安装
查看>>
IntelliJ IDEA CE Maven 使用方法
查看>>
WCF开发的几个频骤
查看>>