欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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 过滤器

python函数式编程

案例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 映射

python函数式编程

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. 素数

python3基础-代码阅读系列—素数

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之间的素数。

参考文献

  1. http://y.tsutsumi.io/dry-principles-through-python-decorators.html
  2. http://wklken.me/posts/2013/08/18/python-extra-functools.html
  3. https://github.com/michaelliao/learn-python3/tree/master/samples/functional