首页 > 解决方案 > 有关问题:Featured Enum 而不是 Switch ... 使用 lambda、枚举、闭包函数

问题描述

使用 lambda、枚举、闭包函数来代替 Switch 的精选枚举

对不起,我认为在看了一个关于以下内容的教程后我明白了一点:

编程术语:闭包 - 如何使用它们以及它们为何有用 https://www.youtube.com/watch?v=swU3c34d2NQ

我有一些问题,想在这里更好地理解代码。

  1. 在 pycharm 中:

    switcher = {                # info : dictionary
                ...
                11: eleven,
                12: twelve      # info : enum def twelve() -> str
     }
    

    如果我将鼠标悬停在 ' switcher' --> info 上:dictionary

    如果我将鼠标悬停在切换器的“元素”上-

    前任。十二个 12: twelve--> 信息:enum def twelve() -> str

    与这里的功能的连接,关系如何?

    12: twelve --> info : enum   def twelve() -> str
    

    为什么不使用() - 括号?

    就像调用一个函数 - by functionname() (在字典中)

    像这样?

    switcher = {  
                ...
                11: eleven(),
                12: twelve()
     }
    
  2. 在' switcher.get(argument, lambda: (" ...',

    • IF true : 返回值 : 参数 [if excist] 否则

      ELSE : [] 默认值

    • lambda' ' 在这里的目的或意义是什么?

      如果我用字符串替换它,它会引发错误。

      func = switcher.get(argument, 'Invalid month [1-12]') # TypeError: 'str' object is not callable

      我如何体验它,那只是为了创建一个功能。没有它是行不通的。

      那么为什么它必须是一个函数(lambda)?

      (如果我理解那部分是正确的)

      https://docs.python.org/3/library/stdtypes.html#dict.get

  3. 当我在函数“十二”中替换时

    def twelve(): return ("December")

    进入

    return ("December : {input}".format(input=argument))

    要显示论点:'论点'这会导致

    NameError: name 'argument' is not defined

    怎么可能给函数一个参数

    (我只使用了同一个变量,但它可能是任何其他类型的变量,实例、列表、字典、集合、字符串......)


编码

#!/usr/bin/env python3

def one():
   return "January"


def two():
   return "February"


def three():
   return "March"


def four():
   return "April"


def five():
   return "May"


def six():
   return "June"


def seven():
   return "July"


def eight():
   return "August"


def nine():
   return "September"


def ten():
   return "October"


def eleven():
   return "November"


def twelve():
# def twelve(argument):
   print(' --- in function :  twelve')
#   print(' --- in function :  twelve : {input}'.format(input=argument))    # results in a NameError: name 'argument' is not defined
   return ("December")
#   return ("December  : {input}".format(input=argument))                   # results in a NameError: name 'argument' is not defined

def numbers_to_months(argument):
   # switcher - dictionary with all months
   switcher = {
       1: one,
       2: two,
       3: three,
       4: four,
       5: five,
       6: six,
       7: seven,
       8: eight,
       9: nine,
       10: ten,
       11: eleven,
       12: twelve      # enum def twelve() -> str
       # 12: twelve(argument)

   }
   # get the function from switcher dictionary
   func = switcher.get(argument, lambda: ("Invalid month [1-12] : your input : {input}".format(input=argument)))

   # more information
   print(" - switcher.get : {info}  -  {arg}".format(info=switcher.get(argument), arg=argument))
   print(" - func : {info}  -  {arg}".format(info=func, arg=argument))

   # execute the function
   print(func())
   print()


numbers_to_months(13)

numbers_to_months(3)

numbers_to_months(12)

numbers_to_months(31)


Michail Highkhan 的解决方案,谢谢。

从一到十二的每个函数都必须接受参数/参数

  ...
    def twelve(argument):
        print(' --- in function :  twelve : {input}'.format(input=argument))
        ...


    func = switcher.get(argument, lambda arg : ("Invalid month [1-12] : your input : {input}".format(input=argument)))



...
print(func(78))

原始代码/教程:https ://jaxenter.com/implement-switch-case-statement-python-138315.html

标签: pythonenumsswitch-statementclosures

解决方案


  1. python中有一个东西,叫做函数对象。您在声明新功能时创建一个。

    def func(arg):
        print(arg)
        return arg
    

所以现在func- 是对象。您可以将它存储在某个地方,例如在字典中(就像您所做的那样)并稍后使用它。你可以调用它func(1)并得到一个结果。Pycharm 足够聪明,可以找到您声明方法的位置并向您显示有关它的信息。

  1. 您的切换器必须返回函数对象,即稍后调用

    print(func()) # << here, see brackets after func
    

所以默认对象也必须是函数对象。Lambda 只是创建它的另一种方式。看这里https://book.pythontips.com/en/latest/lambdas.html

  1. 您可以将参数传递给函数,但这不是重点。这里的函数 IS 参数,通过键从 switcher 中获取并传递给print.

UPD 您可以在调用它时将参数传递给您之前存储的函数。让我们用我之前的例子来试试:

d = {'func': func} # store function
result = d['func'](1) # get stored function and call it with argument
print(result)

输出:

1

推荐阅读