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行的函数调用中,我们传入了所有的参数值,这时原来设置的可选参数的默认值就没有用了,计算的元素值全部被替换成所传入的值。

(0)

相关推荐

  • Python函数的基础学习

    Python函数的基础学习 一.函数分类 二.函数基本形式 三.形参与实参 1.定义理解 2.改变形对实参的影响 四.参数类型 1.位置参数 2.默认值参数 1.默认值参数位置问题 2.理解默认值参数 ...

  • python再谈函数

    python再谈函数

  • python到底还有哪些函数我们还没见过?原来有这么多实用的函数

    本文将将主要介绍如下内容 函数介绍 1.1 函数的定义 所谓的函数,其实就是具有特定功能的一段代码块,都可以独立的运行 . 函数有5部分组成,分别是定义函数的关键字,函数的名字,圆括号(存放函数的参数 ...

  • 函数与Lambda表达式

    函数参数定义 # 学习人员:贾其豪# 开发时间:2021/1/31 14:05#函数定义默认值参数#函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参def fun(a,b=10): ...

  • 第13天:Python 函数的参数

    定义一个函数非常简单,但是怎么定义一个函数,需要什么参数,怎么去调用却是我们需要去思考的问题. 如同大多数语言一样(如 Java),Python 也提供了多种参数的设定(如:默认值参数.关键字参数.形 ...

  • Julia机器核心编程.函数

    函数是任何编程语言都不可缺少的一部分,因为函数对功能进行模块化封装,提高了程序的可读性和可重用性.Julia也不例外,它不仅提供了一些内置的库函数,同时也允许用户自定义函数. 在Julia中使用fun ...

  • Julia机器核心编程.高阶函数

    我这个起名好麻烦,都说函数完了.有整出来一个高阶函数,比较麻烦. 嵌套函数,简单来说,就是在函数中定义函数. 闭包是一个函数对象,它可以记住封闭范围中的值,即使它们不在内存中也是如此. 嵌套函数有助于 ...

  • Julia机器核心编程.5

    julia的浮点数 bits这个函数好像没有了,我xiang给你看下这个值 的二进制表示在最全面的符号位不同 指数形式的浮点数 代码01行使用f代替e来表示这是一个Float32类型的值.代码03行使 ...

  • Julia机器核心编程.7

    可以说,无论是R(data.frame)还是Python(Pandas)中的表格都是统计计算中最重要和最常用的数据类型.这是因为真实世界中的数据大多是表格式的,不能用简单的DataArray来表示. ...

  • Julia机器核心编程.作用域

    当我们在Julia中定义函数时,也可以在函数体内定义变量.在这种情况下,该变量在该函数的局部范围内有效,因此称为局部变量.而未在函数体内声明的变量在全局范围内有效,因此称为全局变量. 不同代码块中的变 ...

  • Julia机器核心编程.多重分配

    在开始深入探讨多重分派这个主题之前,我们先问自己一个简单的问题:分派到底是什么意思?用最简单的术语来解释,分派的意思就是发送! 在编程术语中,分派意味着向监听器发送一条消息或者调用一个函数.基本上就是 ...

  • Julia机器学习核心编程.1

    其实这个地方是应该有一个juliahitory的目录的,可是没有 只能曲线救国,这样搜索的用了 Ctrl+R 在终端里面搜索用过的命令 shift+?进入帮助模式 分号进入shell模式 报错打脸了 ...

  • Julia机器学习核心编程.4

    在win上加e参数,执行这个代码.不可以.类unix可以试试,我有空操作 我超级喜欢这种循环写法 我这个传参写法没有错,不知道这么久没有出来 与其他编程语言一样,Julia可以更改存储在变量中的值或改 ...

  • Julia机器学习核心编程.3

    一般来说,解决问题的思路是先找出问题的来源,然后将问题分解成若干个小问题逐一解决.同时,还需要考虑所有情况,以保证该方法能完整地解决问题.而编程范式就是一种将编程活动分解的思想,虽然编程范式有很多种, ...