- 列表特性
list.append(x)
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> fruits.append('xigua') >>> fruits ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua'] |
list.extend(iterable)
>>> fruits.extend(['nangua','donggua']) >>> fruits ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua', 'nangua', 'donggua'] |
list.insert(index,x) 黄色高亮方法返回值为None
>>> fruits.insert(0,'fruits') >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua', 'nangua', 'donggua'] |
list.remove(x) 没有匹配项则报错
>>> fruits.remove('xigua') >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'nangua', 'donggua'] >>> fruits.remove('wolf') Traceback (most recent call last): File "", line 1, in fruits.remove('wolf') ValueError: list.remove(x): x not in list |
list.pop([i]) 指定索引越界则报错,默认删除最后一个
>>> fruits.pop() 'donggua' >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'nangua'] >>> fruits.pop(8) 'nangua' >>> fruits.pop(10) Traceback (most recent call last): File "", line 1, in fruits.pop(10) IndexError: pop index out of range |
list.clear() <==>del a[:]
>>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] >>> fruits.clear() >>> fruits [] >>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> del fruits[:] >>> fruits [] |
list.index(x[,start[,end]]) 返回第一个匹配值,或没有匹配值报错
>>> fruits.index('nangua') Traceback (most recent call last): File "", line 1, in fruits.index('nangua') ValueError: 'nangua' is not in list >>> fruits.index('apple') 2 >>> fruits.index('apple',0,2) Traceback (most recent call last): File "", line 1, in fruits.index('apple',0,2) ValueError: 'apple' is not in list |
list.count(x) 不存在的值报错
>>> fruits.count('apple') 3 >>> frutis.count('nangua') Traceback (most recent call last): File "", line 1, in frutis.count('nangua') NameError: name 'frutis' is not defined |
list.sort(key=None,reverse=False)
>>> fruits.sort() >>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] >>> fruits.sort(key=lambda fruit:fruit[1]) >>> fruits ['banana', 'banana', 'pear', 'kiwi', 'apple', 'apple', 'apple', 'fruits', 'orange'] >>> fruits.sort(reverse=True) >>> fruits ['pear', 'orange', 'kiwi', 'fruits', 'banana', 'banana', 'apple', 'apple', 'apple'] |
list.reverse()
>>> fruits ['pear', 'orange', 'kiwi', 'fruits', 'banana', 'banana', 'apple', 'apple', 'apple'] >>> fruits.reverse() >>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] |
list.copy()
>>> a=[1,2,3] >>> b=a >>> id(a) 2711896985480 >>> id(b) 2711896985480 >>> c=a.copy() >>> id(c) 2711897298312 |
- append() and pop() 将列表但做栈使用
- 列表作为队列使用
在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。
若要实现一个队列, collections.deque 被设计用于快速地从两端操作。
deque对象
class collections.deque([iterable[, maxlen]])
Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度。
如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。
方法:
deque.apeed(x)
deque.apeedleft(x)
deque.extend(iterable)
deque.extendleft(iterable)
deque.pop()
deque.popleft()
deque.clear()
deque.copy()
deque.count(x)
deque.index(x)
deque.remove(x)
deque.reverse()
deque.rotate(n=1) 向右循环移动n步,如果n是负数,则向左循环
reversed(d)
copy.copy(d)
copy.deepcopy(d)
示例:
>>> from collections import deque >>> d=deque('abc') >>> d deque(['a', 'b', 'c']) >>> d.append('d') >>> d.appendleft('z') >>> d deque(['z', 'a', 'b', 'c', 'd']) >>> d.extend(['e','f']) >>> d deque(['z', 'a', 'b', 'c', 'd', 'e', 'f']) >>> d.extendleft(['w','y']) >>> d deque(['y', 'w', 'z', 'a', 'b', 'c', 'd', 'e', 'f']) >>> d.pop() 'f' >>> d.popleft() 'y' >>> d deque(['w', 'z', 'a', 'b', 'c', 'd', 'e']) >>> d.rotate() >>> d deque(['e', 'w', 'z', 'a', 'b', 'c', 'd']) |
deque 用法:
- 限长deque提供了类似Unix tail 过滤功能
from collections import deque def tail(filename,n=10): with open(filename) as f: return deque(f,n) s=tail('file') print(s) [Running] python -u "h:\PY\deque_obj.py" deque(['z\n', 'x\n', 'c\n', 'v\n', 'b\n', 'n\n', 'm\n', 'a\n', 's\n', 'd'], maxlen=10) |
- 另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出
def moving_average(iterable, n=3): # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0 # http://en.wikipedia.org/wiki/Moving_average it = iter(iterable) d = deque(itertools.islice(it, n-1)) d.appendleft(0) s = sum(d) for elem in it: s += elem - d.popleft() d.append(elem) yield s / n |
- 一个 轮询调度器 可以通过在 deque 中放入迭代器来实现。值从当前迭代器的位置0被取出并暂存(yield)。 如果这个迭代器消耗完毕,就用 popleft() 将其从对列中移去;否则,就通过 rotate() 将它移到队列的末尾
def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> A D E B F C" iterators = deque(map(iter, iterables)) while iterators: try: while True: yield next(iterators[0]) iterators.rotate(-1) except StopIteration: # Remove an exhausted iterator. iterators.popleft() |
- rotate() 方法提供了一种方式来实现 deque 切片和删除。 例如, 一个纯的Python del d[n] 实现依赖于 rotate() 来定位要弹出的元素
def delete_nth(d, n): d.rotate(-n) d.popleft() d.rotate(n) |
要实现 deque 切片, 使用一个类似的方法,应用 rotate() 将目标元素放到左边。通过 popleft() 移去老的条目(entries),通过 extend() 添加新的条目, 然后反向 rotate。这个方法可以最小代价实现命令式的栈操作,诸如 dup, drop, swap, over, pick, rot, 和 roll 。
iter()返回迭代器对象
第一个参数的解释基于第二个参数。
当第二个参数不存在, 第一个参数必须是支持迭代协议的容器类型对象,例如字典等, 或者是支持序列协议的序列类型对象,例如列表等,如果都不支持则报错。
当第二个参数存在, 即哨兵参数存在,则第一个参数必须是可调用对象,即函数等,以此种方式创建的迭代器对象将会调用object,可调用对象参数调用时不需要参数,如果可调用对象调用后返回值与哨兵对象值相同, 则结束调用
官方例子1:
with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line) |
个人理解:for循环的每一次会调用 fp.readline 方法,将方法调用产生的值与哨兵参数比较,相同则结束迭代,否则将方法调用产生的值返回并绑定到line 变量
官方例子2<多进程最后一个例子>:
def worker(input, output): for func, args in iter(input.get, 'STOP'): result = calculate(func, args) output.put(result) |
函数中 input和output 均是任务队列,每次循环从input队列中取出任务,若取出的任务不是'STOP' 则执行取出的任务,否则停止
- 列表特性
list.append(x)
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> fruits.append('xigua') >>> fruits ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua'] |
list.extend(iterable)
>>> fruits.extend(['nangua','donggua']) >>> fruits ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua', 'nangua', 'donggua'] |
list.insert(index,x) 黄色高亮方法返回值为None
>>> fruits.insert(0,'fruits') >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua', 'nangua', 'donggua'] |
list.remove(x) 没有匹配项则报错
>>> fruits.remove('xigua') >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'nangua', 'donggua'] >>> fruits.remove('wolf') Traceback (most recent call last): File "", line 1, in fruits.remove('wolf') ValueError: list.remove(x): x not in list |
list.pop([i]) 指定索引越界则报错,默认删除最后一个
>>> fruits.pop() 'donggua' >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'nangua'] >>> fruits.pop(8) 'nangua' >>> fruits.pop(10) Traceback (most recent call last): File "", line 1, in fruits.pop(10) IndexError: pop index out of range |
list.clear() <==>del a[:]
>>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] >>> fruits.clear() >>> fruits [] >>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> del fruits[:] >>> fruits [] |
list.index(x[,start[,end]]) 返回第一个匹配值,或没有匹配值报错
>>> fruits.index('nangua') Traceback (most recent call last): File "", line 1, in fruits.index('nangua') ValueError: 'nangua' is not in list >>> fruits.index('apple') 2 >>> fruits.index('apple',0,2) Traceback (most recent call last): File "", line 1, in fruits.index('apple',0,2) ValueError: 'apple' is not in list |
list.count(x) 不存在的值报错
>>> fruits.count('apple') 3 >>> frutis.count('nangua') Traceback (most recent call last): File "", line 1, in frutis.count('nangua') NameError: name 'frutis' is not defined |
list.sort(key=None,reverse=False)
>>> fruits.sort() >>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] >>> fruits.sort(key=lambda fruit:fruit[1]) >>> fruits ['banana', 'banana', 'pear', 'kiwi', 'apple', 'apple', 'apple', 'fruits', 'orange'] >>> fruits.sort(reverse=True) >>> fruits ['pear', 'orange', 'kiwi', 'fruits', 'banana', 'banana', 'apple', 'apple', 'apple'] |
list.reverse()
>>> fruits ['pear', 'orange', 'kiwi', 'fruits', 'banana', 'banana', 'apple', 'apple', 'apple'] >>> fruits.reverse() >>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] |
list.copy()
>>> a=[1,2,3] >>> b=a >>> id(a) 2711896985480 >>> id(b) 2711896985480 >>> c=a.copy() >>> id(c) 2711897298312 |
- append() and pop() 将列表但做栈使用
- 列表作为队列使用
在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。
若要实现一个队列, collections.deque 被设计用于快速地从两端操作。
deque对象
class collections.deque([iterable[, maxlen]])
Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度。
如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。
方法:
deque.apeed(x)
deque.apeedleft(x)
deque.extend(iterable)
deque.extendleft(iterable)
deque.pop()
deque.popleft()
deque.clear()
deque.copy()
deque.count(x)
deque.index(x)
deque.remove(x)
deque.reverse()
deque.rotate(n=1) 向右循环移动n步,如果n是负数,则向左循环
reversed(d)
copy.copy(d)
copy.deepcopy(d)
示例:
>>> from collections import deque >>> d=deque('abc') >>> d deque(['a', 'b', 'c']) >>> d.append('d') >>> d.appendleft('z') >>> d deque(['z', 'a', 'b', 'c', 'd']) >>> d.extend(['e','f']) >>> d deque(['z', 'a', 'b', 'c', 'd', 'e', 'f']) >>> d.extendleft(['w','y']) >>> d deque(['y', 'w', 'z', 'a', 'b', 'c', 'd', 'e', 'f']) >>> d.pop() 'f' >>> d.popleft() 'y' >>> d deque(['w', 'z', 'a', 'b', 'c', 'd', 'e']) >>> d.rotate() >>> d deque(['e', 'w', 'z', 'a', 'b', 'c', 'd']) |
deque 用法:
- 限长deque提供了类似Unix tail 过滤功能
from collections import deque def tail(filename,n=10): with open(filename) as f: return deque(f,n) s=tail('file') print(s) [Running] python -u "h:\PY\deque_obj.py" deque(['z\n', 'x\n', 'c\n', 'v\n', 'b\n', 'n\n', 'm\n', 'a\n', 's\n', 'd'], maxlen=10) |
- 另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出
def moving_average(iterable, n=3): # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0 # http://en.wikipedia.org/wiki/Moving_average it = iter(iterable) d = deque(itertools.islice(it, n-1)) d.appendleft(0) s = sum(d) for elem in it: s += elem - d.popleft() d.append(elem) yield s / n |
- 一个 轮询调度器 可以通过在 deque 中放入迭代器来实现。值从当前迭代器的位置0被取出并暂存(yield)。 如果这个迭代器消耗完毕,就用 popleft() 将其从对列中移去;否则,就通过 rotate() 将它移到队列的末尾
def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> A D E B F C" iterators = deque(map(iter, iterables)) while iterators: try: while True: yield next(iterators[0]) iterators.rotate(-1) except StopIteration: # Remove an exhausted iterator. iterators.popleft() |
- rotate() 方法提供了一种方式来实现 deque 切片和删除。 例如, 一个纯的Python del d[n] 实现依赖于 rotate() 来定位要弹出的元素
def delete_nth(d, n): d.rotate(-n) d.popleft() d.rotate(n) |
要实现 deque 切片, 使用一个类似的方法,应用 rotate() 将目标元素放到左边。通过 popleft() 移去老的条目(entries),通过 extend() 添加新的条目, 然后反向 rotate。这个方法可以最小代价实现命令式的栈操作,诸如 dup, drop, swap, over, pick, rot, 和 roll 。
iter()返回迭代器对象
第一个参数的解释基于第二个参数。
当第二个参数不存在, 第一个参数必须是支持迭代协议的容器类型对象,例如字典等, 或者是支持序列协议的序列类型对象,例如列表等,如果都不支持则报错。
当第二个参数存在, 即哨兵参数存在,则第一个参数必须是可调用对象,即函数等,以此种方式创建的迭代器对象将会调用object,可调用对象参数调用时不需要参数,如果可调用对象调用后返回值与哨兵对象值相同, 则结束调用
官方例子1:
with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line) |
个人理解:for循环的每一次会调用 fp.readline 方法,将方法调用产生的值与哨兵参数比较,相同则结束迭代,否则将方法调用产生的值返回并绑定到line 变量
官方例子2<多进程最后一个例子>:
def worker(input, output): for func, args in iter(input.get, 'STOP'): result = calculate(func, args) output.put(result) |
函数中 input和output 均是任务队列,每次循环从input队列中取出任务,若取出的任务不是'STOP' 则执行取出的任务,否则停止
- 列表特性
list.append(x)
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> fruits.append('xigua') >>> fruits ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua'] |
list.extend(iterable)
>>> fruits.extend(['nangua','donggua']) >>> fruits ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua', 'nangua', 'donggua'] |
list.insert(index,x) 黄色高亮方法返回值为None
>>> fruits.insert(0,'fruits') >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'xigua', 'nangua', 'donggua'] |
list.remove(x) 没有匹配项则报错
>>> fruits.remove('xigua') >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'nangua', 'donggua'] >>> fruits.remove('wolf') Traceback (most recent call last): File "", line 1, in fruits.remove('wolf') ValueError: list.remove(x): x not in list |
list.pop([i]) 指定索引越界则报错,默认删除最后一个
>>> fruits.pop() 'donggua' >>> fruits ['fruits', 'orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana', 'nangua'] >>> fruits.pop(8) 'nangua' >>> fruits.pop(10) Traceback (most recent call last): File "", line 1, in fruits.pop(10) IndexError: pop index out of range |
list.clear() <==>del a[:]
>>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] >>> fruits.clear() >>> fruits [] >>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> del fruits[:] >>> fruits [] |
list.index(x[,start[,end]]) 返回第一个匹配值,或没有匹配值报错
>>> fruits.index('nangua') Traceback (most recent call last): File "", line 1, in fruits.index('nangua') ValueError: 'nangua' is not in list >>> fruits.index('apple') 2 >>> fruits.index('apple',0,2) Traceback (most recent call last): File "", line 1, in fruits.index('apple',0,2) ValueError: 'apple' is not in list |
list.count(x) 不存在的值报错
>>> fruits.count('apple') 3 >>> frutis.count('nangua') Traceback (most recent call last): File "", line 1, in frutis.count('nangua') NameError: name 'frutis' is not defined |
list.sort(key=None,reverse=False)
>>> fruits.sort() >>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] >>> fruits.sort(key=lambda fruit:fruit[1]) >>> fruits ['banana', 'banana', 'pear', 'kiwi', 'apple', 'apple', 'apple', 'fruits', 'orange'] >>> fruits.sort(reverse=True) >>> fruits ['pear', 'orange', 'kiwi', 'fruits', 'banana', 'banana', 'apple', 'apple', 'apple'] |
list.reverse()
>>> fruits ['pear', 'orange', 'kiwi', 'fruits', 'banana', 'banana', 'apple', 'apple', 'apple'] >>> fruits.reverse() >>> fruits ['apple', 'apple', 'apple', 'banana', 'banana', 'fruits', 'kiwi', 'orange', 'pear'] |
list.copy()
>>> a=[1,2,3] >>> b=a >>> id(a) 2711896985480 >>> id(b) 2711896985480 >>> c=a.copy() >>> id(c) 2711897298312 |
- append() and pop() 将列表但做栈使用
- 列表作为队列使用
在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。
若要实现一个队列, collections.deque 被设计用于快速地从两端操作。
deque对象
class collections.deque([iterable[, maxlen]])
Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度。
如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。
方法:
deque.apeed(x)
deque.apeedleft(x)
deque.extend(iterable)
deque.extendleft(iterable)
deque.pop()
deque.popleft()
deque.clear()
deque.copy()
deque.count(x)
deque.index(x)
deque.remove(x)
deque.reverse()
deque.rotate(n=1) 向右循环移动n步,如果n是负数,则向左循环
reversed(d)
copy.copy(d)
copy.deepcopy(d)
示例:
>>> from collections import deque >>> d=deque('abc') >>> d deque(['a', 'b', 'c']) >>> d.append('d') >>> d.appendleft('z') >>> d deque(['z', 'a', 'b', 'c', 'd']) >>> d.extend(['e','f']) >>> d deque(['z', 'a', 'b', 'c', 'd', 'e', 'f']) >>> d.extendleft(['w','y']) >>> d deque(['y', 'w', 'z', 'a', 'b', 'c', 'd', 'e', 'f']) >>> d.pop() 'f' >>> d.popleft() 'y' >>> d deque(['w', 'z', 'a', 'b', 'c', 'd', 'e']) >>> d.rotate() >>> d deque(['e', 'w', 'z', 'a', 'b', 'c', 'd']) |
deque 用法:
- 限长deque提供了类似Unix tail 过滤功能
from collections import deque def tail(filename,n=10): with open(filename) as f: return deque(f,n) s=tail('file') print(s) [Running] python -u "h:\PY\deque_obj.py" deque(['z\n', 'x\n', 'c\n', 'v\n', 'b\n', 'n\n', 'm\n', 'a\n', 's\n', 'd'], maxlen=10) |
- 另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出
def moving_average(iterable, n=3): # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0 # http://en.wikipedia.org/wiki/Moving_average it = iter(iterable) d = deque(itertools.islice(it, n-1)) d.appendleft(0) s = sum(d) for elem in it: s += elem - d.popleft() d.append(elem) yield s / n |
- 一个 轮询调度器 可以通过在 deque 中放入迭代器来实现。值从当前迭代器的位置0被取出并暂存(yield)。 如果这个迭代器消耗完毕,就用 popleft() 将其从对列中移去;否则,就通过 rotate() 将它移到队列的末尾
def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> A D E B F C" iterators = deque(map(iter, iterables)) while iterators: try: while True: yield next(iterators[0]) iterators.rotate(-1) except StopIteration: # Remove an exhausted iterator. iterators.popleft() |
- rotate() 方法提供了一种方式来实现 deque 切片和删除。 例如, 一个纯的Python del d[n] 实现依赖于 rotate() 来定位要弹出的元素
def delete_nth(d, n): d.rotate(-n) d.popleft() d.rotate(n) |
要实现 deque 切片, 使用一个类似的方法,应用 rotate() 将目标元素放到左边。通过 popleft() 移去老的条目(entries),通过 extend() 添加新的条目, 然后反向 rotate。这个方法可以最小代价实现命令式的栈操作,诸如 dup, drop, swap, over, pick, rot, 和 roll 。
iter()返回迭代器对象
第一个参数的解释基于第二个参数。
当第二个参数不存在, 第一个参数必须是支持迭代协议的容器类型对象,例如字典等, 或者是支持序列协议的序列类型对象,例如列表等,如果都不支持则报错。
当第二个参数存在, 即哨兵参数存在,则第一个参数必须是可调用对象,即函数等,以此种方式创建的迭代器对象将会调用object,可调用对象参数调用时不需要参数,如果可调用对象调用后返回值与哨兵对象值相同, 则结束调用
官方例子1:
with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line) |
个人理解:for循环的每一次会调用 fp.readline 方法,将方法调用产生的值与哨兵参数比较,相同则结束迭代,否则将方法调用产生的值返回并绑定到line 变量
官方例子2<多进程最后一个例子>:
def worker(input, output): for func, args in iter(input.get, 'STOP'): result = calculate(func, args) output.put(result) |
函数中 input和output 均是任务队列,每次循环从input队列中取出任务,若取出的任务不是'STOP' 则执行取出的任务,否则停止