教电脑新本领
函数:写一次,到处用
这节课你要学会
1. 把一段代码打包成自己的本领(函数);2. 让本领更灵活(参数);3. 让本领给你带回结果(return)。这是最后一课新知识,学会它,你就集齐了。
自己的本领
你早就在用电脑自带的本领了:print 会打印,input 会提问,len 会数数。这些本领的正式名字叫函数。今天我们学自己造新本领。
为什么要自己造?想想 print:它内部也有好几行代码,但你永远不用重写——写一次,起个名字,以后喊名字就行。这就是函数的全部意义。
def cheer():
print("加油!你可以的!")
print("你能行的!")
cheer()
print("做题之前……")
cheer()
加油!你可以的! 你能行的! 做题之前…… 加油!你可以的! 你能行的!
def(读作"def",define 的缩写)意思是"定义一个新本领"。注意两件事:
- def 那一行只是"登记"本领,登记了不等于用了。真正执行的是下面喊
cheer()的地方(这叫调用)。 - 又见冒号和缩进!缩进的行"归函数管",跟 if 一样的规矩。
是不是很像菜谱?def 就是把菜谱写进菜谱书,调用才是真的照着做一遍。
灵活点:参数
现在的 cheer() 有点死板,每次喊的话都一样。要是能把名字传给它,让它喊得更有针对性就好了。用参数——函数的"入口":
def cheer(name):
print(f"{name},加油!你可以的!")
cheer("小明")
cheer("小红")
小明,加油!你可以的! 小红,加油!你可以的!
name 就像一个预留的盒子:喊 cheer("小明") 时,"小明"被装进 name 盒子,函数里就能用它。同一个本领,传不同的东西,就有不同的效果——print 能打任何东西,就是这个道理。
参数可以有多个,用逗号隔开:
def greet(name, food):
print(f"{name},听说你爱吃{food},我也是!")
greet("小雨", "冰淇淋")
带回结果:return
有的本领不光做事,还要带回一个结果。就像自动售货机:投币进去(参数),饮料出来(结果)。关键词是 return:
def area(width, height):
result = width * height
return result # 把算好的结果带出去
a = area(5, 3) # 接住带回来的结果,装进盒子 a
print(f"面积是 {a}")
print(area(10, 4) + area(2, 2)) # 结果还能直接接着算!
面积是 15 44
print 和 return 的区别(容易迷糊,分清楚就通了)
print:让结果"显示出来给人看",说完就没了。
return:把结果"交还给程序",程序可以拿它继续用。
就像考试:print 是把答案念出来给大家听;return 是把答案写在卷子上交上去,老师能在卷子上继续打分。需要"接着算"的,一定要 return。
动手试一试:造一个"自动评语机"
def comment(score):
if score >= 90:
return "学霸本霸!"
elif score >= 60:
return "不错不错,稳住!"
else:
return "没事,下次逆袭!"
name = input("你是谁?")
score = int(input("考了多少分?"))
print(f"{name},{comment(score)}")
函数里装着第四课的 if,返回一句话给 print 用。你看,函数不是新知识,它是把所有旧知识打包的方式。
大程序的秘密:函数拼装
为什么说学完函数就能"做大程序"了?因为大程序就是一堆小函数拼起来的:
def welcome():
# 打印欢迎语
...
def ask_question():
# 出一道题
...
def show_result():
# 公布成绩
...
welcome()
ask_question()
ask_question()
show_result()
每个函数只做一小件事,主程序读起来像目录一样清楚。错了也好找——哪个环节出问题,就检查哪个函数。程序员管这个叫模块化:搭积木,而不是捏一整个泥团。
练习
基础任务:见面打招呼。写一个 greet(name) 函数,调用三次,跟三个朋友打招呼。
进阶任务:温度换算器。写一个 to_celsius(f) 函数,把华氏温度换算成摄氏温度(公式:减 32 再乘 5 除以 9),return 结果。测试:to_celsius(212) 应该约等于 100。
隐藏挑战:游戏战斗力计算器。写一个 power(level, equipment) 函数返回战斗力(公式自定,比如 level × 10 + equipment × 50)。然后建一个装 3 个玩家等级和装备数的列表,用 for 循环算出每个人的战斗力,宣布谁最强。(这是第 10 课结业项目要用的思路!)