CC++ & Algorithm

Python函数的定义

困难6
语言版本:C++Python
概述:学习如何用`def`关键字创建自己的函数,就像给电脑写一个可以反复使用的小程序。

让电脑记住你的“小魔法”——Python函数入门

嘿,小朋友!你有没有想过,如果电脑能记住一个“小魔法”,每次你念出它的名字,它就帮你做一件事,那该多酷?比如你喊一声“做早餐”,它就自动煎蛋、烤面包。在Python里,这种“小魔法”就叫 函数。函数可以把一段有用的代码打包起来,起个名字,以后只要叫这个名字,电脑就会自动执行那段代码,再也不用重复写很多遍了。

函数就像妈妈的“菜谱”

还记得妈妈教你炒鸡蛋吗?她告诉你:

  1. 打两个鸡蛋
  2. 加一点盐和葱花搅拌
  3. 倒油烧热
  4. 把蛋液倒进去炒熟

以后每次你想吃炒鸡蛋,只要说“我要炒鸡蛋”,妈妈就会按这个步骤做。Python里的函数就是这样一个“菜谱”:先定义好步骤,以后随时可以按步骤执行

如何定义一个函数?—— def 关键字

在Python里,我们用 def 来定义函数,就像在电脑上写新菜谱。写法很简单:

def 函数名字():
    要执行的代码(函数体)
  • def:告诉电脑“我要开始定义一个函数啦”
  • 函数名字:你自己取,最好有意义,比如 make_egg(做鸡蛋)
  • 小括号 ():以后可以放参数(就像菜谱里的“加多少盐”),现在先空着
  • 冒号 ::表示“下面是函数体”
  • 函数体:要缩进(通常按一次Tab键或4个空格),表示这些代码属于这个函数

看一个最简单的例子:

def say_hello():
    print("你好,欢迎学习Python!")

这个函数叫 say_hello,函数体只有一行:打印一句话。注意,函数体必须缩进,否则Python会报错。

函数名字怎么起?

函数名字就像给魔法起个咒语名字,要遵循规则:

  • 只能包含字母、数字和下划线 _,不能以数字开头
  • 不能用Python的“保留字”(比如 iffordef 这些关键字)
  • 最好用小写字母,多个单词用下划线连接,比如 make_sandwichstart_game
  • 名字要能看出函数的功能,比如 add_score(加分)比 abc 好100倍

错误的名字1do_thing(数字开头)、my-function(用了减号)、print(和内置函数重名)

函数体里可以有很多条指令

就像做三明治不止一步,函数里也可以写很多行代码。下面这个函数会一步步打印做三明治的步骤:

def make_sandwich():
    print("拿两片面包")
    print("放上火腿和生菜")
    print("盖上面包")
    print("三明治做好了!")

函数体里也可以定义变量!比如我们想记录用了多少片火腿:

def make_sandwich():
    ham_cnt = 2           # 火腿片数
    bread_cnt = 2         # 面包片数  
    print("拿", bread_cnt, "片面包")
    print("放上", ham_cnt, "片火腿和生菜")
    print("盖上面包")
    print("三明治做好了!一共用了", ham_cnt, "片火腿")

注意,函数里的变量只在函数内部有效,就像妈妈做菜时自己用的配料表,外面的人看不到。

为什么要用函数?

  • 避免重复:如果你要在很多地方都打印“欢迎来到游戏!”,每次都写一遍很麻烦。定义一个函数 welcome(),以后每次只需写 welcome() 就够了。
  • 更容易理解:把复杂的问题拆成几个小函数,每个函数做好一件事。比如做一个“计算器游戏”,可以拆成 show_menu()(显示菜单)、add_numbers()(加法)、sub_numbers()(减法)……代码就像搭积木一样清晰。
  • 方便修改:如果有一天你想把“欢迎来到游戏”改成“欢迎来到Python冒险”,只需要改函数内部的一行代码,所有用到这个函数的地方都会自动更新,超级省力!

新手最容易犯的3个错误

  1. 忘记冒号
    错误:def hello() (没有冒号)
    正确:def hello():

  2. 缩进不一致
    错误:函数体有的行缩进4个空格,有的缩进2个空格,或者忘了缩进
    正确:所有函数体代码保持相同缩进(推荐4个空格或一个Tab)

  3. 函数名字和内置函数重名
    比如你定义一个函数叫 print,会把Python原本的打印功能覆盖掉,导致混乱。可以用 my_printprint_message

完整可运行的例子

下面是一个完整的程序:定义了一个做披萨的函数,然后调用它两次(调用就是让函数真正执行,下一节会详细教,这里先试一下)。

# 定义函数:做披萨
def make_pizza():
    topping = "芝士和火腿"  # 配料
    size = "大份"          # 大小
    print("准备" + size + "的披萨饼底")
    print("放上" + topping)
    print("放入烤箱烤15分钟")
    print("香喷喷的" + size + "披萨做好啦!")

# 调用函数(让函数执行)
print("== 第一次做披萨 ==")
make_pizza()
print("")
print("== 第二次做披萨 ==")
make_pizza()

运行结果:

== 第一次做披萨 ==
准备大份的披萨饼底
放上芝士和火腿
放入烤箱烤15分钟
香喷喷的大份披萨做好啦!

== 第二次做披萨 ==
准备大份的披萨饼底
放上芝士和火腿
放入烤箱烤15分钟
香喷喷的大份披萨做好啦!

你看,只定义了一次 make_pizza,却可以反复使用,这就是函数的神奇之处!

接下来学什么?

你现在已经学会了如何定义函数(写“菜谱”),但还没有学“怎么让函数真正跑起来”以及“怎么给函数传递信息(比如要几片火腿?大小是多大?)”。下一节我们会学 函数的调用参数。到时候你可以定义一个 make_pizza_with_topping(topping),每次做不同口味的披萨,就像给魔法加上“配料”参数,更加灵活!

继续加油,你已经学会了编程里最重要的一项技能:自定义函数

例题精讲

1单选题

在Python中,定义函数时使用的关键字是?

Afunction
Bdefine
Cdef
Dfunc
2单选题

下列哪个是定义名为greet、无参数、打印'Hello!'的函数的正确语法?

Adef greet(): print('Hello!')
Bdef greet: print('Hello!')
Cdef greet() print('Hello!')
Dfunction greet(): print('Hello!')
3判断题

在Python中,定义函数时,函数体可以为空,不包含任何语句。

4填空题
以下代码定义了一个计算两数乘积的函数,请补充完整。

def multiply(a, b):
    return ___
5填空题
以下代码定义了一个打印消息的函数,但缺少关键字。请补充。

___ show():
    print('Hello, world!')