开始之前,我们先复习一下数学中是怎么定义函数的。
数集A和B,如果A所有数在B中都存在且只有一个数与之对应,则称B是A的函数
由此,我们可以看出一个关键词:对应。
编程中的函数也一样,只是编程中不一定是数,也可以是布尔值、字符串,甚至操作。
这个A集,我们叫他参数,B集,叫他返回值。如果B是操作,相当于没有返回值,A一般不能是操作。
那么,知道函数的大致概念后,我们开始吧。
泛语言计划 第二弹 函数
本次举例使用语言:Scratch,C/C++,C#,Java,JavaScript,Kotlin,Python,Visual Basic,Swift 排名不分先后
(别问我为什么有Scratch,根据Tiobe语言排行榜,Scratch市场份额现在占所有编程语言的1.17%,排名第十六,三月份的时候甚至更高)
顺便祝贺C++成功超过C语言,晋升排行榜第二!
先从Scratch开始大家玩Scratch的时候,应该都注意到这个“自定义模块”吧
这就是函数,只是他只能对应一种操作。
比如,我没要让角色说出Hello World,就可以这么写
从这里,我们也可以看出编程中函数必须具备的两个东西:
一个是定义,相当于数学函数的解析式。一个是调用,就是使用函数。
定义函数,就是定义对应关系。比如说这个函数就定义了什么都对应说Hello World
而这个就定义了输入什么参数,就说什么
在调用下面这个函数的时候,就需要把字符串作为参数传给函数。
那么,参数是怎么传递的呢?
我记得整个公众号的第一篇文章,我就讲过关于变量的内容。我们再用Mind+上传模式(类似与Scratch)来讲解
可以看到,这里变量有了三种类型,数字型(其实更准确的说叫浮点型,可以理解为小数)、字符串类型,列表型。所有编程语言都有变量类型,只是有的语言可以自动识别变量类型,不用手动指定。变量可以储存一个值,你可以随时设置变量的值,也可以读取变量的值。
函数的这些参数,其实都是变量。调用函数时,实际发生的,就是把你输入进去的值,赋值给参数变量。
这些参数变量只是一个壳子,一个形式,并不是你实际输入的东西(值相等,但不是一个东西)。
因此,我们叫他形式参数,简称形参
而你调用函数时输入的就叫实际参数,简称实参
好了,Scratch部分结束,接下来正式开始敲代码。
函数的定义
由于函数的英文是function,大部分语言定义函数都是用fun/func/function等关键字,在需要手动定义类型的语言,往往还需要指定返回值类型。
除了特别特殊的Python
def funtion_name():
pass
Python
注:Python中pass是占位符号,别的语言没有东西可以空着,但Python不行
接下来,是其他不需要手动定义类型的语言。
function function_name(){
}
javascript
Visual Basic函数有两种,没有返回值的称为“子程序”,有返回值的才被称作“函数”。我们先讲子程序,函数我们后面讲到返回值了再讲。
Sub sub_name()
End Sub
Visual Basic
接下来是需要手动定义类型的语言,均以没有返回值举例
fun function_name():Unit{
}
kotlin
Unit可以省略
fun function_name():Unit{
}
kotlin
func function_name(){
}
swift
swift中,没指定就是没有返回值
C/C++,C#,Java的写法比较类似,这里合起来讲
void function_name(){
}
C/C++/C#/Java
添加参数
我们还是举之前Scratch的那个例子
这里的说我们用各编程语言的“输出”来代替。
首先是不需要指定类型的
def function_name(text):
print(text)
python
当然,最好还是指定一下类型
def function_name(text:String):
print(text)
python
function function_name(text){
alert(text);
}
javascript
Sub sub_name(text)
msgbox(text)
End Sub
visual basic
需手动指定类型
fun function_name(text:String){
print(text)
}
kotlin
func function_name(text:String){
print(text)
}
swift
#include <iostream>
using namespace std;
void function_name(string text){
cout << text;
}
C++
#include <string.h>
#include <stdio.h>
void function_name(string text){
printf("%s",text);
}
C
void function_name(String text){
Console.WriteLine(text);
}
C#
void function_name(String text){
System.out.println(text);
}
Java
添加返回值
这里我们就用数学题最常见的二次函数:y=x²+2x+3举例吧
首先是不需要指定类型的
def y(x):
return x*x+2*x+3
python
当然,最好还是指定一下类型
def y(x:int)->int:
return x*x+2*x+3
python
function y(x){
return x*x+x*2+3;
}
javascript
前面我们说过,有返回值在visual basic中,就要用函数,也就是Function
Function y(x)
function_name=x*x+x*2+3
End Function
visual basic
需手动指定类型
fun y(x:Int):Int{
return x*x+x*2+3
}
kotlin
func y(x:Int)->Int{
return x*x+x*2+3
}
swift
void y(int x){
return x*x+x*2+3;
}
C/C++/C#/Java
这里再次四个一起讲
调用函数
这里我们就用上面定义的函数,又有参数,又有返回值。我们就输入1,输出那个返回值。
python/kotlin/swift差不多,这里直接合起来讲
print(y(1))
python/kotlin/swift
cout << y(1);//记得在头文件写上#include <iostream>
C++
printf("%d",y(1));//记得在头文件写上#include <stdio.h>
C
Console.WriteLine(y(1));
C#
System.out.println(y(1));
Java
alert(y(1));
javascript
msgbox(y(1))
visual basic
Visual Basic中,如果函数没有返回值,还可以使用Call关键字
Call y(1)
visual basic
或者直接省略Call
y 1
visual basic
上面的输出结果都是6
不过再次强调,实际参数不等于形式参数,比如下面的程序(C++举例)
#include <iostream>
using namespace std;
void change(int a){
a=a+1;
}
int main(){
int a=1;
change(a);
cout << a;
return 0;
}
C++
上面程序输出结果是1而非2。毕竟只有形式参数a加了1变成了2,实际参数仍然是1。
在C++中,加上&就可以让形式参数和实际参数一致,其他语言也可以使用指针。这里就不细讲了,指针我们会单独开一个专题的。
#include <iostream>
using namespace std;
void change(int &a){
a=a+1;
}
int main(){
int a=1;
change(a);
cout << a;
return 0;
}
C++
结果为2
本期教程到此结束,我还要忙着做球说化学第零集呢
小预告:
(右上角不要管他,是我视频播放器的窗口,实际视频里没有)