Julia机器核心编程.高阶函数
我这个起名好麻烦,都说函数完了.有整出来一个高阶函数,比较麻烦.
嵌套函数,简单来说,就是在函数中定义函数。
闭包是一个函数对象,它可以记住封闭范围中的值,即使它们不在内存中也是如此。
嵌套函数有助于开发者向最终用户屏蔽函数的实际实现。
下面定义一个outer函数,并在其中定义一个inner函数。
抱歉这个排版不好看
代码01~05行定义的函数是外层函数,而02~04行定义的函数是内层函数,并且很明显,由于内层函数在外层函数内,所以内层函数可以使用外层函数中定义的各种变量。
我们将两个不同的参数传递给两个函数,然后利用它们返回两个字符串连接后的值(在Julia中“*”用于连接字符串)或者两个整数相乘后的值,这取决于所传入的参数的数据类型。同时,还要假设所传入的两个参数的类型相同,因为如果两个参数一个是字符串,一个是整数,那么就会由于函数设计的问题而抛出一个错误。
在Julia REPL中调用相同的函数,这里我们让所传入的两个参数都是Int64类型。
代码01行首先调用outer函数,传入第一个外层参数100,然后将函数的返回结果赋值给result,那么外层函数返回了什么给result呢?实际上,外层函数将内层函数作为一个整体返回给了result,从02行的结果可以看出,result实际上对应的就是inner函数。代码04行使用typeof函数查看result的类型,可以看出result的类型实际上就是一个函数。
最后在代码07行调用result所对应的函数,并传入100作为第二个参数,经过计算,08行返回了两个参数相乘所得到的结果10000。
同样,下面我们给函数传递两个String类型的参数。
代码01~08行与上一个例子基本一样,只不过在传入参数变成两个字符串的情况下,Julia会自动将两个字符串连接在一起。
在上述两种情况下,我们都是先将outer函数的值赋给result变量,然后将第二个参数传递给result对象所代表的函数,完成后才得到预期的结果。
接下来是匿名函数啦,马上就要把今天的任务写完了,嘻嘻嘻.
匿名函数(lamuda函数)
匿名函数是常规函数的一种简写方式。当一个函数仅会被使用有限次数时,在编写代码时就可以使用匿名函数,而不使用命名函数,这样有助于我们更容易和更快地写出代码。匿名函数有时也被称为lambda函数。
想要明白匿名函数的用处,只需要考虑一个场景:假如希望使用map()函数在一个列表的每个值上都应用一个函数,我们可以轻松地定义一个匿名函数来解决这个问题,而不必写下一个完整的命名函数,也就再也不必费心给函数命名了!
在Julia中,我们可以使用以下语法定义一个匿名函数。
写了一个出来
上面的语法使用“−>”来提示我们这里定义了一个匿名函数。但是,需要铭记于心的是,匿名函数本身没有用,因为它们没有名字,因此无法从代码的任何位置进行调用。
代码01行定义了一个map()函数,它可以接收两个参数:第一个是函数;第二个是一个可以轻松迭代的值的集合。
为简单起见,我们使用一个列表来作为第二个参数。
这里的第一个参数f−> 3f是一个匿名函数,它的作用是从列表中获取一个值并乘以3。f就是传入的参数,−>代表参数的变化方向,3f代表参数变成原来的3倍。从代码02~03行可以看出,数组中的所有元素都被改变了。需要注意的是,代码06行中传入的参数和01行是不一样的,在01行中传入的是一个拥有两个int类型元素的数组,而在06行中传入的是一个单独的数组,这两个参数是有一定的区别的。
上面的例子只讨论了接收一个参数的匿名函数。但是,如果有多个传入参数该怎么办呢?为了解决这个问题,我们可能会被迫使用开括号和闭括号来表示函数体内的变量元组。
在这个例子中使用了一个map()函数,它同时接收多个列表。执行此map()函数的结果为3f + 3g,即3*(2)+3*(3)=15和3*(3)+3*(4)=21。
最近在看一些关于科学哲学的书籍.看完以后其实有一种深深地无力感