Python函数
在Python中,提供了函数,我们可以把实现某一段代码定义为一个函数,然后在需要使用时,随时调用即可,十分方便。
- 掌握如何创建和调用函数
- 了解形式参数和实际参数
- 掌握如何指定位置参数和关键字参数
- 掌握如何为参数设置默认值
- 掌握可变参数的应用
- 掌握如何为函数返回值
- 了解变量的作用域
- 掌握如何使用lambda表达式创建匿名函数
1、函数的创建和调用
1.1、创建一个函数
创建函数也称为定义函数,使用def关键字实现,语法格式为:
def functionname([parameterlist])
['''commenrs''']
[functionbody]
其中:functionname:函数名称;parameterlist为可选参数,用于指定向函数中传递的参数;’’‘commenrs’’'为可选参数,表示为函数指定注释;functionbody为可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。
1.2、调用函数
调用函数也就是执行函数,调用函数的语法格式为:
functionname([parametersvalue])
其中,functionname为函数名称;parametersvalue为可选参数,用于指定各个参数的值。
例如:输出每日一贴。
def function_tips():
'''功能:每天输出一条励志文字
'''
import datetime # 导入日期时间类
# 定义一个列表
mot = ["坚持下去不是因为我很坚强,而是因为我别无选择",
"含泪播种的人一定能笑着收获",
"做对的事情比把事情做对重要",
"命运给予我们的不是失望之酒,而是机会之杯",
"明日永远新鲜如初,纤尘不染",
"求知若饥,虚心若愚",
"成功将属于那些从不说“不可能”的人"]
day=datetime.datetime.now().weekday() # 获取当前星期
print(mot[day]) # 输出每日一帖
#*****************************调用函数***********************************#
function_tips() # 调用函数
运行结果为:
2、参数传递
在调用函数时,大多是情况下,主调函数和被调函数之间有数据传递关系,这就是有参数的函数形式,
2.1、了解形式参数和实际参数
在使用函数时,经常会用到形式参数和实际参数,两者都叫做参数。
- 形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”;
- 实际参数:在调用一个函数时,函数名后面括号中的参数为“实际参数”,也就是将函数的调用者提供给函数的参数称为实际参数。
例如:根据身高、体重计算BMI指数。
def fun_bmi(person,height,weight):
'''功能:根据身高和体重计算BMI指数
person:姓名
height:身高,单位:米
weight:体重,单位:千克
'''
print(person + "的身高:" + str(height) + "米 \t 体重:" + str(weight) + "千克")
bmi=weight/(height*height) # 用于计算BMI指数,公式为“体重/身高的平方”
print(person + "的BMI指数为:"+str(bmi)) # 输出BMI指数
# 判断身材是否合理
if bmi<18.5:
print("您的体重过轻 ~@_@~\n")
if bmi>=18.5 and bmi<24.9:
print("正常范围,注意保持 (-_-)\n")
if bmi>=24.9 and bmi<29.9:
print("您的体重过重 ~@_@~\n")
if bmi>=29.9:
print("肥胖 ^@_@^\n")
#*****************************调用函数***********************************#
fun_bmi("路人甲",1.83,60) # 计算路人甲的BMI指数
fun_bmi("路人乙",1.60,50) # 计算路人乙的BMI指数
运行结果为:
2.2、位置参数
位置参数也称为必备参数,是必须按照正确的顺序传到函数中,即调用时的数量和位置必须和定义时的一样,
①数量必须与定义时一致;
②位置必须与定义时一致;
2.3、关键字参数
关键字参数是指使用形式参数的名字来确定输入的参数值,通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。
2.5、可变参数
在Python中,还可以定义可变参数,可变参数也称为不定长参数,即传入函数中的实际参数可以是定义可变参数,主要有两种形式,一种是parameter,另一种是**parameter。
①parameter
这种形式表示接收任意多个实际参数并将其放到一个元组中,例如,定义一个函数,让其可以接收任意多个实际参数。
例如:根据身高、体重计算BMI指数;
def fun_bmi_upgrade(*person):
'''功能:根据身高和体重计算BMI指数(升级版)
*person:可变参数该参数中需要传递带3个元素的列表,
分别为姓名、身高(单位:米)和体重(单位:千克)
'''
for list_person in person:
for item in list_person:
person = item[0] # 姓名
height = item[1] # 身高(单位:米)
weight = item[2] #体重(单位:千克)
print("\n" + "="*13,person,"="*13)
print("身高:" + str(height) + "米 \t 体重:" + str(weight) + "千克")
bmi=weight/(height*height) # 用于计算BMI指数,公式为“体重/身高的平方”
print("BMI指数:"+str(bmi)) # 输出BMI指数
# 判断身材是否合理
if bmi<18.5:
print("您的体重过轻 ~@_@~")
if bmi>=18.5 and bmi<24.9:
print("正常范围,注意保持 (-_-)")
if bmi>=24.9 and bmi<29.9:
print("您的体重过重 ~@_@~")
if bmi>=29.9:
print("肥胖 ^@_@^")
#*****************************调用函数***********************************#
list_w = [('绮梦',1.70,65),('零语',1.78,50),('黛兰',1.72,66)]
list_m = [('梓轩',1.80,75),('冷伊一',1.75,70)]
fun_bmi_upgrade(list_w ,list_m) # 调用函数指定可变参数
运行结果为:
②、**parameter
这种形式表示接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中,例如,定义一个函数,让其可以接收任意多个显示赋值的实际参数。
def printsign(**sign):
print()
for key,value in sign.items():
print("["+ key +"]的星座是:"+ value)
printsign(绮梦="水瓶座",冷伊="射手座")
printsign(香凝="双鱼座",戴兰="双子座",冷伊一="射手座")
运行结果为:
3、返回值
在Python中,可以在函数体内使用return语句为函数指定返回值,该返回值可以是任意类型,并且无论return语句出现在函数的什么位置,只要得到执行,就会直接结束函数的执行。语法格式为:
return [value]
例如:用Python模拟顾客结账功能——计算优惠后的实付金额。
def fun_checkout(money):
'''功能:计算商品合计金额并进行折扣处理
money:保存商品金额的列表
返回商品的合计金额和折扣后的金额
'''
money_old = sum(money) # 计算合计金额
money_new = money_old
if money_old >= 500 and money_old <1000 : # 满500可享受9折优惠
money_new = '{:.2f}'.format(money_old*0.9)
elif money_old >=1000 and money_old <= 2000: # 满1000可享受8折优惠
money_new = '{:.2f}'.format(money_old*0.8)
elif money_old >=2000 and money_old <= 3000: # 满2000可享受7折优惠
money_new = '{:.2f}'.format(money_old*0.7)
elif money_old >=3000 : # 满3000可享受6折优惠
money_new = '{:.2f}'.format(money_old*0.6)
return money_old,money_new # 返回总金额和折扣后的金额
#*****************************调用函数***********************************#
print("\n开始结算……\n")
list_money = [] # 定义保存商品金额的列表
while True:
# 请不要输入非法的金额,否则将抛出异常
inmoney = float(input("输入商品金额(输入0表示输入完毕):"))
if int(inmoney)==0:
break # 退出循环
else:
list_money.append(inmoney) # 将金额添加到金额列表中
money = fun_checkout(list_money) # 调用函数
print("合计金额:",money[0],"应付金额:",money[1]) # 显示应付金额
运行结果为:
4、变量的作用域
变量的作用域是指程序代码访问该变量的区域,如果超出了该区域,在访问时就会出现错误,一般会根据变量的“有效范围”将变量分为“局部变量”和“全局变量”。
4.1、局部变量
局部变量是指在函数内部定义并使用的变量,它只在函数内部有效,即函数内部的名字只在函数运行时才创建,在函数运行之前或者运行完毕之后,所有的名字就都不存在了。
4.2、全局变量
全局变量是为了能够作用于函数内外的变量,全局变量主要有以下两种情况。
(1)如果一个变量在函数外定义,那么不仅可以作用于函数内外的变量,在函数内也可以访问得到,在函数体外定义的变量是全局变量。
例如:
pinetree = '我是一棵松树' # 定义一个全局变量(松树)
def fun_christmastree(): # 定义函数
'''功能:一个梦
无返回值
'''
pinetree = '挂上彩灯、礼物……我变成一棵圣诞树 @^.^@ \n' # 定义局部变量赋值
print(pinetree) # 输出局部变量的值
#*****************************函数体外***********************************#
print('\n下雪了……\n')
print('=============== 开始做梦…… =============\n')
fun_christmastree() # 调用函数
print('=============== 梦醒了…… ===============\n')
pinetree = '我身上落满雪花,'+pinetree + ' -_- ' # 为全局变量赋值
print(pinetree) # 输出全局变量的值
运行结果为:
(2)在函数体内定义,并且使用global关键字修饰后,该变量也就变为全局变量。
5、匿名函数
匿名函数是指没有名字的函数,应用在需要一个函数但又不想费神去命名这个函数的场合,通常情况下,这样的函数只使用一次。在Python中,使用lambda表达式创建匿名函数,语法格式为:
result = lambda [arg1,[arg2,...,argn]]:expression
例如:定义一个计算圆面积的函数,
import math
def circlearea(r):
result=math.pi*r*r
return result
r=10
print("半径为",r,"的圆面积为:",circlearea(r))
运行结果为:
又例如:使用lambda表达式的代码如下,运行结果也是一样的。
import math
r = 10
result=lambda r:math.pi*r*r
print("半径为",r,"的圆面积为:",result(r))
再例如,应用lambda实现对爬取的秒杀商品信息进行排序。
bookinfo = [('不一样的卡梅拉(全套)',22.50,120),('零基础学Android',65.10,89.80),
('摆渡人',23.40,36.00),('福尔摩斯探案全集8册',22.50,128)]
print('爬取到的商品信息:\n',bookinfo,'\n')
bookinfo.sort(key=lambda x:(x[1],x[1]/x[2])) # 按指定规则进行排序
print('排序后的商品信息:\n',bookinfo)
运行结果为: