Python高级特性
author:lxy

切片、迭代、列表生成式、生成器
切片
Python中 代码越少越简单越好,
我们要取一个list中的某一部分的元素的我们可以使用判断+循环实现,在Python提供了专门的方法--切片
slice切片,用来获取list中某一段元素
tuple、str等都看做是一种list只是使用切片获取的片段还是他们原来相应的类型
例1、对list进行切片
-
>>> n = [1,3,2,5,6,8]
-
>>> n[0:3] #不含尾
-
[1, 3, 2]
-
>>> n[-2:] #可以使用倒序的方式截取
-
[6, 8]
-
>>>
复制代码
例2、对tuple进行切片
-
>>> t = (‘a‘,‘s‘,‘d‘,‘d‘)
-
>>> t[:3] #默认从0开始截取
-
(‘a‘, ‘s‘, ‘d‘) #tuple切片后还是tuple
-
>>>
复制代码
例3、对str进行切片
-
>>> s = ‘dfsafsf‘
-
>>> s[:3]
-
‘dfs‘ #字符串切片后还是字符串
-
>>> #在Python中没有专门对字符串截取操作的函数,只要使用切片就可以完成
复制代码
迭代
通过for循环遍历可迭代的对象,称为迭代。
在c或Java中迭代list等是通过下标来完成的。
list这样的对象是有下标的我们可以完成迭代,而dict、str等是没有下标的通过Python的for...in一样可以完成迭代
通过itervalues()可以迭代dict的v
通过iteritems()可以迭代dict的k_V
如何判断一个对象是否可迭代
通过collections模块的iterable类型判断
例:
-
>>> from collections import Iterable #获取collections模块的Iterable类型
-
>>> isinstance(‘dfdas‘,Iterable) #判断是否可迭代
-
True
-
>>> isinstance(555,Iterable)
-
False
-
>>>
复制代码
在Python中实现下标循环,Python内置的enumerate函数可以把一个list变成 索引--元素
例:
-
>>> for i,v in enumerate((‘s‘,‘d‘,‘g‘)):
-
print(i,v)
-
0 s
-
1 d
-
2 g
-
>>>
复制代码
列表生成式
range() #
1、通过range()生成一个连续的整数序列
2、通过--<表达式> <for循环> --产生列表
例1、生成一个整数序列
-
>>> a = range(3)
-
>>> for i in a:
-
print(i)
-
0
-
1
-
2
-
>>>
复制代码
例2、生成特殊的数量
-
>>> c = [x*x for x in range(2,5)]
-
>>> c
-
[4, 9, 16]
-
>>>
复制代码
列表生成中加if、嵌套
使用if进行过滤
例、
-
>>> a = [x*x for x in range(5) if x>2] #加入if对x进行条件过滤
-
>>> a
-
[9, 16]
-
>>>
复制代码
例、
-
>>> [m+n for m in ‘abc‘ for n in ‘xyz‘]
-
[‘ax‘, ‘ay‘, ‘az‘, ‘bx‘, ‘by‘, ‘bz‘, ‘cx‘, ‘cy‘, ‘cz‘]
-
>>>
复制代码
例:使用列表生成式,列出当前目录下所有的文件夹和目录名
-
>>> import os #导入os模块
-
>>> [d for d in os.listdir(‘.‘)] #括号内为指定的路径
-
[‘DLLs‘, ‘Doc‘, ‘include‘, ‘Lib‘, ‘libs‘, ‘Scripts‘, ‘tcl‘, ‘Tools‘]
-
>>>
复制代码
生成器Generator
但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
Python提供了这一解决方案,列表元素通过某种算法推算出,在循环的过程中不断推算出后续元素,而不必创建完整的list
Python保存的是算法,每次调用next()
创建generator
1、把列表生成式的[]改成()
2、在一个普通函数中添加了yield关键字之后,这个函数就不在是一个普通函数,而是一个generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回yield语句处继续执行。
例1、
-
>>> b = (x for x in range(10))
-
>>> b
-
<generator object <genexpr> at 0x02CB1418>
-
>>> next(b) #获取下一元素,由于generator也是可迭代的一般使用for循环进行迭代
-
0
-
>>>
复制代码
例2、
-
>>> def f():
-
print(‘s1‘)
-
yield 1
-
print(‘s2‘)
-
yield 2
-
-
>>> a = f()
-
>>> next(a)
-
s1
-
1
-
>>> next(a)
-
s2
-
2
-
>>> next(a)
-
Traceback (most recent call last):
-
File "<pyshell#11>", line 1, in <module>
-
next(a)
-
StopIteration #当没有yield可以执行的时候抛出错误
-
>>>
复制代码
对于函数改造得到的generator,在遇到return或者函数体完成就结束了generator的指令,
例:
-
>>> def f():
-
print(‘s1‘)
-
yield 1
-
return
-
print(‘s2‘)
-
yield 2
-
-
>>> for i in f():
-
print(i)
-
-
-
s1
-
1
-
>>> >>> def f():
-
print(‘s1‘)
-
yield 1
-
return
-
print(‘s2‘)
-
yield 2
-
-
>>> for i in f():
-
print(i)
-
-
s1
-
1
-
>>>
复制代码
来自群组: Java用户组Python_高级特性
原文:http://blog.csdn.net/u013610441/article/details/39063571