python 函数中的子函数 变量 python子函数调用_子程序


在我们写程序的时候,经常需要重复实现某个功能,这就涉及到代码的重复使用。如果每次都重新写一遍,显然是很憨憨的,所以我们可以通过函数的思想来实现这样的需求,具体到Fortran程序中,就是函数(function)和子程序(subroutine)的使用。下面我们通过实例简单介绍一下它们的基本概念和使用。


首先,Fortran内置了很多函数,可以直接使用,例如大家非常熟悉的三角函数:


python 函数中的子函数 变量 python子函数调用_Fortran_02

内置函数的使用,通常内置函数会被高亮


此外,我们还可以通过下列语句自定义函数,例如这个R_cor1函数就是根据后面的输入参数求得的一个实空间x轴坐标。


python 函数中的子函数 变量 python子函数调用_子程序_03

自定义函数的定义

函数定义好后,即可在程序中直接调用,无需任何额外指令,例如最上面调用COS函数,直接写入相应参数即可,例如我们下面调用R_cor1函数计算一个相位信息:


python 函数中的子函数 变量 python子函数调用_python 归一化函数_04


只需将定义函数时要求的参数信息输入即可。


说完函数,再简单说一下子程序,我们来看这一个子程序,它实现的功能是,将一个万尼尔函数归一化:


python 函数中的子函数 变量 python子函数调用_Fortran_05


因为需求是需要将多个万尼尔函数都实现归一化,所以可以通过子程序来避免重复撰写代码,在调用子程序时,需要加入call命令:


python 函数中的子函数 变量 python子函数调用_归一化_06


部分结果如下:


python 函数中的子函数 变量 python子函数调用_归一化_07



最后简单提一下,虽然理论上函数和子程序中的任意一个都可以实现我们需求的功能,但什么时候适合用函数,什么时候适合用子程序,其实是有一些说法的,我的体会总结如下:

当你需要一个“y=f(x)类型的返回值”的时候,用函数,例如我们上面的COS函数和R_cor1函数,本质上我们的需求都是:我输入一些参数,最后得到一个返回的数值。它的本质是,我没有改变我输入的变量,而是将我输入的变量通过函数关系转化了出来。

所以什么时候用子程序就很自然了:当你需要改变一个变量,就用子程序。例如我们上面的万尼尔函数变量wan,在调用子程序前,它是没有归一化的,但调用完子程序后,它就是归一化的了。而我在调用子程序后再使用的wan,是一个归一化的wan。


总结:需要一个数值,不改变输入变量,使用函数;希望改变一个变量以方便后续使用,使用子程序。