zoukankan      html  css  js  c++  java
  • Python基础及语法(六)

    柯里化

    z = f(x, y)转换成 z = f(x)(y)的形式

     1 def add_front(x, y):  # 柯里化前
     2     return x+y
     3 
     4 
     5 def add_after(x):  # 柯里化后
     6     def inner(y):
     7         return x+y
     8     return inner
     9 
    10 
    11 print(add_front(4, 5))  # 9
    12 print(add_after(4)(5))  # 9

    装饰器

    为一个封装好的函数添加功能

    如为一个函数添加返回传参内容:

     1 def logger(fn):
     2     def inner(*args, **kwargs):
     3         ret = fn(*args, **kwargs)
     4         print(args, kwargs)  # (4,) {'y': 5}
     5         return ret
     6     return inner
     7 
     8 
     9 @logger  # 装饰器
    10 def add(x, y):
    11     return x+y
    12 
    13 
    14 print(add(4, y=5))  # 9

    带参装饰器

     1 import time
     2 
     3 
     4 def logger(n):
     5     def logger_(fn):
     6         def inner(*args, **kwargs):
     7             ret = fn(*args, **kwargs)
     8             time.sleep(n)  # 等待3秒
     9             print(args, kwargs)  # (4,) {'y': 5}
    10             return ret
    11         return inner
    12     return logger_
    13 
    14 
    15 @logger(3)  # 带参装饰器
    16 def add(x, y):
    17     return x+y
    18 
    19 
    20 print(add(4, y=5))  # 9

    属性更新

     from functools import wraps

     1 from functools import wraps
     2 import time
     3 
     4 
     5 def logger(n):
     6     def logger_(fn):
     7         @wraps(fn)  # 如果不使用则最后输出inner inner's
     8         def inner(*args, **kwargs):
     9             """inner's"""
    10             ret = fn(*args, **kwargs)
    11             time.sleep(n)  # 等待3秒
    12             print(args, kwargs)  # (4,) {'y': 5}
    13             return ret
    14         return inner
    15     return logger_
    16 
    17 
    18 @logger(3)  # 带参装饰器
    19 def add(x, y):
    20     """add's"""
    21     return x+y
    22 
    23 
    24 print(add(4, y=5))  # 9
    25 print(add.__name__, add.__doc__)  # add add'

    注解

    因Python是动态语言,所以注解只是友好的提示,不能避免类型使用错误。

    def add(x: int, y: int) -> int:  # 函数注解
        """
    
        :param x: int
        :param y: int
        :return: int
        """
        return x+y
    
    
    a: int = 4  # 类型注解
    b: int = 5
    print(add(a, b))  # 9

    inspect模块

     1 import inspect
     2 
     3 
     4 def add(x: int, y: int, *args: int, **kwargs: int) -> int:  # 函数注解
     5     """
     6 
     7     :param x: int
     8     :param y: int
     9     :return: int
    10     """
    11     return x+y+sum(args)++sum(kwargs.values())
    12 
    13 
    14 a: int = 4  # 类型注解
    15 b: int = 5
    16 print(add(a, b, 1, 2, 3, c=6, d=7, e=8, f=9))  # 45
    17 print(inspect.isfunction(add))  # True,isfunction判断是否为函数,返回True或False,此外还有其它is函数用法相似
    18 sig = inspect.signature(add)  # (x:int, y:int) -> int,signature获取签名
    19 print(sig.return_annotation)  # 获得返回值注解
    20 print(sig.parameters)  # OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">),
    21 # ('args', <Parameter "*args:int">), ('kwargs', <Parameter "**kwargs:int">)]), 获得所有型参,返回有序字典
    22 for k, v in sig.parameters.items():  # 该字典提供4个属性,以此是名字,缺省值,类型注解,传参类型
    23     print(k, v, v.name, v.default, v.annotation, v.kind)
    24 # x x:int x <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD
    25 # y y:int y <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD
    26 # args *args:int args <class 'inspect._empty'> <class 'int'> VAR_POSITIONAL
    27 # kwargs **kwargs:int kwargs <class 'inspect._empty'> <class 'int'> VAR_KEYWORD

     functools模块

    reduce函数

    1 import functools
    2 print(functools.reduce(lambda x, y: x+y, range(10), 100))  # 145, reduce接受3个参数,依次是双参函数,迭代器,起始值

    partial偏函数

     1 import functools
     2 import inspect
     3 
     4 
     5 def add(x, y=0):
     6     return x+y
     7 
     8 
     9 new_add = functools.partial(add, x=1, y=2)  # 保留原函数,重新定义函数型参的缺省值,生成新的函数
    10 print(new_add(y=5))  # 6
    11 print(inspect.signature(new_add))  # (*, x=1, y=2)

    lru_cache装饰器

    1 import functools
    2 
    3 
    4 @functools.lru_cache()  # 用内存空间换时间,本质是一个字典,记录数据,对重复计算的时候有一定优化
    5 def fib(n, a=1, b=1):
    6     return 1 if n < 3 else fib(n-1, b, a+b) + fib(n-2, b, a+b)
    7 
    8 
    9 print(fib(101))
  • 相关阅读:
    SpringBoot项目maven 打包时跳过测试
    scss 学习笔记
    万事都源于一个字:缘
    H To begin or not to begin 题解(思维)
    条件 题解(bitset优化floyd)
    Dima and Salad 题解(01背包变形)
    P1052 [NOIP2005 提高组] 过河 题解(dp+数论优化)
    A Simple Math Problem 题解(数论)
    威佐夫博弈
    P3951 [NOIP2017 提高组] 小凯的疑惑 题解(数论/结论题)
  • 原文地址:https://www.cnblogs.com/bgr1115/p/12784598.html
Copyright © 2011-2022 走看看