1.切片
对取数据很方便,如取一个list的前n个元素,没有接触到切片的,可以使用循环,但是用切片就会很简单:
arr = ["java" , "python","C++","C#"];
arr[0:2]; //list[ 起始位置 : 知道该位置停止但是不包括]
//结果 ['java', 'python']
arr[1:2];
//结果 ['python']
也支持倒数切片,但是倒数的索引从-1开始
arr[-2 , -1] >>> >>> ['python']
arr[-2:] >>> >>> ['python', 'C++']
如果什么都不写,直 arr [:] , 可以原样赋值一个list
以下还有一些高级应用
// 前10个数,每两个取一个:
arr [:10:2]
//所有数,每5个取一个:
arr [::5]
truple也可以同样的方式使用切片;一个字符串也可以使用切片来分割字符串
'ABCDEFG'[:3]
// 结果 'ABC'
'ABCDEFG'[::2]
// 结果 'ACEG'
- 迭代
用for循环来遍历list或者truple,这种遍历方式就称为迭代
truple和list以及dict都可以用for...in的方式进行迭代,但是python的循环不像java用下标的方式
如果想要用下标的方式进行迭代可以使用enumerate将list转变成索引+元素
for i, value in enumerate(['1', '2', '3']):
print(i, value)
...
- 列表生成式
用来创建list
生成一个[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))
image.png
生成一个[11, 22, 33, 44, 55, 66, 77, 88, 99, 1010]
>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
也可以使用两层循环
>>> [m+n for m in 'abc' for n in 'de']
['ad', 'ae', 'bd', 'be', 'cd', 'ce']
for循环后面还可以加上if判断
>>> [m for m in 'abc' if m!='b']
['a', 'c']
4.生成器
一边循环一边计算的机制,称为生成器:generator。
创建:列表生成是[] ,生成器是()
>>> (x*x for x in range(1,11))
<generator object <genexpr> at 0x0000000001DF0BF8>
打印出generator的每一个元素,使用next()
>>> g=(x*x for x in range(1,11))
>>> g
<generator object <genexpr> at 0x0000000001DF0BA0>
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>>
计算到没有元素之后将会抛出异常StopIteration
也可使用for循环遍历generator
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x0000000001DF0CA8>
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
generator还可以用函数的方式,如果一个函数中有yield 关键字,就说明这个函数不是普通函数,而是generator
generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
>>> def odd():
... print('step 1')
... yield 1
... print('step 2')
... yield(3)
... print('step 3')
... yield(5)
...
>>> o=odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
同样的,把函数改成generator后,不会真的去使用next()去获取下一个值,很麻烦,而是用for循环来迭代:
>>> def fib(max):
... n, a, b = 0, 0, 1
... while n < max:
... yield b
... a, b = b, a + b
... n = n + 1
... return 'done'
...
>>> for n in fib(6):
... print(n)
...
1
1
2
3
5
8
5 迭代器
可以直接使用for循环的数据类型有:
1). 集合数据类型,如list、tuple、dict、set、str等;
2). generator,包括生成器和带yield的generator 函数。
这些可以直接用for循环的对象都成为可迭代对象:Iterable
可以用isinstance判断对象是否是可迭代对象
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以用isinstance判断对象是否是Iterator对象
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> from collections import Iterator
>>> isinstance(iter([]), Iterator)
True
网友评论