Python:函数的返回值,变量的作用域,lambda函数
(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)]
- Python 语言基础五_描述函数定义、函数参数、函数的调用、lambda表达式、变量的作用域
- Python之偏函数,变量的作用域,回调、返回、递归函数与闭包,os模块。
- python 函数的参数、(匿名、zip、偏、回调、返回、递归)函数、修饰器、变量的作用域的操作说明
- 当Python的lambda表达式遇上变量作用域
- Python返回函数_函数闭包_lambda匿名函数
- python 函数变量作用域和变量类型解说
- Python之包、模块、函数与变量作用域(四)
- 偏函数 , 变量的作用域 , 回调函数 , 返回函数 , 闭包 , 递归函数 os模块
- Python函数与变量作用域
- Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
- Python_函数式编程_函数声明调用_函数的参数_函数的变量_函数的返回值_函数互相调用_递归函数_万能参数(7)
- python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)
- python函数-变量作用域
- python 函数 本地变量 函数的命名空间 变量的作用域
- python函数学习与变量作用域
- python 中模块(model)概念的引入 以及 函数变量的作用域
- Python模块中的变量和函数的作用域
- python学习笔记三:函数及变量作用域
- Python成为专业人士笔记-返回变量形式函数- str() 和 repr()
- python[变量作用域-函数-闭包-装饰器-生成器]