Python学习(13)--Lambda表达式和switch语句的实现

28 篇文章 0 订阅
24 篇文章 1 订阅

1.Lambda表达式定义匿名函数

         在Python中,Lambda表达式是用来快速定义一个最小函数,这个函数小到什么程度呢,小到只有一行代码,一条语句,在Python中有时候我们为了提高程序的可读性,或者一个功能块小到我们并不需要定义一个函数来实现它的时候就用到了Lambda表达式,那么什么又是Lambda表达式呢?下面我们通过一个代码例子来了解下:
def f(x,y):
    return x*y
g=lambda x,y:x*y
print(g(2,3))
        如上所示,开始我们定义了一个常见的函数f(x,y),这个函数的功能很简单,就是返回两个形式参数x和y的乘积,函数的名字为f。lambda x,y:x*y一句就定义了一个极简的函数,这个函数是匿名的,参数列表为x和y,返回值就是x*y,不需要特定的return语句返回,lambda表达式返回的是一个函数对象,这个函数对象我们用g来接收它,当调用这个函数时,也是用g这个函数对象来调用,如g(2,3)就是调用lambda表达式返回的函数。以下是对一个lambda表达式各个部分的详细注解.
      
       Lambda表达式更加精简,有时候我们可能并不需要调用一个函数模块很多次,或者这个函数的命名并不容易,而这个函数模块又特别简单,简单到只需要一条语句,这个时候我们就可以使用lambda表达式构造一个匿名函数对象,lambda表达式返回的也是一个函数对象,可以看到代码如下:
g=lambda x,y:x*y;
print(g)
       如上我们通过lambda表达式构造了一个匿名函数对象并打印它,打印结果如下:
       
       通过打印结果可以看到,function指的是这是一个函数,是通过lambda表达式构造出来的,后面是这个函数对象所在的内存地址。
2.lambda表达式应用案例
  接下来我们举一个例子,来更好的来了解lambda表达式。比如一个程序例子求整数n的阶乘,我们先来了解下之前惯用的方法,使用递归函数的这种方法代码如下:
def f(n):
    if n==0:
        return 1
    else:
        return n*f(n-1)
print(f(5))
   代码的打印结果如下:
     
其实递归的过程就是一个先入栈,后出栈的过程,栈这种数据结构的特点就是先进后出,我们可以看下面这个图来了解这种递归过程,图解如下:
   
   如上图所示,fun(5)=5*fun(4),但是这个时候并不知道fun(4)是多少,fun(5)先入栈,fun(4)调用函数,fun(4)=4*fun(3),这个时候需要求fun(3),fun(3)先入栈,fun(3)=3*fun(2),又要求fun(2),fun(2)入栈,fun(2)=2*fun(1),fun(1)=1*fun(0),紧接着fun(1),fun(0)依次入栈,此时从栈底到栈顶依次是fun(5),fun(4),fun(3),fun(2),fun(1),fun(0).
   当n=0时,fun(0)=1,fun(0)出栈;fun(1)=1*fun(0),fun(1)=1,fun(1)出栈;fun(2)=2*fun(1),fun(2)=2,fun(2)出栈;fun(3)=3*fun(2),fun(3)=6,fun(3)出栈;fun(4)=4*fun(3),fun(4)=24,fun(4)出栈;fun(5)=5*fun(4),fun(5)=120,fun(5)
出栈。最后fun(5)=120,打完收工。出栈次序为fun(0),fun(1),fun(2),fun(3),fun(4),fun(5)。
   这种不断的递归调用有两个缺点,一是需要不断入栈出栈,很是耗费内存,而且即使现在的内存优化机制有多么的好,如果让程序员去编写代码递归调用函数也是很耗脑力的。
   下面我们用lambda表达式来解决这个n的阶乘问题,代码如下:
from functools import reduce
l={1,2,3,4,5}
f=lambda x,y:x*y
result=reduce(f,l)
print(result)
   代码的运行结果与上图是一样的,我们主要讲解下lambda表达式起到的作用与reduce函数的功能.
   首先我们定义一个序列l,其中l其实就是求n的阶乘需要用到的数,这里我们拿5的阶乘来举例,f是lambda表达式返回的函数对象,这个函数有两个参数x和y,函数的返回值就是x和y的乘积。
   然后,我们使用一个叫做reduce的函数,这个函数的功能就是,把序列l中的值依次取出来,作为f的实参并调用函数f,期间函数f的返回结果,也会作为实参与序列l的元素一起作为实参,调用函数f,最后直到l的元素全部用完,这么说可能不好理解,没关系,我们用下面的详细步骤可以很清楚的了解整个过程.如下:
  (1)l前2个元素作为实参,调用f,f(1,2)=2,返回结果2
  (2)返回结果2与l中的第3个元素作为实参,调用f,f(2,3)=6,返回6
  (3)返回结果6与l中的第4个元素作为实参,调用f,f(6,4)=24,返回24
  (4)返回结果24与l中的第5个元素作为实参,调用f,f(24,5)=120,返回120
  (5)最后l中没有元素,最终返回结果120,result=120,结束
  可以看到,在求n得阶乘过程中,我们把其中最简单的乘操作抽调出来,并用lambda来实现这个简单的操作,其他具体如何乘的过程,我们都交给了Python中预定义的函数reduce,编程简单可行,可读性强,可以说比起递归节省了不少脑力。
3.Switch语句的实现
      相信大家在学习C语言时都学过switch语句,不过Python中并没有switch语句,使用switch语句,需要用字典来实现它的结构,试想一下如果我们在编程时不使用switch语句,就只能使用if...elif...else这种判断结构来进行判断筛选,直到条件符合,执行需要执行的代码块,下面我们使用这种if...elif...else结构来实现switch结构,代码如下:
     
def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def mul(x,y):
    return x*y
def divide(x,y):
    return x/y
def operator(o,x,y):
    if o=='+':
        print(add(x,y))
    elif o=='-':
        print(subtract(x,y))
    elif o=='*':
        print(mul(x,y))
    elif o=='/':
        print(divide(x,y))
    else:
        pass
operator('/', 5, 2)
     如上代码所示,我们实现了一个简单的计算器程序,程序的主要功能是计算两个数的加减乘除运算,4个函数add(x,y),subtract(x,y),mul(x,y),divide(x,y)分别实现加减乘除运算,函数operator(o,x,y)是使用if...elif...else结构实现switch语句,通过多级判断用户运算符,调用相应的函数,实现简单的计算器功能.
    最后,operator('/',5,2),调用计算器程序,实现5/2。打印结果如下:
    
       这种判断结构实现switch语句虽然可行,但是其缺点也不可避免.主要有两点,一是代码看起来并不简洁明了,结构混乱,可读性也比较差;二是程序可能需要进行多次判断,才能确定相应运算操作,比如operator('/',5,2),需要进行4次判断才能确定调用函数divide(x,y),这种判断结构是很耗费内存的。
      下面我们来使用字典来实现switch语句。字典元素都是键值对,那么如何确定字典元素的键和值呢?先看如下代码:
      
def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def mul(x,y):
    return x*y
def divide(x,y):
    return x/y
print(add)
print(subtract)
print(mul)
print(divide)
        代码运行结果如下:
        
       可以看出,打印每个函数名,结果打印出的是一个个的函数对象,function代表一个函数,后面是函数名,以及这个函数对象在内存中的地址,为什么说是一个个函数对象呢?因为通过打印结果可以看出其在内存空间中的地址,既然内存为他分配了空间,说明他是内存中的实例,即对象。
       既然我们通过函数名可以得到函数对象,那我们用字典实现switch语句,初始化字典的键值对可以这样编写代码,代码如下:
operator={'+':add,'-':subtract,'/':divide,'*':mul}
print(operator['+'](5,2))
print(add(5,2))
       如上代码所示,我们初始化字典时,把运算符作为字典的键,而函数对象作为字典的值,这样我们就可以通过字典的键,也就是运算符,获取到相应的函数对象,并调用这个函数对象,比如operator['+'],我们获取到了函数对象add,即operator['+']==add,而通过函数对象调用函数时,add(5,2)与operator['+'](5,2)是等价的,打印结果如下:
       
       在了解了字典在实现switch语句时如何初始化字典,下面我们就完完整整的实现这个计算器程序,代码如下:
          
def add(x,y):
    return x+y
def subtract(x,y):
    return x-y
def mul(x,y):
    return x*y
def divide(x,y):
    return x/y
operator={'+':add,'-':subtract,'/':divide,'*':mul}
def fun(o,x,y):
    print(operator.get(o)(x,y))
fun("/",5,2)
         我们定义了一个函数fun(o,x,y),形参o为运算符,x和y为操作数,operator.get(o)(x,y),就是通过运算符获取字典里初始化好的函数对象,并调用函数实现运算,这样就实现了switch语句,避免了之前if...elif...else结构需要多重判断耗费内存的问题,真正实现一步到位,并且把数据部分与运算部分分割开来,代码的可读性更强。
       代码的运行结果如下:
       
         
      最后,大家看我的博客可能会觉得有些地方说的过分的细,甚至有些啰嗦,其实我的本意是在前期我们一同把Python的基础打好,这样以后我们学习一些框架就会得心应手,比如TensorFlow和caffe这些数据分析和处理的框架。其实无论学习Python或者这些框架,我们最终的目的都是要实现算法的思想,比如机器学习算法或者深度学习模型,"工欲善其事必先利其器",打好这些编程基础可以让我们在后面学习算法时,只注重算法本身的思想,而不用再把精力耗费在编程上,毕竟仰望星空前需要脚踏实地。
      下一节,我们将会介绍内建函数,敬请期待。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Lambda表达式Python中的一种匿名函数,它可以在一行代码中定义一个函数。Lambda表达式通常用于简单的函数,它们可以作为参数传递给其他函数或作为返回值返回。 Lambda表达式的语法如下: lambda 参数列表: 表达式 其中,参数列表是用逗号分隔的形式参数,表达式是函数的返回值。 例如,下面的代码定义了一个简单的Lambda函数: f = lambda x: x * x 这个函数接受一个参数x,并返回x的平方。我们可以像调用普通函数一样调用它: print(f(5)) # 输出25 Lambda表达式还可以用于定义匿名函数,例如: g = lambda x, y: x + y 这个函数接受两个参数x和y,并返回它们的和。我们可以像调用普通函数一样调用它: print(g(2, 3)) # 输出5 总之,Lambda表达式Python中一种非常方便的函数定义方式,它可以让我们更加简洁地编写代码。 ### 回答2: Lambda表达式Python函数中的一种简洁方式,它可以定义在一行内的匿名函数。Lambda使用关键字“lambda”来表示,后面跟随一个或多个参数,分隔符为逗号,然后是冒号和一个表达式。返回值是该表达式的结果。 Lambda表达式的基本语法如下: lambda arguments: expression 其中arguments参数可以是0个、1个或多个参数,expression表达式是lambda函数的返回值。 Lambda表达式的使用场景比较广泛,通常用于函数式编程、过滤器(filter)、映射器(map)、排序器(sort)等操作中。 例如,我们可以使用lambda表达式来定义一个简单的函数: x = lambda a : a + 10 print(x(10)) # 输出结果为20 上述例子中,lambda表达式定义了一个参数“a”,表达式为“a+10”,即函数返回值为传入参数a加上10。 当需要对一个列表中的元素进行操作时,我们可以使用map函数结合lambda表达式实现: lst = [1, 3, 5, 7] result_lst = list(map(lambda x:x*2, lst)) print(result_lst) # 输出结果为[2, 6, 10, 14] 上述例子中,lambda表达式定义了一个参数“x”,表达式为“x*2”,即将列表中的每个元素乘以2。map函数将该lambda表达式应用于lst中的每个元素,返回一个新的列表。 Lambda表达式比较适用于简单的函数定义和一些简单的操作,但对于较为复杂的任务或需要频繁使用的代码,建议还是使用函数进行定义。 ### 回答3: Python是一种广泛使用的编程语言,而函数是Python编程的重要部分。在Python中,函数是一个特殊的代码块,可以接受一些输入(参数),并在执行一些操作后返回输出。其中,lambda表达式是定义函数的一种不同方式。 lambda表达式也被称为匿名函数,因为它们可以定义一个没有名称的函数。与普通函数不同,lambda函数只能包含一个表达式,而不是一条语句块。语法如下: lambda 参数: 表达式 下面是一个简单的例子: add = lambda x, y: x + y print(add(2, 3)) # 输出5 在这个例子中,lambda函数的定义是add = lambda x, y: x + y,其中参数是x和y,表达式是x + y。定义后,我们可以像使用普通函数一样使用它。 lambda函数有许多用途。其中之一是作为其他函数的参数,例如在sort()函数中进行排序。例如,我们可以使用lambda函数按照列表中每个元素的第二个元素进行排序。实现方式如下: a = [(1, 2), (4, 1), (9, 10), (13, -3)] a.sort(key=lambda x: x[1]) # 按每个元组的第二个元素进行排序 print(a) 输出结果为:[(13, -3), (4, 1), (1, 2), (9, 10)] 总之,Lambda表达式Python语言中一个十分有用的特性,它允许我们创建匿名函数,使代码变得更加简洁和易读。在实际编程中,可以将其用于诸如函数参数传递、过滤器、排序等许多编程任务中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值