欢迎来访...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Python_高级特性

Posted on 2014-09-04 23:47  天赐绝尘  阅读(145)  评论(0编辑  收藏  举报
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用户组