我的web前端学习群:273733234,每天晚上都会给大家分享web前端学习知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2018 web前端学习教程),大家都是学习web前端的,或是转行,或是大学生,还有工作中想提升自己能力的前端党,如果你是正在学习web前端的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实。
singledispatch
虽然Python不支持同名方法允许有不同的参数类型,但是我们可以借用singledispatch来
动态指定相应的方法所接收的参数类型
8
for expr in [ 'a = b' , 'a > b' ]:
print( ' {:
result = eval(expr)
print( ' result of {}: {}' .format(expr, result))
下面是运行结果:
testing __gt__( 1 , 2 )
testing __eq__( 1 , 2 )
result of a
testing __gt__( 1 , 2 )
result of a
a == b:
testing __eq__( 1 , 2 )
result of a == b: False
testing __gt__( 1 , 2 )
testing __eq__( 1 , 2 )
result of a >= b: False
testing __gt__( 1 , 2 )
result of a > b: False
itertools的使用
itertools为我们提供了非常有用的用于操作迭代对象的函数。
[ 1 , 2 , 3 , 'a' , 'b' , 'c' ]
chain的实现原理如下
def chain (*iterables):
# chain('ABC', 'DEF') --> A B C D E F
for it in iterables:
for element in it:
yield element
chain.from_iterable
chain.from_iterable(iterable)和chain类似,但是只是接收单个iterable,然后将这个iterable中的元素组合成一个iterator。
>>> from itertools import chain
>>> list(chain.from_iterable([ 'ABC' , 'DEF' ]))
[ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ]
实现原理也和chain类似
def from_iterable (iterables):
# chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
for it in iterables:
for element in it:
yield element
compress
compress(data, selectors)接收两个iterable作为参数,只返回selectors中对应的元素为True的data,当data/selectors之一用尽时停止。
>>> list(compress([ 1 , 2 , 3 , 4 , 5 ], [ True , True , False , False , True ]))
[ 1 , 2 , 5 ]
>>> from itertools import islice
>>> for i in islice(range( 100 ), 0 , 100 , 10 ):
... print(i, end= ' ' )
...
0 10 20 30 40 50 60 70 80 90
tee
tee(iterable, n=2) 返回n个独立的iterator,n默认为2。
from itertools import islice, tee
r = islice(count(), 5 )
i1, i2 = tee(r)
print( 'i1:' , list(i1))
print( 'i2:' , list(i2))
for i in r:
print(i, end= ' ' )
if i > 1 :
break
下面是输出结果,注意tee(r)后,r作为iterator已经失效,所以for循环没有输出值。
i1: [ 0 , 1 , 2 , 3 , 4 ]
i2: [ 0 , 1 , 2 , 3 , 4 ]
starmap
starmap(func, iterable)假设iterable将返回一个元组流,并使用这些元组作为参数调用func:
>>> from itertools import starmap
>>> import os
>>> iterator = starmap(os.path.join,
... [( '/bin' , 'python' ), ( '/usr' , 'bin' , 'java' ),
... ( '/usr' , 'bin' , 'perl' ), ( '/usr' , 'bin' , 'ruby' )])
>>> list(iterator)
[ '/bin/python' , '/usr/bin/java' , '/usr/bin/perl' , '/usr/bin/ruby' ]
filterfalse
filterfalse(predicate, iterable) 与filter()相反,返回所有predicate返回False的元素。
itertools.filterfalse(is_even, itertools.count()) =>
1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , ...
takewhile
takewhile(predicate, iterable) 只要predicate返回True,不停地返回iterable中的元素。一旦predicate返回False,iteration将结束。
def less_than_10 (x):
return x
itertools.takewhile(less_than_10, itertools.count())
=> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
itertools.takewhile(is_even, itertools.count())
dropwhile
dropwhile(predicate, iterable) 在predicate返回True时舍弃元素,然后返回其余迭代结果。
itertools.dropwhile(less_than_10, itertools.count())
=> 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
itertools.dropwhile(is_even, itertools.count())
=> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
groupby
groupby(iterable, key=None) 把iterator中相邻的
重复元素
挑出来放在一起。p.s: The input sequence needs to be sorted on the key value in order for the groupings to work out as expected.
[k for k, g in groupby(‘AAAABBBCCDAABBB’)] –> A B C D A B
[list(g) for k, g in groupby(‘AAAABBBCCD’)] –> AAAA BBB CC D
>>> import itertools
>>> for key, group in itertools.groupby( 'AAAABBBCCDAABBB' ):
... print(key, list(group))
...
( 0 , 0 , 0 ) ( 0 , 0 , 1 ) ( 0 , 0 , 2 )
( 0 , 1 , 0 ) ( 0 , 1 , 1 ) ( 0 , 1 , 2 )
( 0 , 2 , 0 ) ( 0 , 2 , 1 ) ( 0 , 2 , 2 )
( 1 , 0 , 0 ) ( 1 , 0 , 1 ) ( 1 , 0 , 2 )
( 1 , 1 , 0 ) ( 1 , 1 , 1 ) ( 1 , 1 , 2 )
( 1 , 2 , 0 ) ( 1 , 2 , 1 ) ( 1 , 2 , 2 )
( 2 , 0 , 0 ) ( 2 , 0 , 1 ) ( 2 , 0 , 2 )
( 2 , 1 , 0 ) ( 2 , 1 , 1 ) ( 2 , 1 , 2 )
( 2 , 2 , 0 ) ( 2 , 2 , 1 ) ( 2 , 2 , 2 )
permutations
permutations(iterable, r=None)返回长度为r的所有可能的组合。
from itertools import permutations
def show (iterable):
first = None
for i, item in enumerate(iterable, 1 ):
if first != item[ 0 ]:
if first is not None :
print()
first = item[ 0 ]
print( '' .join(item), end= ' ' )
print()
print( 'All permutations: ' )
show(permutations( 'abcd' ))
print( ' Pairs: ' )
show(permutations( 'abcd' , r= 2 ))
下面是输出结果
All permutations:
abcd abdc acbd acdb adbc adcb
bacd badc bcad bcda bdac bdca
cabd cadb cbad cbda cdab cdba
dabc dacb dbac dbca dcab dcba
Pairs:
ab ac ad
ba bc bd
ca cb cd
da db dc
>>> sorted(student_objects, key= lambda student: student.age) # 传统的lambda做法
[( 'dave' , 'B' , 10 ), ( 'jane' , 'B' , 12 ), ( 'john' , 'A' , 15 )]
>>> from operator import itemgetter, attrgetter
>>> sorted(student_objects, key=attrgetter( 'age' ))
[( 'dave' , 'B' , 10 ), ( 'jane' , 'B' , 12 ), ( 'john' , 'A' , 15 )]
# 但是如果像下面这样接受双重比较,Python脆弱的lambda就不适用了
>>> sorted(student_objects, key=attrgetter( 'grade' , 'age' ))
[( 'john' , 'A' , 15 ), ( 'dave' , 'B' , 10 ), ( 'jane' , 'B' , 12 )]
attrgetter的实现原理:
def attrgetter (*items):
if any( not isinstance(item, str) for item in items):
raise TypeError( 'attribute name must be a string' )
if len(items) == 1 :
attr = items[ 0 ]
def g (obj):
return resolve_attr(obj, attr)
else :
def g (obj):
return tuple(resolve_attr(obj, attr) for attr in items)
return g
def resolve_attr (obj, attr):
for name in attr.split( "." ):
obj = getattr(obj, name)
return obj
itemgetter
operator.itemgetter(item)和operator.itemgetter(*items)
After f = itemgetter(2), the call f(r) returns r[2].
After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]).
我们通过下面这个例子来了解一下itergetter的用法
>>> student_tuples = [
... ( 'john' , 'A' , 15 ),
... ( 'jane' , 'B' , 12 ),
... ( 'dave' , 'B' , 10 ),
... ]
>>> sorted(student_tuples, key= lambda student: student[ 2 ]) # 传统的lambda做法
[( 'dave' , 'B' , 10 ), ( 'jane' , 'B' , 12 ), ( 'john' , 'A' , 15 )]
>>> from operator import attrgetter
>>> sorted(student_tuples, key=itemgetter( 2 ))
[( 'dave' , 'B' , 10 ), ( 'jane' , 'B' , 12 ), ( 'john' , 'A' , 15 )]
# 但是如果像下面这样接受双重比较,Python脆弱的lambda就不适用了
>>> sorted(student_tuples, key=itemgetter( 1 , 2 ))
[( 'john' , 'A' , 15 ), ( 'dave' , 'B' , 10 ), ( 'jane' , 'B' , 12 )]
itemgetter的实现原理
谢谢阅读 ,著作权归作者所有,如有侵权请联系小编删除!
最后推荐下我自己建的web前端学习群:273733234,送前端入门教程哦。
领取专属 10元无门槛券
私享最新 技术干货