同福

编程入门第七课,函数(function)【20200917】

介绍

介绍

福哥今天要给大家讲讲编程里的重头戏——函数(function),有了函数,程序才是程序,为什么这么说呢?因为如果没有函数语法,所有重复工作(包括类似工作)都要重复编写代码,那样就失去了编程的价值。打个比喻说:如果程序没有函数,就好像做数学题没有公式一样,每次做类似的题目的时候,都要从头去用最原始是方法进行解题,这是不可想象的。

所以说,有了函数,我们编写的程序才可以越做越大,我们才可能做出大型程序。当然,如果要做超大型程序,还需要学会对象(class)才行

在c/c++里是支持函数的,在php里也是支持函数的,不过java是纯粹的OOP架构是没有函数的

函数语法

函数可以理解为一个公式,包含若干未知数(参数),未知数给了参考值,其结果(返回值)自然就得出来了,其语法如下

returnValue functionName (argument1, argument2, argument3 ... argumentN)

  • returnValue:函数返回值

  • functionName:函数名称

  • arguments:函数参数

函数包括函数声明和函数定义两个部分,声明就是定义函数名称、参数、返回值,定义就是实现函数里程序逻辑

函数声明

函数声明的意思就是只定义函数的名称、参数、返回值,而不去编写函数里面的程序逻辑,这在c/c++里有特定的意义,c/c++编程包括 .h(头文件)和 .cpp(程序文件),函数声明写在头文件里,函数定义写在程序文件,在发布程序库的时候函数定义是编译成二进制的,只能依赖头文件里的函数声明告诉使用者函数是什么样的

函数定义

函数定义的意思就是在做好函数声明之后开始编写函数里面的程序逻辑,函数定义也包括函数名称、参数、返回值,这在c/c++和php里都是一样的

c/c++示例

定义了addCapacityToFuge,用来输出一句话,再将capacityCont加一

int addCapacityToFuge(const char* capacity, int capacityCount) {
    // print
    cout << "福哥会写" << capacity << "编程代码" << endl;

    // count
    capacityCount++;

    return capacityCount;
}

int main()
{
    int capacityCount;

    capacityCount = 0;
    capacityCount = addCapacityToFuge("C/C++", capacityCount);
    capacityCount = addCapacityToFuge("Java", capacityCount);
    capacityCount = addCapacityToFuge("PHP", capacityCount);
    cout << "福哥会" << capacityCount << "种编程语言!" << endl;

    return 0;
}

5f29f50cfd5d042d.jpg

php示例

定义了addCapacityToFuge,用来输出一句话,再将capacityCont加一

注意:这里php的函数定义语法稍有不同,除了没有参数类型和返回值类型外,还需要在函数名称前面增加function关键字,这有助于php解析器的执行效率

function addCapacityToFuge($capacity, $capacityCount) {
    // print
    print "福哥会写" . $capacity . "编程代码\n";

    // count
    $capacityCount++;

    return $capacityCount;
}

$capacityCount = 0;
$capacityCount = addCapacityToFuge("C/C++", $capacityCount);
$capacityCount = addCapacityToFuge("Java", $capacityCount);
$capacityCount = addCapacityToFuge("PHP", $capacityCount);
print "福哥会" . $capacityCount . "种编程语言!\n";

b17bb769dd1d370b.jpg

python示例

定义了addCapacityToFuge,用来输出一句话,再将capacityCont加一

def addCapacityToFuge(capacity, capacityCount):
    # print
    print ("福哥会写" + capacity + "编程代码")

    # count
    capacityCount = capacityCount+1

    return capacityCount

capacityCount = 0
capacityCount = addCapacityToFuge("C/C++", capacityCount)
capacityCount = addCapacityToFuge("Java", capacityCount)
capacityCount = addCapacityToFuge("PHP", capacityCount)
print ("福哥会" + str(capacityCount) + "种编程语言!")

javascript示例

定义了addCapacityToFuge,用来输出一句话,再将capacityCont加一

function addCapacityToFuge(capacity, capacityCount) {
    // print
    console.log("福哥会写" + capacity + "编程代码");

    // count
    capacityCount++;

    return capacityCount;
}

capacityCount = 0;
capacityCount = addCapacityToFuge("C/C++", capacityCount);
capacityCount = addCapacityToFuge("Java", capacityCount);
capacityCount = addCapacityToFuge("PHP", capacityCount);
console.log("福哥会" + capacityCount + "种编程语言!");

函数参数

函数参数构成了函数的价值重要的组成部分,如果没有参数,函数所做的事情是完全不变的,有了参数就可以使函数完成类似缺又不完全相同的事情

函数参数个数

函数参数就是一个一个的变量定义,一个函数理论上可以有无限多个参数

函数参数类型

函数参数的类型和我们编程时候定义一个变量是基本一样的,每一个参数需要不同的名字,每一个参数需要给定参数类型,但是php这种弱类型语言不需要指定参数类型

函数参数传入方式

这个比较难理解,函数传入方式有两种,一种是复制传递(默认),另一种是引用传递

复制传递

复制传递是默认传递方式,就是我们传入的变量在传入函数的一瞬间会被自动克隆一份,如果参数在函数里面被修改了,不会影响调用函数程序代码里的变量的值

引用传递

引用传递和复制传递相反,就是我们传入的变量在传入函数的一瞬间不会被自动克隆,如果参数在函数里面被修改了,调用函数程序代码里的变量也会变化

函数返回值

函数在执行完成后可以返回一个变量给调用这个函数的代码使用,这个返回的的变量就是函数返回值

函数返回值类型

函数返回值的类型和我们编程时候定义的一个变量是基本一样的,需要给定返回值类型,但是php这种弱类型语言不需要参数类型

作用域

这个作用域比较抽象,打个比喻说:一段代码里会有很多的变量,如果把这些变量当作人的话,就是一群人在一个空场里,在这个空场里每个人都可以找到每个人,人可以被找到的范围就是这个人的作用域;函数假设是一个商场,商场大门就是调用函数的点,在空场里的人商场里是看不到的,商场里的人在空场也看不到,所以商场是另一个作用域

函数定义的作用域仅仅是函数定义里面的程序代码,它和函数调用的作用域是不通的,简单说就是:在函数调用的地方定义的变量在函数定义里面是无法使用的,反过来也是一样的,在函数定义里定义的变量在函数调用的地方也无法访问到

注意:在函数内调用另一个函数,或者调用函数自己,一样是不同的作用域

总结

函数就是一个处理一些事情的独立程序代码,可以传入函数参数来实现类似事情的处理操作,可以通过函数返回值来讲处理结果带回到调用函数的程序使用

有了函数,我们就可以编写较为大型的程序了