zoukankan      html  css  js  c++  java
  • Python函数式编程,函数装饰器

    函数式编程

    1. 定义:用一系列函数解决问题。

    -- 函数可以赋值给变量,赋值后变量绑定函数。

    -- 允许将函数作为参数传入另一个函数。

    -- 允许函数返回一个函数。

    2. 高阶函数:将函数作为参数或返回值的函数。

    函数作为参数

    将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则。

     1 def fun01():
     2   print("fun01执行执行喽")
     3 
     4 # 有小括号,是调函数,a变量得到是函数返回值
     5 # a = fun01()
     6 # 没小括号,没调函数,a变量得到是函数地址
     7 a = fun01
     8 # 通过变量a,调用函数fun01.
     9 a()
    10 #fun01执行执行喽
    函数式编程1
     1 def fun03():
     2   print("fun03执行执行喽")
     3 
     4 def fun04():# 定义很多具体函数  [封装]
     5   print("fun04执行执行喽")
     6 
     7 # func 代表(抽象)  fun03  fun04  [继承]
     8 def fun02(func):
     9   print("fun02的逻辑")
    10   func()# 调用func执行....  [多态]
    11 
    12 fun02(fun03)
    13 #fun02的逻辑
    14 #fun03执行执行喽
    15 fun02(fun04)
    16 #fun02的逻辑
    17 #fun04执行执行喽
    函数式编程2

    lambda 表达式

    1.定义:是一种匿名方法。

    2.作用:作为参数传递时语法简洁,优雅,代码可读性强。

    3.语法

    -- 定义:

    变量 = lambda 形参: 方法体

    -- 调用:

    变量(实参)

    4.说明:

    -- 形参没有可以不填

    -- 方法体只能有一条语句,方法体必须有返回值,且不支持赋值语句。

    lambda 表达式
    匿名方法
    lambda 参数列表: 方法体

    普通方法
    def 方法名称(参数列表):
    方法体
    相对与普通方法的优缺点:
    优点:省略方法名称,随时创建和销毁,降低了程序间耦合度
    缺点:由于没有名称,所以不能重复使用.

     1 list01 = [4,5,6,7,89]
     2 def find(list_targt, func):
     3   for item in list_targt:
     4     if func(item):
     5       yield item
     6 #普通方法
     7 def condition01(item):
     8   return item % 2 == 0
     9 for item in find(list01, condition01):
    10   print(item)
    11 
    12 # 使用 lambda 代替普通方法
    13 for item in find(list01, lambda item:item % 2 == 0):
    14   print(item)
    lambda 表达式

    内置高阶函数

    1.map(函数,可迭代对象):使用可迭代对象中的每个元素调用函数,将返回值作为新可迭代对象元素;返回值为新可迭代对象。

    2.filter(函数,可迭代对象):根据条件筛选可迭代对象中的元素,返回值为新可迭代对象。

    3.sorted(可迭代对象,key = 函数,reverse = bool):排序,返回值为排序结果。

    4.max(可迭代对象,key = 函数):根据函数获取可迭代对象的最大值。

    5.min(可迭代对象,key = 函数):根据函数获取可迭代对象的最小值。

    函数作为返回值

    逻辑连续,当内部函数被调用时,不脱离当前的逻辑。

    闭包

    1.三要素:

    -- 必须有一个内嵌函数。

    -- 内嵌函数必须引用外部函数中变量。

    -- 外部函数返回值必须是内嵌函数。

    2.语法

    -- 定义:

    def 外部函数名(参数):

    外部变量

    def 内部函数名(参数):

    使用外部变量

    return 内部函数名

    -- 调用:

       变量 = 外部函数名(参数)

       变量(参数)

     1 def fun01():
     2   a = 1  # 对于fun02 而言,属于外部嵌套作用域
     3 
     4   def fun02():
     5     print(a)
     6 
     7   return fun02
     8 
     9 # 闭包:
    10 # 内部函数可以使用外部嵌套变量,外部函数执行完毕后,
    11 # 没有释放内存,而是等待内部函数执行结束.
    12 func = fun01()# 调用外部函数
    13 func()# 再调用内部函数
    闭包
     1 def give_gife_money(money):
     2   """
     3     获取压岁钱
     4   """
     5   print("得到压岁钱:",money)
     6   def child_buy(target,price):
     7     """
     8       孩子需要买东西
     9     """
    10     nonlocal money
    11     if money >=  price:
    12       money -= price
    13       print("孩子需要花%d钱,买%s"%(price,target))
    14     else:
    15       print("钱不够")
    16   # 希望外部可以调用内部函数
    17   return child_buy
    18 
    19 action_buy = give_gife_money(30000)
    20 action_buy("飞机",1000)
    21 action_buy("手机",10000)
    22 action_buy("房子",10000000)
    23 #得到压岁钱: 30000
    24 #孩子需要花1000钱,买飞机
    25 #孩子需要花10000钱,买手机
    26 #钱不够
    闭包案例

    3.定义:在一个函数内部的函数,同时内部函数又引用了外部函数的变量。

    4.本质:闭包是将内部函数和外部函数的执行环境绑定在一起的对象。

    5.优点:内部函数可以使用外部变量。

    6.缺点:外部变量一直存在于内存中,不会在调用结束后释放,占用内存。

    7.作用:实现python装饰器。

    函数装饰器decorators

    1.定义:在不改变原函数的调用以及内部代码情况下,为其添加新功能的函数。

    语法

    2.def 函数装饰器名称(func):

        def 内嵌函数(*args, **kwargs):

            需要添加的新功能

            return func(*args, **kwargs)

    return wrapper

    @ 函数装饰器名称

    def 原函数名称(参数):

    函数体

    原函数(参数)

    3.本质:使用“@函数装饰器名称修饰原函数,等同于创建与原函数名称相同的变量,关联内嵌函数;故调用原函数时执行内嵌函数。

    原函数名称 = 函数装饰器名称(原函数名称)

    4.装饰器链:

    一个函数可以被多个装饰器修饰,执行顺序为从近到远。

     1 def print_func_name(func):  # 提供旧功能
     2   def wrapper(*args, **kwargs):  # 包装
     3     print(func.__name__)  # 新功能
     4     return func(*args, **kwargs)  # 旧功能
     5 
     6   return wrapper
     7 
     8 
     9 @print_func_name  # say_hello = print_func_name(say_hello)
    10 def say_hello():
    11   print("hello")
    12   return "ok"
    13 
    14 
    15 @print_func_name
    16 def say_goodbye(name):
    17   print(name, "goodbye")
    18 
    19 
    20 result = say_hello()
    21 print(result)
    22 say_goodbye("张无忌")
    23 #--------------------------------
    24 #say_hello
    25 #hello
    26 #ok
    27 #say_goodbye
    28 #张无忌 goodbye
    函数装饰器
  • 相关阅读:
    【Linux】【Shell】【Basic】文件查找locate,find
    【Linux】【Shell】【text】Vim
    【Linux】【Shell】【text】文本处理工具
    【Linux】【Shell】【text】grep
    【Linux】【Basis】用户、组和权限管理
    什么是高并发;超发的解决思路(悲观锁与乐观锁);高并发与多线程的关系--持续更新(十四)
    线程池的应用(十三)
    线程池基本概念(十二)
    ThreadLocal(十一)
    tomcat的单例多线程代码示例(十)
  • 原文地址:https://www.cnblogs.com/maplethefox/p/10920951.html
Copyright © 2011-2022 走看看