第10节课程大纲
一、初识函数
1.1 函数的作用
1.2 函数的组成
1.3 定义和调用函数
二、函数的进阶使用
2.1 参数类型
2.2 返回多个值
三、多个函数间配合
3.1 变量作用域
3.2 函数的嵌套
一、初识函数
1.1 函数的作用
函数是Python里增强代码重用性最有力的工具
1.2 函数的组成
在python中,“喂”给函数一些数据,它就能内部消化,执行相应的功能,最终给你“吐”出你想要的东西,就好比自动贩卖机一样
函数后面的括号里放的东西,也就是我们需要输入给函数的数据,它在函数中被称作【参数】。【参数】指向的是函数要接收、处理怎样的数据(你也可以把它理解成自变量)。
除了Python自带的内置函数,也可以根据自己的需要,自己定义一个独一无二的函数
1.3 定义和调用函数
定义函数:定义函数的基本语法
示例:
def math(x):
y = 3x + 5
return y
#第1行:def的意思是定义(define),math是【函数名】(自己取的),再搭配一个英文括号和冒号,括号里面的x是参数(参数名也是自己取)。
#第2行:def下一行开始缩进的代码就是函数要实现的功能,也叫【函数体】。这里的功能就是:根据x计算出一个值y。
#第3行:return语句是返回的意思,可以指定函数执行完毕后最终会返回什么值或表达式,否则计算机是无法判断出函数最终要输出什么结果的。
定义函数的语法并不难,但有些注意事项一开始要特别注意才能少踩坑,我将其标记在下面代码块的注释里,请你仔细阅读下。
# 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合
# 2. 不可与内置函数重名(内置函数不需要定义即可直接使用)
def math(x):
# 参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
# 规范:括号是英文括号,后面的冒号不能丢
y = 3*x + 5
# 函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格
return y
# return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略
调用函数:
定义函数只是将函数的内部功能封装起来(组织好),调用函数需要输入函数名和参数所对应的值,这个过程在函数里叫作参数的传递(pass)。
def math(x):
y = x ** 2 + x
return y
a = math(10)
print(a)
# math(10)的意思是将整数10赋值给参数x并运行该函数。函数执行完毕后最终返回了y的值即110,然后将这个结果赋值给变量a,再用print()将变量a打印出来。
练习:自己写一个len()函数
# 思路:1. 设置一个初始为0的计数器;2.遍历字符串,每遍历一次,计数器加一;3.返回计数器的值。
# 定义len()函数
def my_len(words):
counter = 0
for i in words:
counter = counter + 1
return counter
# 调用函数
a = '三根皮带,四斤大豆'
print(my_len(a))
#等价于print(my_len('三根皮带,四斤大豆'))
二、函数的进阶使用
2.1 参数类型
这一部分,主要介绍函数中常见的位置参数、默认参数和不定长参数。
#无参数 无返回值
def opening():
print('总有一种味道能温暖你~')
print('深夜食堂正式开业啦!')
print('欢迎来自五湖四海的你前来品尝!')
opening()
位置参数:
# 多个参数
def menu(appetizer, course):
print('一份开胃菜:' + appetizer)
print('一份主食:' + course)
menu('话梅花生','牛肉拉面')
#这里的'话梅花生'和'牛肉拉面'是对应参数的位置顺序传递的,所以appetizer和course被叫作【位置参数】,当有多个参数的时候,我们就必须按照顺序和数量传递,这也是最常见的参数类型。
#如果采用下面这种形式传递,就不需要理会参数位置
menu(course = '牛肉拉面', appetizer = '话梅花生')
默认参数:
⚠️默认参数必须放在位置参数之后。
def menu(appetizer, course, dessert = '绿豆沙'):
print('一份开胃菜:' + appetizer)
print('一份主食:' + course)
print('一份甜品:' + dessert)
menu('话梅花生','牛肉拉面')
#因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。
默认参数并不意味着不能改变,可以通过调用时传递新值进行替换
def menu(appetizer, course, dessert = '绿豆沙'):
print('一份开胃菜:' + appetizer)
print('一份主食:' + course)
print('一份甜品:' + dessert)
menu('话梅花生','牛肉拉面','银耳羹')
#银耳羹对应参数dessert。替换调了‘绿豆沙’
不定长参数:传递给参数的数量是可选的、不确定的。
不定长参数的格式比较特殊,是一个星号*加上参数名,它的返回值也比较特殊
def menu(*barbeque):
for i in barbeque:
print('一份烤串:' + i)
menu('烤香肠', '烤肉丸')
menu('烤鸡翅', '烤茄子', '烤玉米')
# 不定长参数可以接收任意数量的值
不定长参数的示例:print()函数
print()函数完整参数:print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)
第一个参数objects,带了*号,为不定长参数——这也是为什么print()函数可以传递任意数量的参数。其余四个为默认参数,我们可以通过修改默认值来改变参数,对比一下下列代码的输出结果。
print('金枪鱼', '三文鱼', '鲷鱼')
#返回结果:金枪鱼 三文鱼 鲷鱼
print('金枪鱼', '三文鱼', '鲷鱼', sep = '+')
# sep控制多个值之间的分隔符,默认是空格
#返回结果:金枪鱼+三文鱼+鲷鱼
print('金枪鱼', '三文鱼', '鲷鱼', sep = '+', end = '=?')
# end控制打印结果的结尾,默认是换行)
#返回结果:金枪鱼+三文鱼+鲷鱼=?
2.2 返回多个值
函数,不仅可以支持输入多个参数,而且也可以同时输出多个值。要返回多个值,只需将返回的值写在return语句后面,用英文逗号隔开即可。
import random
appetizer = ['话梅花生','拍黄瓜','凉拌三丝']
def coupon(money):
if money < 5:
a = random.choice(appetizer)
return a
elif 5 <= money < 10:
b = random.choice (appetizer)
return b, '溏心蛋'
print(coupon(6))
print(type(coupon(6)))
三、多个函数间配合
3.1 变量作用域
局部变量:一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】
全局变量:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】
在这个例子中,变量rent是在函数外被赋值的,所以它是全局变量,能被sum_cost()函数直接使用;而变量variable_cost是在cost()函数内定义的,属于局部变量,其余函数内部如sum_cost()无法访问。事实上,当cost()函数执行完毕,在这个函数内定义的变量都会"消失”。
如何解决“局部变量”和”全局变量“之间的矛盾呢?有几种方法可供参考:
第一种方法:把局部变量都放在函数外,变成全局变量。
# 以上面的代码为例:
rent = 3000
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
# 以上均为全局变量
print('本月的变动成本是' + str(variable_cost))
def sum_cost():
sum = rent + variable_cost
print('本月的总成本是' + str(sum))
sum_cost()
第二种:global语句
global语句可以将局部变量声明为全局变量
rent = 3000
def cost():
global variable_cost # global语句
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
print('本月的变动成本是' + str(variable_cost))
def sum_cost():
sum = rent + variable_cost
print('本月的总成本是' + str(sum))
cost()
sum_cost()
用法:global语句一般写在函数体的第一行,它会告诉Python,“我希望variable_cost是个全局变量,所以请不要用这个名字创建一个局部变量”。所以sum_cost()函数内部现在可以直接使用声明后的全局变量variable_cost。
第三种方法:函数的嵌套
3.2 函数的嵌套
rent = 3000
def cost():
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
print('本月的变动成本是' + str(variable_cost))
return variable_cost
def sum_cost():
sum = rent + cost() #函数嵌套
print('本月的总成本是' + str(sum))
sum_cost() # 不需要再调用cost()函数
# div()函数计算并返回利润率
def div(num1, num2):
growth = (num1 - num2) / num2
percent = str(growth * 100) + '%'
return percent
# warning()函数打印出一句提示
def warning():
print('Error: 你确定上个月一毛钱都不赚不亏吗?')
#定义main()函数,函数内嵌套上面两个函数
def main():
while True:
num1 = float(input('请输入本月所获利润'))
num2 = float(input('请输入上月所获利润'))
if num2 == 0:
warning()
else:
print('本月的利润增长率:' + div(num1,num2))
break
main()
代码的执行顺序:
⚠️def语句后的代码块只是封装了函数的功能,如果没有被调用,那么def语句后面的代码永远不会被执行。
四、练习题
4.1 年终奖有多少
题目:眼看要过年了,深夜食堂经营的不错,你打算给员工发奖金犒劳一下。请你定义函数,当输入员工姓名和工作时长两个参数,即可打印出该员工获得多少年终奖。
发放奖金的要求如下:工作时长不满六个月,发放固定奖金500元。
工作时长在六个月和一年之间(含一年),发放奖金120元*月数(如8个月为960元)
工作时长在一年以上,发放奖金180元*月数 (如20个月为3600元)
方法一:
def math(name,time):
if time<6:
money=500
print('工作时长不满六个月,发放固定奖金500元。')
elif time<=12:
money=120*time
print('工作时长%s个月,发放奖金%s元' %(time,money))
else:
money=180*time
print('工作时长%s个月,发放奖金%s元' %(time,money))
math('大聪',14)
方法二:
def bonus(month):
if month < 6:
money = 500
return money
elif 6 <= month <= 12:
money = 120 * month
return money
else:
money = 180 * month
return money
def info(name, month):
gain = bonus(month)
print('%s来了%s个月,获得奖金%s元' % (name, month, gain))
info('大聪',14)
4.2 hellokitty 抽奖器
题目:我们已经有一个hellokitty抽奖器,现在,请你把这个程序封装成一个新的函数。
练习目标:函数的封装和调用
1、hellokitty抽奖器代码:
# 查看注释,运行代码。
import random
import time
# 用random函数在列表中随机抽奖,列表中只有3位候选者。
luckylist = ['海绵宝宝','派大星','章鱼哥']
# random模块中有个随机选取一个元素的方法:random.choice()。
a = random.choice(luckylist) # 从3个人中随机选取1个人。
print('开奖倒计时',3)
time.sleep(1) # 调用time模块,控制打印内容出现的时间
print('开奖倒计时',2)
time.sleep(1)
print('开奖倒计时',1)
time.sleep(1)
# 使用三引号打印hellokitty的头像
image = '''
/\_)o<
| \\
| O . O|
\_____/
'''
print(image) # ……
print('恭喜'+a+'中奖!') # 使用print函数打印幸运者名单
2、分析代码结构,完成函数封装
# 查看注释,运行代码。
import random
import time
# 将抽奖程序封装成函数
def choujiang(q,w,e): # 定义一个抽奖函数,带有3个参数,也就是3位候选人
luckylist = [q,w,e] # 定义一个中奖名单的列表
a = random.choice(luckylist) # 在中奖名单里面随机选择
print('开奖倒计时',3)
time.sleep(1)
print('开奖倒计时',2)
time.sleep(1)
print('开奖倒计时',1)
time.sleep(1)
image = '''
/\_)o<
| \\
| O . O|
\_____/
'''
print(image)
print('恭喜'+a+'中奖!')
choujiang('虚竹','萧峰','段誉') # 调用函数
学习时间:3月27日