Python的高级特性之切片和迭代
1、切片
切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割。
数是可选的,而冒号是必须的
切片操作符中的第一个数(冒号之前)表示切片开始的位置,第二个数(冒号之后)表示切片到哪里结束,第三个数(冒号之后)表示切片间隔数。如果不指定第一个数,Python就从序列首开始。如果没有指定第二个数,则Python会停止在序列尾。注意,返回的序列从开始位置开始 ,刚好在 结束 位置之前结束。即开始位置是包含在序列切片中的,而结束位置被排斥在切片外
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import math
# ★★★★★切片Slice,适用于list,tuple,字符串★★★★★
# 构造一个列表L
L = []
n = 0
while n <= 30:
L.append(n)
n += 2
print u'列表:',L
# 取前N个元素,索引值0-(N-1)
r = []
N = 3
for n in range(N):
r.append(L[n])
print u'循环取前三个元素:',r
# 使用切片法,取list和tuple某范围内元素。L[m:n]表示从索引下标为m开始,取到索引下标为n-1
# 取前三个元素
rr = L[0:3]# 而且还能说明list切片的返回值是list
print u'切片取前三个元素:',rr
# 如果第一个索引是0,还可以省略
rr = L[0:3]
print u'切片取前三个元素:',rr
# 取后三个元素
rr = L[len(L)-3:len(L)]
print u'切片取后三个元素:',rr
# Python支持倒数取元素值,类似的,python也支持倒数切片
rr = L [0:-3]# 倒数第一个元素的索引为-1
print u'切片取除了后三个元素:',rr
# 如果一直取到最后,第二个参数可以省略
rr = L [-3:]
print u'切片取后三个元素:',rr
# 如果两个参数都省略,相当于复制list
rr = L [:]
print u'列表:',rr
# 也还可以有其他复杂的操作
# 前10个数,每两个取一个
rr = L[:10:2]
print u'前10个数,每两个取一个:',rr
# 所有数,每三个取一个
rr = L[::3]
print u'所有数,每三个取一个:',rr
# tuple与list唯一的区别就是tuple不可变,因此也可以对tuple进行切片操作,类似的,切片的结果是tuple
T = (1,2,3,4)
tt = T[-3:-1]
print tt
# 字符串'xxx'和u'xxx'可以看成是一种list,每个字符就是它的一个元素,然后可以对字符串进行切片操作,切片的结果仍是字符串
string = 'abcd'
ss = string[-3:-1]
print ss
运行效果:
2、迭代
先搞清楚几个概念:循环,迭代,递归,遍历
循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。
遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
迭代:就是通过for...in循环进行遍历
for...in循环不仅可以用在有索引下标值的list和tuple,也可以用在无索引下标值的dict,set,字符串等
for...in,in后面应是可迭代对象
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import math
from collections import Iterable
# 判断一个对象是否为可迭代对象的方法
# 导入collections模块的Iterable类型:from collections import Iterable
print isinstance([1,2,3],Iterable)#list
print isinstance((1,2,3),Iterable)#tuple
print isinstance({'k1':1,'k2':2,'k3':3},Iterable)#dict
print isinstance(set("abc"),Iterable)#set
print isinstance('abc',Iterable)#str
# 迭代list
#L = [1,2,3]
for i in [1,2,3]:
print u'list:',i
# 迭代tuple
T = (1,2,3)
for i in T:
print u'tuple:',i
# 迭代dict
D = {'k1':1,'k2':2,'k3':3}
for k in D:
print u'dict:',k
# 上例说明,默认迭代的是key
# 如果要迭代value,可以用for value in D.itervalues()
for v in D.itervalues():
print u'dict:',v
#如果要同时迭代key和value,可以用for k, v in d.iteritems()
for k,v in D.iteritems():
print u'dict:',k,':',v
# 迭代set
S = set("abc")
for s in S:
print u'set:',s
# 迭代str
SS = 'abc'
for ss in SS:
print u'str:',ss
# 对list实现利用下标进行循环
# 内置的enumerate()函数可以把list变成索引-元素对,这样就可以像其他语言那样同时迭代索引和元素
L = [1,2,3]
for i in enumerate(L):
print u'list:',i
# list: (0, 1)
# list: (1, 2)
# list: (2, 3)
# 事实证明enumerate()是把list变成了(索引,元素)这样的数据对,但是enumerate()返回的结果并不是数据对
for i,v in enumerate(L):
print u'list:',i,'-',v
# 推广:经常会用到对数据对的引用
# for...in,in后面应是可迭代对象
for x,y in [(0,'a'),(1,'b'),(2,'c')]:
print u'数据对:',x,'-',y
运行效果: