一段代码要用好几次,就把它做成一个工具,起个名字,以后随叫随到。
函数 打招呼(名字)
返回 "你好," + 名字 + "!"
打印(打招呼("小明")) # 你好,小明!
打印(打招呼("小红")) # 你好,小红!
三行读懂:
函数 表示「我要造个工具」名字 是占位——用的时候填什么,它就是什么返回 表示「这个工具算出的结果是……」函数 加法(甲, 乙)
返回 甲 + 乙
打印(加法(3, 4)) # 7
有的参数通常就是某个值,可以给它一个「默认」——调用时不写就用默认,写了就覆盖:
函数 问候(名字, 招呼 = "你好")
打印(招呼 + "," + 名字)
问候("小明") # 你好,小明
问候("小刚", 招呼 = "晚上好") # 晚上好,小刚
带默认值的参数要排在后面,不带默认的排前面。
调用时想「把话说清楚」或打乱顺序,就点名传参:
函数 相除(甲, 乙)
返回 甲 / 乙
打印(相除(乙 = 2, 甲 = 8)) # 4.0(顺序无所谓)
一个工具能一次「给出」好几个结果,接收时一口气接住:
函数 统计(表)
返回 长度(表), 求和(表)
设 个数, 总和 = 统计([1, 2, 3])
打印(个数) # 3
打印(总和) # 6
返回 甲, 乙 配合 设 甲, 乙 = 函数(),左边几个名字就接住几个值。
有些工具只是「做一件事」,不「算出结果」。那就不用写 返回:
函数 报温度(度)
打印("今天 " + 文本(度) + " 度")
报温度(32) # 今天 32 度
CNplus 里函数是「一等公民」——可以像数字、文字一样存进变量、传给别的函数:
函数 翻倍(数)
返回 数 * 2
设 我的工具 = 翻倍 # 把函数存进变量
打印(我的工具(5)) # 10
函数可以在里面调用自己。经典例子是阶乘(5! = 5 × 4 × 3 × 2 × 1):
函数 阶乘(数)
如果 数 <= 1
返回 1
返回 数 * 阶乘(数 - 1)
打印(阶乘(5)) # 120
递归的关键是「什么时候停」——上面的
如果 数 <= 1 返回 1就是终点。没有终点会无限递归。
函数体是新的作用域:
设 名字 = "小明"
函数 换名字()
设 名字 = "小红" # 这是函数里的「名字」,和外面的不一样
打印(名字) # 小红
换名字()
打印(名字) # 小明(外面的没被改)
想修改外面已有的变量,要用 外部:
设 分数 = 60
函数 加分()
外部 分数 = 分数 + 10
加分()
打印(分数) # 70
外部的别名是全局。不写外部就赋值,会变成函数里的新变量,外面的不动——这是新手最容易懵的地方。
写一个函数 平方(数) 返回 数 * 数,然后打印 平方(12)。
函数 平方(数)
返回 数 * 数
打印(平方(12)) # 144
下一章:五、列表