Python3基础-特别函数(map filter partial reduces sorted)实例学习
程序员文章站
2022-06-12 08:01:00
1. 装饰器 关于Python装饰器的讲解,网上一搜有很多资料,有些资料讲的很详细。因此,我不再详述,我会给出一些连接,帮助理解。 "探究functools模块wraps装饰器的用途" 案例1 打印传入参数func的名字:new 2015 3 25 案例2 example Docstring 案例3 ......
1. 装饰器
关于python装饰器的讲解,网上一搜有很多资料,有些资料讲的很详细。因此,我不再详述,我会给出一些连接,帮助理解。
案例1
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print("打印传入参数func的名字:{}".format(func.__name__)) return func(*args, **kw) return wrapper @log def new(): print('2018-11-24') new()
打印传入参数func的名字:new 2015-3-25
案例2
from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): print('calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """docstring""" print('called example function') print(example.__name__, example.__doc__)
example docstring
案例3
def logger(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print("logger传入的参数text:{}".format(text)) print("打印传入参数func的名字:{}".format(func.__name__)) return func(*args, **kw) return wrapper return decorator @logger('debug') def today(): print('2018-11-24') today() print('-------------') print(today.__name__)
logger传入的参数text:debug 打印传入参数func的名字:today 2018-11-24 ------------- today
2. filter 过滤器
案例1
def is_odd(n): return n % 2 == 1 l = range(100) print(l) print(list(filter(is_odd, l)))
range(0, 100) [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
案例2
def not_empty(s): return s and s.strip() print(list(filter(not_empty, ['a', '', 'b', none, 'c', ' '])))
['a', 'b', 'c']
3. map 映射
def f(x): return x*x print(list(map(f, [1, 2, 3, 4, 5])))
[1, 4, 9, 16, 25]
4. partial 偏导雏形
partial具有固定参数的功能
案例1
固定say中的man参数
import functools def say(man, words): print('say', words, 'to', man) # say('boss', 'hello') # say hello to boss say2boss = functools.partial(say, 'boss') say2boss('good morning')
say good morning to boss
案例2
固定基,固定二进制,也就是将二进制函数中的基固定为2
import functools int2 = functools.partial(int, base=2) print('1000000 =', int2('1000000')) print('1010101 =', int2('1010101'))
1000000 = 64 1010101 = 85
案例3
def add(a,b): return a + b + 10 add3 = functools.partial(add,3) add5 = functools.partial(add,5) print("固定add函数中一个参数3,结果为3+4+10 = {} ".format(add3(4))) print("固定add函数中一个参数5,结果为5+10+10 = {} ".format(add5(10)))
固定add函数中一个参数3,结果为3+4+10 = 17 固定add函数中一个参数5,结果为5+10+10 = 25
5. reduce
案例1
import functools s = range(1,6) print(functools.reduce(lambda x, y: x+y, s))
15
案例2 字符串数字转化为整型
from functools import reduce char_to_int = { '0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '8':9 } def str2int(s): ints = map(lambda ch: char_to_int[ch], s) return reduce(lambda x, y: x*10 + y, ints) print(str2int('0')) print(str2int('12300')) print(str2int('0012345'))
0 12300 12345
案例3 字符串数字转化为浮点型
char_to_float = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '.': -1 } def str2float(s): nums = map(lambda ch: char_to_float[ch], s) point = 0 def to_float(f, n): nonlocal point if n == -1: point = 1 return f if point == 0: return f * 10 + n else: point = point * 10 return f + n / point return reduce(to_float, nums, 0.0) print(str2float('0')) print(str2float('123.456')) print(str2float('123.45600')) print(str2float('0.1234')) print(str2float('.1234')) print(str2float('120.0034'))
0.0 123.456 123.456 0.12340000000000001 0.12340000000000001 120.0034
6. sorted
案例1 简单排序
l = ['bob', 'about', 'zoo', 'credit'] print(sorted(l)) print(sorted(l, key=str.lower))
['credit', 'zoo', 'about', 'bob'] ['about', 'bob', 'credit', 'zoo']
案例2 根据要求排序
from operator import itemgetter students = [('bob', 75), ('adam', 92), ('bart', 66), ('lisa', 88)] print(sorted(students, key=itemgetter(0))) print(sorted(students, key=lambda t: t[1])) print(sorted(students, key=itemgetter(1), reverse=true))
[('adam', 92), ('bart', 66), ('bob', 75), ('lisa', 88)] [('bart', 66), ('bob', 75), ('lisa', 88), ('adam', 92)] [('adam', 92), ('lisa', 88), ('bob', 75), ('bart', 66)]
7. 返回函数
案例1
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum f = lazy_sum(1, 2, 3, 4, 5, 6, 7, 8, 9) print(f) print(f())
<function lazy_sum.<locals>.sum at 0x000001c8f8cf69d8> 45
案例2
def count(): fs = [] for i in range(1, 4): def f(): return i * i fs.append(f) return fs f1, f2, f3 = count() print(f1()) print(f2()) print(f3())
9 9 9
案例3
def count(): fs = [] def f(n): def j(): return n * n return j for i in range(1, 4): fs.append(f(i)) return fs f1, f2, f3 = count() print(f1()) print(f2()) print(f3())
1 4 9
8. 素数
def main(): for n in primes(): if n < 50: print("{}是1——100之间的素数。".format(n)) else: break def _odd_iter(): n = 1 while true: n = n + 2 yield n def _not_divisible(n): return lambda x: x % n > 0 def primes(): yield 2 it = _odd_iter() while true: n = next(it) yield n it = filter(_not_divisible(n), it) if __name__ == '__main__': main()
2是1——100之间的素数。 3是1——100之间的素数。 5是1——100之间的素数。 7是1——100之间的素数。 11是1——100之间的素数。 13是1——100之间的素数。 17是1——100之间的素数。 19是1——100之间的素数。 23是1——100之间的素数。 29是1——100之间的素数。 31是1——100之间的素数。 37是1——100之间的素数。 41是1——100之间的素数。 43是1——100之间的素数。 47是1——100之间的素数。
参考文献
- http://y.tsutsumi.io/dry-principles-through-python-decorators.html
- http://wklken.me/posts/2013/08/18/python-extra-functools.html
- https://github.com/michaelliao/learn-python3/tree/master/samples/functional