有关以下内容的问题:以枚举代替开关。。。使用lambda、enum、closures函数

2024-07-06 18:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

特色枚举而不是开关。。。通过使用lambda、enum、closures函数

抱歉,我想在看了一个关于以下内容的教程后,我有点理解了:

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

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

  1. 在pycharm中:

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

    如果我将鼠标悬停在“switcher”上-->;信息:dictionary

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

    例十二 12: twelve-->;信息:enum def twelve() -> str

    这里的函数的连接和关系是如何建立的?

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

    为什么和父母在一起是不合适的

    就像通过functionname()调用函数一样 (在字典里)

    像这样

    switcher = {  
                ...
                11: eleven(),
                12: twelve()
     }
    

  2. 在“switcher.get(argument, lambda: (" ...”中

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

      其他:[]默认值

    • 这里“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. 当我在函数“12中替换时

    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的解决方案,谢谢。

每个函数1到12都必须接受参数/参数

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


Tags: lambda函数infoformatinput参数getreturn
1条回答
网友
1楼 · 发布于 2024-07-06 18:27:57
  1. python中有一种东西,叫做函数对象。在声明新函数时创建一个

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

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

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

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

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

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

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

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

输出:

1

相关问题 更多 >