python 列表,队列

  1. 列表特性

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

 

  1. append() and pop() 将列表但做栈使用
  2. 列表作为队列使用

在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。

若要实现一个队列, 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 用法:

  1. 限长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)

 

  1. 另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出

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

 

  1. 一个 轮询调度器 可以通过在 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()

  1. 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' 则执行取出的任务,否则停止

 

 

  1. 列表特性

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

 

  1. append() and pop() 将列表但做栈使用
  2. 列表作为队列使用

在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。

若要实现一个队列, 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 用法:

  1. 限长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)

 

  1. 另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出

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

 

  1. 一个 轮询调度器 可以通过在 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()

  1. 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' 则执行取出的任务,否则停止

 

 

  1. 列表特性

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

 

  1. append() and pop() 将列表但做栈使用
  2. 列表作为队列使用

在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。

若要实现一个队列, 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 用法:

  1. 限长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)

 

  1. 另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出

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

 

  1. 一个 轮询调度器 可以通过在 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()

  1. 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' 则执行取出的任务,否则停止

 

 

 

你可能感兴趣的:(python 列表,队列)