入门会造简单工具了。这一节学更高级的用法:多返回值、函数当值用、递归、作用域。
一个工具能一次「给出」好几个结果,接收时一口气接住:
函数 统计(表)
返回 长度(表), 求和(表)
设 个数, 总和 = 统计([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
也可以这么写:
外部的别名是全局。不写外部就赋值,会变成函数里的新变量,外面的不动——这是新手最容易懵的地方。别名详见关键字与别名。
学过 Python 的人,看这里——这一节学的,用 Python 写是这样。零基础可以直接跳过,去下面做「练习二」。
先把这一节串成一个完整程序(CNplus):
函数 阶乘(数)
如果 数 <= 1
返回 1
返回 数 * 阶乘(数 - 1)
打印(阶乘(5))
同一个程序,用 Python 写:
def 阶乘(数): # 函数 阶乘(数)(结尾冒号)
if 数 <= 1:
return 1 # 返回 1
return 数 * 阶乘(数 - 1)
print(阶乘(5))
| CNplus | Python |
|---|---|
函数 f(x) |
def f(x):(结尾冒号) |
返回 x |
return x |
返回 甲, 乙 |
return 甲, 乙(其实是返回元组) |
外部 x = … |
global x |
| 函数可以存进变量、作为参数传递 | 一样 |
作用域差异:CNplus 里 如果/循环 的主体也是新作用域;Python 只有函数有作用域,if/while 里的变量在外面也能访问。
下一步:做练习二。