您的位置:首页 > 编程语言 > Python开发

Python:函数的返回值,变量的作用域,lambda函数

2020-06-28 05:27 936 查看

(1)函数的返回值

可以使用return语句得到函数的返回值:
return [value]

#案例;某商场购物打折,不满500打9.5折,满500打9折,满1000打8折,满2000打7折,满3000打6折
def fun_checkout(money):
‘’‘功能:计算商品合计金额并进行折扣处理
money:保存商品金额的列表
返回值:商品的合计金额和折扣后的金额
‘’’
money_before=sum(money) #计算出打折前的总金额
money_discount=money_before
if money_before < 500: #不满500打9.5折
money_discount=’{:.2f}’.format(money_before0.95)
if 500<= money_before < 1000: #满500打9折
money_discount=’{:.2f}’.format(money_before0.9)
if 1000<= money_before < 2000: #满1000打8折
money_discount=’{:.2f}’.format(money_before0.8)
if 2000<= money_before < 3000: #满2000打7折
money_discount=’{:.2f}’.format(money_before0.7)
if 3000<= money_before: #满3000打6折
money_discount=’{:.2f}’.format(money_before*0.6)
return money_before,money_discount
#调用函数
print(’\n开始结算…\n’)
list_money=[]
while True:
inmoney=float(input(‘请输入商品金额(输入0表示输入完毕):’))
if int(inmoney)==0:
break #输入0表示输入完毕,退出循环
else:
list_money.append(inmoney) #生成商品金额的列表
money=fun_checkout(list_money)#因为有2个返回值,因此得到一个元组
print(‘商品打折前总金额:’,money[0],‘商品打折后应付总金额:’,money[1])
#运行结果:
开始结算…

请输入商品金额(输入0表示输入完毕):23.5
请输入商品金额(输入0表示输入完毕):78.2
请输入商品金额(输入0表示输入完毕):283
请输入商品金额(输入0表示输入完毕):0
商品打折前总金额: 384.7 商品打折后应付总金额: 365.46

(2)局部变量和全局

变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出错。
(1)局部变量:当函数内部定义了一个变量,无论是作为形参,或是另外定义的变量,它都只在这个函数的内部有效,这个函数体就是这个变量的作用域。即使函数外有和它名称相同的变量,也没有什么关联。像这样在函数内部定义的变量称为“局部变量”。
(2)全局变量:函数内、函数外都能访问,都有效。
看一下下面这个例子:
def func(x):
print('x is in the left: ',x)
x=5 #函数内部重新赋值为5
print('x is in the right: ',x)

x=20
func(x) #调用函数
print('x is in the middle: ',x)

运行结果为:
x is in the left: 20
x is in the right: 5
x is in the middle: 20

注意到,变量X在函数内部被重新赋值为5。但在调用 函数后,X的值依然为20。为什么呢?

回到这个例子,在函数func外部,定义的变量X,赋值为20,作为参数传给了函数func。而在函数func内部,变量X为形参,它的作用域是函数内部,它与外面的X没有关系(尽管名称相同),只不过它的初始值是由外面的那个X传递过来的。所以,虽然函数内部的X背重新赋值为5,但不会影响外面的X的值,因此运行最后一行指令时,X的值还是20.

不过,有时候我们希望能够在函数内部改变一些变量的数值,并且这种改变同样适用于函数外部,怎么办呢?——此时,“global”出场了:在变量名前加上关键字global,这样其作用域就不再局限于函数内部,而是全局的作用域。

还是刚刚那个例子:
def func(): #注意:这里不要写成func(x)
global x #x为全局变量
print('x is in the left: ',x)
x=5
print('x is in the right: ',x)

x=20
func()
print('x is in the middle: ',x)

运行结果为:
x is in the left: 20
x is in the right: 5
x is in the middle: 5

此时,函数func不再提供参数调用。而是通过global x告诉 程序:X是个全局变量了。此时,函数内部的X和外部的X就成为了同一个变量,因此当X被重新赋值为5后,外部的X也随之改变为5。

(3)lambda表达式

lambda表达可以看做是一种匿名函数。它可以让您快速定义一个极度简洁的单行函数,可以把这个对象赋值给一个变量进行调用。
lambda表达式的语法格式:
lambda参数列表:表达式
注意:定义lambda表达式时,参数列表哪里没有括号,返回值前没有return关键字,也没有函数名称。

案例:计算圆的周长
import math
def yuanzhouchang®:
return 2math.pir
r=2
print(‘圆的周长为:’,yuanzhouchang®)

运行结果为:
圆的周长为: 12.566370614359172

该代码可以用lambda表达式来写:
import math
r=2
result=lambda r :2math.pir
print(‘圆的周长为:’,result®) #该句中,不能直接写result,要写成result®。

可以看出,lambda表达式比def更加简洁,但是它的主体只能是一个表达式,不能是代码块,表达中不能有for,while语句,也不能出现如print这样的命令,因此lambda表达式能表达的逻辑有限。事实上,任何使用lambda表达式的地方都能用def函数来代替,尤其是在一些需要重复使用同一函数的地方,def更方便一些。而对于像sort,filter等需要内嵌函数的方法,lambda表达式就会比较合适。

案例:将商品按照打折后的价格进行排序,若打折后的价格相等,则按折扣幅度进行排序。

goodsinfo=[('N95口罩10个',76,110),('金龙鱼大米',76,87),('空气净化器',520,880),('免洗消毒液',22.5,26)]
#商品列表,分别涵盖了商品名称,折扣后价格,原价
print('商品信息:\n',goodsinfo,'\n')
goodsinfo.sort(key = lambda x :(x[1],x[1]/x[2]))#X代表传入商品信息的元组。给出排序规则
print('排序后的商品信息:\n',goodsinfo,'\n')

运行结果为:
商品信息:
[(‘N95口罩10个’, 76, 110), (‘金龙鱼大米’, 76, 87), (‘空气净化器’, 520, 880), (‘免洗消毒液’, 22.5, 26)]

排序后的商品信息:
[(‘免洗消毒液’, 22.5, 26), (‘N95口罩10个’, 76, 110), (‘金龙鱼大米’, 76, 87), (‘空气净化器’, 520, 880)]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: