首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

神级程序员让你看到Python另外强大的一面!函数式编程!

我的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,送前端入门教程哦。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180119A0YA1E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券