Julia机器核心编程.函数(完)
当我们讨论函数时,一个非常重要的方面就是参数。毫无疑问,在其他语言中几乎都使用过参数,并且参数可以通过值或者引用传递。
但是Julia却不同,在Julia中参数是通过分享传递的。为了搞清楚什么是分享传递,让我们先看一下值传递和引用传递这两种常用的方法。
值传递和引用传递
当我们说传值的时候,则意味着无论给函数传递什么参数,函数都会将这个参数复制一份,即相同变量的拷贝会被传递给函数。
当我们说通过引用传递参数时,则意味着参数的引用或者位置也会传递给该函数,不会进行拷贝操作而将值传递给函数。
c语言是按值传递,记住这个东西.写C的时候会少很多的困扰
分享传递
当通过分享传递时,当作参数传递的变量不会被复制。相反,函数参数本身充当新的绑定,函数参数就是被传递的变量本身。
return关键字
使用return关键字将会终止一个函数的执行并将控制返回给调用函数。Julia中的函数可能会显式使用return来返回一个值。如果没有return,Julia会计算并返回最后一个表达式的值。例如,下面的代码返回的值是相同的。
没区别
函数参数是以输入的形式传递给函数的变量,以便让函数返回一个特定的输出值。
别觉得烦躁,语法基础是每个人都要经过的东西
代码01~03行定义了一个函数,并传入一个参数name。和之前定义的函数不同的是,在本例中,通过“$函数名”的形式调用了传入参数的值。代码05行调用该函数,并传入一个字符串类型的参数。代码06行是函数执行后的输出结果,可以看到,传入的参数被包含在字符串中一并输出了。
我们甚至不需要对字符串和参数进行连接操作,而是直接在字符串中使用传入的变量就可以了。
需要记住的是,尽管Julia中的类型是动态类型,但它支持使用静态类型的变量。修改前面的代码,我们可以得到以下代码。
此时传一个非string的参数进去会报错
代码01~03行声明的函数和上面的函数相似,不同之处是这里限制了输入参数的类型,让函数只能接收字符串类型的参数。
你可能已经注意到,函数的行为方式没有发生变化。但是,声明传递的参数类型有一个巨大的好处,就是提高了速度,后面我胡讨论这个问题的.
无参函数
虽然这个函数什么都没做,但是有时它会有特殊的用途,比如只想让函数定义以接口的形式出现,就可以使用它。
可变参数
当我们不确定事先传递给函数的参数的数量时,可变参数(Varargs)就派上用场了。因为在这种情况下,我们希望可以向函数传递任意数量的参数。
在Julia中,我们可以通过“…”来声明一个函数的参数是可变参数。下面通过一个例子来进一步解释。
一个带有可变参数的函数
代码01~04行声明了letsplay函数,仔细观察声明时的参数列表,这里使用“…”代表传入的参数数量是不确定的,有可能很少,也有可能很多。你看到这里有没有感觉写起来很舒服的感觉呢,省略号在日常语义里面就是还有,未完待续的意思.这时Julia可以将这些参数解释为位置并相应地映射水果和位置之间的关系。
代码07行对函数进行了调用,其第一个参数x通过位置映射到一,并在println()函数中显示。所以,x="一"。
第二个参数y被解释为一个元组,因为它在声明时后面跟着“…”。因此,y被映射到儿和三。所以,y=("儿","三")。
另外,传递给函数的参数可以通过多种方式预先声明。例如有一个函数,它以如下所示的方式接收可变参数。
传递一个元组给可变参数
本例中定义了一个接收可变参数的函数,并向该函数传递一个元组的元素作为参数值。
代码01行首先定义了一个元组x,作为后面准备传递给函数的参数。代码03~05行定义了一个函数,用来输出我们刚才输入的参数。可以看出,即使传入的是一个元组,也不会有任何问题。
下面我们就通过typeof函数来得到x的数据类型,就如你所看到的,确实向函数传递了一个元组的值。
我们也可以将x作为数组传递,但是最终结果不会受到影响。为了证明这一点,我们将x初始化为数组并重新编写代码,结果在我们意料之中。
代码01行声明了一个列数组,作为要传递给函数的参数。代码02~07行是x的值的输出结果。代码09行调用了typeof()函数来查看x的类型,结果如10行所示,类型是一个数组。在代码12行,我们将x作为参数传递给numbers,13行正确地输出了结果。
可选参数
有时候,在特定用例的实现过程中,你可能希望某些参数是固定的(即该参数必填)或者有一个默认值。例如,你希望将一个数字转换为二进制或十六进制形式,最适合的方法是设置一个base参数作为底数,然后根据需求为其设置不同的默认值。
通过这种方法,你只需要一个函数将base设置成2或16,即convert_to_base(base=2)或convert_to_base(base=16)即可,而不是使用convert_to_binary()和convert_to_hex()两个不同的函数。
具有可选参数的函数
本例中定义了一个函数,它可以有必填参数和可选参数。
代码01~03行定义了一个函数,用来计算三个数的和。这里我们为一些参数指定了默认值,这就意味着有默认值参数的函数,即使在传入参数时不传递该参数,函数也能够根据默认值来正常运行。
代码08行只输入一个参数3,函数f至少要接收一个参数,因为在定义时x是没有默认值的,所以x是必填参数。从09行的运行结果可以看出,该函数在实际运行时将x的传入值和y、z的默认值进行了相加。
代码10行向该函数传入了两个参数,它们分别对应参数x和参数y。从11行的运行结果可以看出,这里仅有z使用了默认值进行计算,而y的默认值20被传入的值40替换了。
同样,在代码12行的函数调用中,我们传入了所有的参数值,这时原来设置的可选参数的默认值就没有用了,计算的元素值全部被替换成所传入的值。