任何序列都可以通过简单的赋值分解成多个序列,唯一的要求是变量的总数和结构要与序列相吻合
例如:
tp = (1,1,2)
var1,var2,var3 = tp
print(var1,var2,var3)
data = ['hello','a','b','c','d']
var1,var2,var3,var4,var5 = data
print(var1,var2,var3,var4,var5)
#若变量个数和元素个不统一则会报错:
#ValueError:need more than 2 values to unpack / too many values to unpack
python最牛x之一的莫过于非常灵活的 " * 表达式 " 了
例如:
num1,*kargs,num2 = [1,2,3,4,5,6]
print(num1)# 1
print(num2)# 2
print(*kargs)# [2,3,4,5]
avg = sum(*args)/len(*args)
print(avg)# 2+3+4+5 / 4 == 3.5
更复杂的例子:
record = [
('foo',1,2),
('bar','hello'),
('foo',2,3),
('foo',4,4)
]
def do_foo(x,y):
print('foo',x,y)
def do_bars(s):
print('bar',s)
for tag,*args in record:
if tag == 'foo':
do_foo(*args)
elif tag == 'bar':
do_bars(*args)
#有些时候想要丢弃某些值:
record = ('白piao老师', 50, 123.45, (12, 9, 2012)]
name,*_,(*_,year) = record #常常使用_或者ign来表示丢弃值
print(name,year)
#输出结果: 小白piao老师 2012
#有的时候依托于*可以做出更加精妙的算法
#例子:
def func(items):
head_var, *tail_var = items
return var_head + func(tail_var) if tail_var else head_var
>>>func([1,2,3,4,5])
>>>15
#其实python做这个真心鸡肋....
如果我们希望在迭代或者其他形式的处理过程中对最后几项纪录做一个有限的历史记录统计:
from collections import deque
def search(lines,pattern,history):
previous_lines = deque(maxlen = history)
for line in lines:
if pattern == line :
yield line,privious_lines
privious_lines.append(line)
if __name__ == '__main__':
with open('test.txt') as f:
for line,prevlines in search(f,'whitepiao',5):
for line1 in prevlines:
print(line1)
print(line,end = '')
print('-'*20)
deque其实本质上是一个可以固定长度的队列,如果固定了长度,在队列已满的情况下,向其中添加新值,会自动弹出最老的值,
>>>q = deque(maxlen = 3)
>>>q
>>>deque([],maxlen=3)
>>>q.append(1)
>>>q.append(2)
>>>q.append(3)
>>>q
>>>deque([1,2,3],maxlen = 3)
>>>q.append(4)
>>>q
>>>deque([2,3,4],maxlen = 3)
>>>q.appendleft(77)
>>>q
>>>deque([77,2,3],maxlen = 3)
import heapq as h
nums = [1,8, 2, 23, -4, 18, 23, 42, 37, 2]
print(h.nlargest(3,nums))# [42,37,23]
print(h.nsmallest(3,nums)# [-4,1,2]
以上用到的nlargest和nsmallest都可以接受一个参数key:
proInfo = [
{
'name':'IB','shares':100,'prices':91.1},
{
'name':'APP','shares':99,'prices':107.2},
{
'name':'LEN','shares':80,'prices':99.0},
{
'name':'ASU','shares':80,'prices':91.0},
{
'name':'DEL','shares':95,'prices':89.7},
]
cheap = h.nsmallest(3,proInfo,lambda x:x['price'])
expensive = h.nlargest(3,proInfo,lambda x:x['price'])
>>>cheap
>>>[89.7,91.0,91.1]