Python 切片和迭代

  • 一、切片
  • 1.切片操作的使用方法
  • 3.切片操作的应用
  • 二、迭代
  • 1.与其他语言的不同
  • 2.迭代的具体使用
  • 2.1 如何判断一个对象是可迭代对象
  • 2.2 具体使用
  • 2.2.1 迭代 list
  • 2.2.2 迭代 tuple
  • 2.2.3迭代 dict
  • 2.2.4 迭代字符串


一、切片

切片是为了解决取取一个list或tuple的部分元素比较麻烦的问题。取一个list或tuple的部分元素是比较常见的操作。有两种方法可以做:

1.按照索引

2.循环

但是上述方法十分繁琐,且有局限性。因此,Python提供了切片(Slice)操作,来简化这种操作。

1.切片操作的使用方法

切片的规则如下:

L(m:n)m,n分别代表开始索引,结束索引。切片后的结果是索引m到索引n-1的值,不包括索引n的值。

·举个例子,假设有如下的一个 list:

>>> L=[1,2,3,4,5,6,7,'a','b','c']
>>> L
[1, 2, 3, 4, 5, 6, 7, 'a', 'b', 'c']

从第一个元素开始依次取3个元素:

>>> L[0:3]
[1, 2, 3]
>>> L[:3]
[1, 2, 3]
#可以看到如果起始值是0,0可以省略

如果要取这个列表中的[6, 7, ‘a’]应该怎么做呢?

>>> L[5:8]
[6, 7, 'a']

如果要取这个列表中的[6, 7, ‘a’, ‘b’, ‘c’]应该怎么做呢?

>>> L[5:10]
[6, 7, 'a', 'b', 'c']

到这里,我们发现一个规律:
切片操作的结束索引=切片操作的起始值+要取的元素的长度
上述两个操作可以写成:

>>> L[5:5+3]
[6, 7, 'a']
>>> L[5:5+10]
[6, 7, 'a', 'b', 'c']

在list操作中,支持L[-1]这样的操作,那么切片也同样支持。索引从-1开始。
比如:取倒数最后一个元素:

>>> L[-1]
'c'

取后面4个元素

>>> L[-4:]
[7, 'a', 'b', 'c']

3.切片操作的应用

先创建一个0-99的数列

>>> L=list(range(100))

取前10个数

>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

取后10位数

>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

取45-55的数字

>>> L[45:55]
[45, 46, 47, 48, 49, 50, 51, 52, 53, 54]

取十个数字,每两个取一个

>>> L[:10:2]
[0, 2, 4, 6, 8]

取所有的数字,每10个取一个

>>> L[::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

也可以什么都不写,复制一份List

>>> L[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

同样的,tuple 也可以用切片操作。字符串也可以看做是一个list,也可以用切片操作。在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。

二、迭代

1.与其他语言的不同

比如C或Java,迭代是通过下标完成的。要迭代的一定是同一种数据类型的集合。

比如:

for(int i =0; i<list.length;i++){
    n = list[i];
}

Python的优点:

  1. 只要作用于一个可迭代对象,for循环就可以正常运行,不必关心对象的数据类型,无论是都有下标,都可以迭代。
  2. 语法上Python的抽象程度更高,通过for…in来完成。

2.迭代的具体使用

2.1 如何判断一个对象是可迭代对象

通过collections模块的Iterable类型判断

>>> isinstance('abc',Iterable) #字符串是否可迭代
True
>>> isinstance(12721379,Iterable) #整数是否可迭代
False
>>> isinstance([1,2,3],Iterable) # list是否可迭代
True
>>> isinstance((1,2,3),Iteable) # tuple是否可迭代
True
>>> isinstance({'Michael': 95, 'Bob': 75, 'Tracy': 85},Iterable) # dict是否可迭代
True

注意:这个方法必须有两个参数,否则会报错

>>> isinstance([1,2,3])
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    isinstance([1,2,3])
TypeError: isinstance expected 2 arguments, got 1

2.2 具体使用

2.2.1 迭代 list
>>> L=list(range(10))
>>> for i in L:
	    print(i)
# 执行结果	
0
1
2
3
4
5
6
7
8
9
2.2.2 迭代 tuple
>>> t =(1,2,3,4,5)
>>> for x in t:
	    print(t)

	
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)
>>> for x in t:
	    t[:2]

	
(1, 2)
(1, 2)
(1, 2)
(1, 2)
(1, 2)
2.2.3迭代 dict

迭代key

>>> for key in d:
	    print(key)

	
a
b
c

迭代value

>>> for val in d.values():
	    print(val)

	
1
2
3

同时迭代key和value

>>> for k,v in d.items():
	print(k,v)

	
a 1
b 2
c 3
2.2.4 迭代字符串
>>> for ch in 'adc':
	print(ch)

	
a
d
c

最后,还有一个问题。如果要对List实现类似Java那样的下标循环怎么办?
Python内置的enumerate函数可以把一个List变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

>>> for i,val in enumerate(['a','v','d']):
	print(i,val)

	
0 a
1 v
2 d