十一章、函数(下)
If the implementation is hard to explain, it's a bad idea.——The Zen of Python
一、返回值
在Python中,可以在函数体内使用return语句,为函数指定返回值。该返回值可以是任意类型,并且无论return语句出现在函数的什么位置,只要得到执行,就会直接结束该函数的执行,其语法格式如下:
result = return [value]
result: 用于保存返回结果,如果只返回一个值,那么result中保存的就是返回的一个值,该值可以是任意类型。如果返回多个值,那么result中保存的是一个元组。
value :可选参数,用于指定要返回的值,可以返回一个值,也可以返回多个值.
当函数中没有return语句时,或者省略了return语句的参数时,将返回None,即返回空值.
1 def funname(name): 2 nickname='' 3 if name =='雨霓': #如果输入的是雨霓 4 nickname=1210 5 elif name =='淑雪': 6 nickname=1184 7 elif name == '霜序': 8 nickname=220 9 else:10 nickname='无法找到对应信息'11 return nickname #返回对应名字喜欢的数字12 while True:13 name=input('请输入姓名:') #接收用户输入14 nickname=funname(name) #调用函数15 print('姓名:',name,'喜欢的数字:',nickname)16 输出:17 请输入姓名:雨霓18 姓名: 雨霓 喜欢的数字: 1210
二、变量的作用域
变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误,一般会根据变量的“有效范围”,将变量分为“局部变量”和“全局变量”
1.局部变量
局部变量是指函数内部定义并使用的变量,它只在函数的内容有效。即函数内部的名字只在函数运行时,才会创建,在函数运行之前或者运行完毕,所有的名字就都不存在了,所以,如果在函数外部使用函数内部定义的变量,就会抛出NameError异常.例如:定义一个名字为f_demo的函数,在该函数内部定义一个变量message(称为局部变量)并为其赋值,然后输出该变量,最后在函数体外部再次输出message变量,则会报错:
1 def f_demo():2 message="如果我是284,我的220在哪里?"3 print('局部变量message:',message)4 f_demo()5 print('局部变量message:',message)6 输出:7 File "C:/Users/Mortal/PycharmProjects/Python_Note/venv/test1.py", line 5, in8 print('局部变量message:',message)9 NameError: name 'message' is not defined
2.全局变量:
与局部变量对应,全局变量是能够作用于函数内外的变量。全局变量主要有以下两种情况:
(1) 如果一个变量,在函数外定义,那么不仅可以在函数外访问到,在函数内也可以访问到。在函数体以外的定义的变量是全局变量.示例如下:
1 message="如果我是284,我的220在哪里?" #全局变量2 def f_demo():3 print('局部变量message:',message) #在函数体内输出全局变量的值4 f_demo() #调用函数5 print('局部变量message:',message) #在函数体外输出全局变量的值6 输出:7 局部变量message: 如果我是284,我的220在哪里?8 局部变量message: 如果我是284,我的220在哪里?
当局部变量与全局变量重名时,对函数体的变量进行赋值后,不影响函数体外的变量。
(2)在函数体内定义,并且使用global关键字修饰后,该变量也可以为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以进行修改.
1 message="如果我是284,我的220在哪里?" #全局变量 2 print('函数体外:message=',message) #在函数体外输出全局变量 3 def f_demo(): 4 message='别人都关心你飞的高不高,我只关心你的翅膀好吃不好吃!' #局部变量 5 print('局部变量message:',message) #在函数体内输出局部变量的值 6 f_demo() #调用函数 7 print('函数体外message:',message) #在函数体外输出全局变量的值 8 9 输出:10 函数体外:message= 如果我是284,我的220在哪里?11 局部变量message: 别人都关心你飞的高不高,我只关心你的翅膀好吃不好吃!12 函数体外message: 如果我是284,我的220在哪里?
在函数内部定义的变量即使与全局变量重名,也不影响全局变量的值。如果想要在函数体内部修改全局变量的值,需要再定义局部变量时,使用global关键字修饰。
1 message="如果我是284,我的220在哪里?" #全局变量 2 print('函数体外:message=',message) #在函数体外输出全局变量 3 def f_demo(): 4 global message #将message声明为全局变量 5 message='别人都关心你飞的高不高,我只关心你的翅膀好吃不好吃!' #局部变量 6 print('局部变量message:',message) #在函数体内输出局部变量的值 7 f_demo() #调用函数 8 print('函数体外:message = :',message) #在函数体外输出全局变量的值 9 输出:10 11 函数体外:message= 如果我是284,我的220在哪里?12 局部变量message: 别人都关心你飞的高不高,我只关心你的翅膀好吃不好吃!13 函数体外:message = : 别人都关心你飞的高不高,我只关心你的翅膀好吃不好吃!
注意:尽管Python允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清那些是全局变量,那些是局部变量。
三、匿名函数
匿名函数是指没有名字的函数,它主要应用在需要一个函数,但是又不想费神去命名这个函数的场合,通常情况下,这种函数只能使用一次,在Python中,使用lambda表达式创建匿名函数,其语法格式如下:
result = lambda[arg1[,arg2,…,arg n]]:expression
result :用于调用lambda表达式
[arg1[,arg2,…,arg n]]: 可选参数,用于指定要传递的参数列表,多个参数使用逗号分隔
expression :必选参数,用于指定一个实现具体功能的表达式。如果有参数,那么在该表达式中将应用这些参数.
使用lambda表达式时,参数可以有多个,用逗号分隔,但是表达式只有一个,即只能返回一个值,而且也不能出现其他非表达式语句(for 或 while).
1 import math2 def circlearrea(r):3 result = math.pi*r*r4 return result5 r=106 print('半径为',r,'的圆面积为:',circlearrea(r))7 输出:8 半径为 10 的圆面积为: 314.1592653589793
使用lambda表达式:
1 import math2 r=103 result=lambda r:math.pi*r*r4 print('半径为',r,'的圆面积为:',result(r))5 输出:6 半径为 10 的圆面积为: 314.1592653589793
虽然使用lambda表达式比使用自定义函数的代码少一些。但是在使用lambda表达式时,需要定义一个变量,用于调用该lambda表达式。
Lambda表达式的首要用途是指定短小的回调函数.
emmm关于Python的内置函数就不做过多介绍,后面还会遇到的!