切片
正负索引就不提及了,都是比较基本的用法。
1 | #正数索引切片 |
迭代
基本迭代
给定 list 或 tuple 可以通过 for 循环来遍历,这种遍历称为迭代(iteration)
许多语言中迭代是通过下标完成的,比如 java:
1 | for (i=0; i<list.length; i++) { |
而 python 的 for 循环不仅仅可以用在 list 或是 tuple 上,还可以用在其他的可迭代对象上,比如 dict。
1 | 'a': 1, 'b': 2, 'c': 3} d = { |
要注意的是,dict 的存储顺序不是按照 list 顺序排列,所以迭代出的顺序很可能不一样
默认情况下,dict 迭代的是 key。如果要迭代 value,可以用 for value in d.values(),如果要同时迭代 key 和 value ,可以用 for k, v in d.items() 。
字符串也可迭代,例如:
1 | for ch in 'ABC': |
判断是否是可迭代对象:
通过 collections 模块的 Iterable 类型 判断
1 | from collections import Iterable |
如果在 python 中想实现上面 java 一样的通过下表循环的需要使用 python 内置的 enumerate 函数,使得 list 变成 索引-元素 对,这样就可以在 for 循环中同时迭代索引和元素本身:
1 | for i , value in enumerate(['A','B','C']): |
Iterator
可以直接作用于for循环的对象统称为可迭代对象:Iterable .
可以被 next()函数 调用并不断返回下一个值的对象称为迭代器: Iterator 。
生成器都是 Iterator 对象,但 list、dict、str 虽然是 Iterable ,却不是 Iterator 。
在官方文档中的原文:
iterable
An object capable of returning its members one at a time. Examples of iterables include all sequence types (such as list, str, and tuple) and some non-sequence types like dict, file objects, and objects of any classes you define with an __iter__() or __getitem__() method. Iterables can be used in a for loop and in many other places where a sequence is needed (zip(), map(), ...). When an iterable object is passed as an argument to the built-in function iter(), it returns an iterator for the object. This iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call iter() or deal with iterator objects yourself. The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. See also iterator, sequence, and generator.
iterator
An object representing a stream of data. Repeated calls to the iterator’s __next__() method (or passing it to the built-in function next()) return successive items in the stream. When no more data are available a StopIteration exception is raised instead. At this point, the iterator object is exhausted and any further calls to its __next__() method just raise StopIteration again. Iterators are required to have an __iter__() method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted. One notable exception is code which attempts multiple iteration passes. A container object (such as a list) produces a fresh new iterator each time you pass it to the iter() function or use it in a for loop. Attempting this with an iterator will just return the same exhausted iterator object used in the previous iteration pass, making it appear like an empty container.
把list、dict、str等 Iterable 变成 Iterator 可以使用iter()函数:
1 | #这是在 python2.7 中的 iter 对象 |
在 python 中的 Iterator 对象表示的是一个数据流,它可以被 next() 函数调用并且不断返回下一个数据,直到没有数据时,抛出 StopIteration 异常。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用 list 是永远不可能存储全体自然数的。
python 的 for 循环的本质上就是不断调用 next() 实现的 例如:
1 | for x in [1, 2, 3, 4, 5]: |
迭代器的解压缩
1 | #列表的解压缩 |
- 列表相邻元素的压缩:
1 | 1,7)) a = list(range( |
- 滑动取值窗口
1 | 1,7)) a = list(range( |
- 展开列表
1 | #方法1 |
生成式
- 列表生成式
1 | 1, 11)) list(range( |
- 其他
生成式也可用于字典中,也被称为字典推导:
1 | 2 for x in range(5)} n = {x : x ** |
字典推导反转字典:
1 | 'a':1,'b':2,'c':3,'d':4} m = { |
生成器
如果把列表的生成式的 [] 变为 () 就得到了一个 generator
1 | for x in range(10)] L = [x * x |
使用生成器很容易写出前 n 个斐波那契数
1 | # 函数定义 |
但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
1 | 6) g = fib( |
参考:
以及官方文档、 Stack Overflow、百度、 Google 等。。。# 切片
正负索引就不提及了,都是比较基本的用法。