开始之前,我们先复习一下数学中是怎么定义函数的。

数集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的时候,应该都注意到这个“自定义模块”吧
image
这就是函数,只是他只能对应一种操作。

比如,我没要让角色说出Hello World,就可以这么写
image
image
image
从这里,我们也可以看出编程中函数必须具备的两个东西:

一个是定义,相当于数学函数的解析式。一个是调用,就是使用函数。

定义函数,就是定义对应关系。比如说这个函数就定义了什么都对应说Hello World
image
而这个就定义了输入什么参数,就说什么
image
在调用下面这个函数的时候,就需要把字符串作为参数传给函数。
image
那么,参数是怎么传递的呢?

我记得整个公众号的第一篇文章,我就讲过关于变量的内容。我们再用Mind+上传模式(类似与Scratch)来讲解
image
可以看到,这里变量有了三种类型,数字型(其实更准确的说叫浮点型,可以理解为小数)、字符串类型,列表型。所有编程语言都有变量类型,只是有的语言可以自动识别变量类型,不用手动指定。变量可以储存一个值,你可以随时设置变量的值,也可以读取变量的值。

函数的这些参数,其实都是变量。调用函数时,实际发生的,就是把你输入进去的值,赋值给参数变量。
image

这些参数变量只是一个壳子,一个形式,并不是你实际输入的东西(值相等,但不是一个东西)。

因此,我们叫他形式参数,简称形参

而你调用函数时输入的就叫实际参数,简称实参
image
好了,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的那个例子
image
这里的说我们用各编程语言的“输出”来代替。

首先是不需要指定类型的

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

本期教程到此结束,我还要忙着做球说化学第零集呢
小预告:
image
(右上角不要管他,是我视频播放器的窗口,实际视频里没有)

posted on 2024-07-04 21:49  eason66  阅读(8)  评论(0编辑  收藏  举报