接上次python2 失误 About *错误 以下是python3重新测试


In [1]:
p = ['a',1,3,'c',('a1','a2')]

In [4]:
a = []
for i in range(len(p)):
    a.append(p[i])
    print('a[%s]:%s' % (i,a[i]))


a[0]:a
a[1]:1
a[2]:3
a[3]:c
a[4]:('a1', 'a2')

In [5]:
a,b,*c = p

In [6]:
c


Out[6]:
[3, 'c', ('a1', 'a2')]

以上是利用python3进行修改的多参数

扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象而设计的 星号表达式在迭代元素为可变长元组的序列时是很有用


In [20]:
record = [
    ('foo', 1, 2),
    ('bar', 'hello'),
    ('foo', 3, 4),
]

In [8]:
type(record)


Out[8]:
list

In [10]:
def do_foo(x,y):
    print('foo',x,y)

In [14]:
def do_bar(s):
    print('bar',s)

In [22]:
for tag,*arg in record:
    '''
    if tag == 'foo':
        do_foo(*arg)
        '''
    if tag == 'bar':
        do_bar(*arg)


bar hello

星号解压语法在字符串操作的时候也会很有用 字符串进行分割


In [23]:
line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'

In [25]:
name,*fields,sh = line.split(':')

In [26]:
name


Out[26]:
'nobody'

In [27]:
fields


Out[27]:
['*', '-2', '-2', 'Unprivileged User', '/var/empty']

In [28]:
sh


Out[28]:
'/usr/bin/false'

使用_or ign 进行废弃多余的解压后元素


In [29]:
jiji = ['ac',12.34,(1,2,3,4)]

In [30]:
_,a,(*ign,need) = jiji

In [31]:
need


Out[31]:
4

In [32]:
ign


Out[32]:
[1, 2, 3]

将一个列表分割成前后两个部分


In [33]:
riri = [1,5,6,7,8,9,10]
head,*tail = riri
head


Out[33]:
1

In [34]:
tail


Out[34]:
[5, 6, 7, 8, 9, 10]

将星号表达式用于递归算法


In [37]:
def ririsum(riri):
    head,*tail = riri
    return head + ririsum(tail) if tail else head

In [38]:
ririsum(riri)


Out[38]:
46

In [39]:
sum(riri)


Out[39]:
46

保留最后N个元素

在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录


In [47]:
from collections import deque

def search(lines,pattern,history=2):
    previous_lines = deque(maxlen=history)
    for li in lines:
        if pattern in li:
            yield li,previous_lines
        previous_lines.append(li)

# Example use on a file
if __name__ == '__main__':
    with open(r'somefile.txt') as f:
        for line, prevlines in search(f, 'python', 2):
            for pline in prevlines:
                print(pline, end=',')
            #print(line, end='')
            print('-' * 20)


--------------------

In [49]:
d = deque()

In [50]:
d.append((1,2,3))

In [51]:
d


Out[51]:
deque([(1, 2, 3)])

In [52]:
d.append(1)
d


Out[52]:
deque([(1, 2, 3), 1])

In [53]:
d.appendleft(1)

In [54]:
d


Out[54]:
deque([1, (1, 2, 3), 1])

In [55]:
d.pop()


Out[55]:
1

In [56]:
d


Out[56]:
deque([1, (1, 2, 3)])

In [57]:
d.popleft()


Out[57]:
1

In [58]:
d


Out[58]:
deque([(1, 2, 3)])

在队列两端插入或删除元素时间复杂度都是 O(1) ,而在列表的开头插入或删除元素的时间复杂度为 O(N)