zoukankan      html  css  js  c++  java
  • Python_高级特性

    Python高级特性

    author:lxy


    切片、迭代、列表生成式、生成器


    切片
    Python中 代码越少越简单越好,

    当要取一个list中的某一部分的元素时我们可以使用判断+循环实现,但是这略显繁琐,在Python提供了专门的方法切片


    slice切片,用来获取list中某一段元素

    tuple、str等都可以看做是一种list,使用切片获取的片段还是他们原来相应的类型

    例1、对list进行切片
    1. >>> n = [1,3,2,5,6,8]
    2. >>> n[0:3] #不含尾
    3. [1, 3, 2]                        
    4. >>> n[-2:] #可以使用倒序的方式截取
    5. [6, 8]
    6. >>>
    复制代码

    例2、对tuple进行切片
    1. >>> t = ('a','s','d','d')
    2. >>> t[:3]                        #默认从0开始截取
    3. ('a', 's', 'd')                #tuple切片后还是tuple
    4. >>>
    复制代码

    例3、对str进行切片
    1. >>> s = 'dfsafsf'
    2. >>> s[:3]
    3. 'dfs'                                #字符串切片后还是字符串
    4. >>>                                 #在Python中没有专门对字符串截取操作的函数,只要使用切片就可以完成
    复制代码



    迭代
    通过for循环遍历可迭代的对象,称为迭代。
    在c或Java中迭代list等是通过下标来完成的。
    虽然list这样的对象是有下标的我们可以完成迭代,但是dict、str等是没有下标的通过for...in一样可以完成迭代
    通过itervalues()可以迭代dict的v
    通过iteritems()可以迭代dict的k_V

    如何判断一个对象是否可迭代
    通过collections模块的iterable类型判断

    例:
    1. >>> from collections import Iterable #获取collections模块的Iterable类型
    2. >>> isinstance('dfdas',Iterable) #判断是否可迭代
    3. True
    4. >>> isinstance(555,Iterable)
    5. False
    6. >>>
    复制代码



    在Python中实现下标循环,Python内置的enumerate函数可以把一个list变成--索引——元素
    例:
    1. >>> for i,v in enumerate(('s','d','g')):
    2.         print(i,v)
    3. 0 s
    4. 1 d
    5. 2 g
    6. >>>
    复制代码


    列表生成式
    range()
    1、通过range()生成一个连续的整数序列
    2、通过--<表达式> <for循环> --产生列表


    例1、生成一个整数序列
    1. >>> a = range(3)
    2. >>> for i in a:
    3.         print(i)
    4. 0
    5. 1
    6. 2
    7. >>>
    复制代码


    例2、生成特殊的数量
    1. >>> c = [x*x for x in range(2,5)]
    2. >>> c
    3. [4, 9, 16]
    4. >>>
    复制代码


    列表生成中加if、嵌套
    使用if进行过滤
    例、
    1. >>> a = [x*x for x in range(5) if x>2] #加入if对x进行条件过滤
    2. >>> a
    3. [9, 16]
    4. >>>
    复制代码


    例、
    1. >>> [m+n for m in 'abc' for n in 'xyz']
    2. ['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
    3. >>>
    复制代码


    例:使用列表生成式,列出当前目录下所有的文件夹和目录名
    1. >>> import os                                                #导入os模块
    2. >>> [d for d in os.listdir('.')]        #括号内为指定的路径
    3. ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
    4. >>>
    复制代码


    生成器Generator
    但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
    Python提供了这一解决方案,列表元素通过某种算法推算出,在循环的过程中不断推算出后续元素,而不必创建完整的list
    Python保存的是算法,每次调用next()


    创建generator
    1、把列表生成式的[]改成()
    2、在一个普通函数中添加了yield关键字之后,这个函数就不在是一个普通函数,而是一个generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回yield语句处继续执行。

    例1、
    1. >>> b = (x for x in range(10))
    2. >>> b
    3. <generator object <genexpr> at 0x02CB1418>
    4. >>> next(b)                #获取下一元素,由于generator也是可迭代的一般使用for循环进行迭代
    5. 0                
    6. >>>       
    复制代码


    例2、
    1. >>> def f():
    2.         print('s1')
    3.         yield 1
    4.         print('s2')
    5.         yield 2

    6. >>> a = f()
    7. >>> next(a)
    8. s1
    9. 1
    10. >>> next(a)
    11. s2
    12. 2
    13. >>> next(a)
    14. Traceback (most recent call last):
    15.   File "<pyshell#11>", line 1, in <module>
    16.     next(a)
    17. StopIteration                #当没有yield可以执行的时候抛出错误
    18. >>>
    复制代码


    对于函数改造得到的generator,在遇到return或者函数体完成就结束了generator的指令,

    例:
    1. >>> def f():
    2.         print('s1')
    3.         yield 1
    4.         return
    5.         print('s2')
    6.         yield 2

    7. >>> for i in f():
    8.         print(i)

    9.         
    10. s1
    11. 1
    12. >>> >>> def f():
    13.         print('s1')
    14.         yield 1
    15.         return
    16.         print('s2')
    17.         yield 2

    18. >>> for i in f():
    19.         print(i)

    20. s1
    21. 1
    22. >>>
    复制代码


    来自群组: Java用户组
    用心-细心-专心-决心 学习就像爬大山,一步一步向前走 -态度决定高度-
  • 相关阅读:
    P2009 跑步
    P3916 图的遍历
    P2865 [USACO06NOV]路障Roadblocks
    P2820 局域网
    P2176 [USACO14FEB]路障Roadblock
    讨伐!数论
    网络流入门——EK算法
    最被低估的特质
    我的天哪我有博客了!
    Area POJ
  • 原文地址:https://www.cnblogs.com/xianyou-liang/p/8503342.html
Copyright © 2011-2022 走看看