不定参数

不定参数的函数也称变参函数

函数的参数可以被定义成任意个

可以在最后一个参数后紧跟省略号“...”来定义变参函数

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method)

对变参函数进行参数传递

julia> bar(1)
ERROR: MethodError: no method matching bar(::Int64)
Closest candidates are:
bar(::Any, ::Any, ::Any...) at REPL[1]:1
Stacktrace:
[1] top-level scope at none:0 julia> bar(1, 2)
(1, 2, ()) julia> bar(1, 2, 3)
(1, 2, (3,)) julia> bar(1, 2, 3, 4)
(1, 2, (3, 4)) julia> bar(1, 2, 3, 4, 5)
(1, 2, (3, 4, 5))

最前的两个参数 x,y 为普通的参数,需要对其进行传值,不然就报错了

变量 z 是尾随的可迭代的参数集合,其参数个数为 0 或多个,返回的是一个多元组

函数调用时,也可以使用“...”

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method) julia> z = (3, 4)
(3, 4) julia> bar(1, 2, z...)
(1, 2, (3, 4))

多元组的值完全按照变参函数的定义进行内插,也可以不完全遵守其函数定义来调用

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method) julia> z = (2, 3, 4)
(2, 3, 4) julia> bar(1, z...)
(1, 2, (3, 4)) julia> z = (1, 2, 3, 4)
(1, 2, 3, 4) julia> bar(z...)
(1, 2, (3, 4))

被内插的对象也可以不是多元组

julia> bar(x, y, z...) = (x, y, z)
bar (generic function with 1 method) julia> z = [3, 4]
2-element Array{Int64,1}:
3
4 julia> bar(1, 2, z...)
(1, 2, (3, 4)) julia> z = [2, 3, 4]
3-element Array{Int64,1}:
2
3
4 julia> bar(1, z...)
(1, 2, (3, 4)) julia> z = [1, 2, 3, 4]
4-element Array{Int64,1}:
1
2
3
4 julia> bar(z...)
(1, 2, (3, 4))

可选参数

函数的参数可以设置默认值

julia> function f(x, y=3)
x + y
end
f (generic function with 2 methods) julia> f(4)
7 julia> f(4, 5)
9

定义了一个函数 f() ,有两个参数,一个是参数 x,一个是默认值为 3 的参数 y

调用该函数的时候,如果只传入一个值,则这个值赋给参数 x,参数 y 为默认值 3

如果传入两个值,则第一个值赋给参数 x,第二个值赋给参数 y,覆盖了默认值 3

关键字参数

使用关键字参数的函数,在函数签名中使用分号来定义

julia> function f(name, age; sex="male", country="jp")
println(name)
println(age)
println(sex)
println(country)
end
f (generic function with 1 method) julia> f("jack", 23)
jack
23
male
jp julia> f("jack", country="us",22, sex="female")
jack
22
female
us julia> f("jack", country="us", sex="female", 34)
jack
34
female
us

额外的关键字参数,可以像变参函数中一样,使用“...”来匹配

function f(x; y=0, args...)
###
end

在函数 f 内部, args 可以是 (key,value) 多元组的集合,其中 key 是符号

可以在函数调用时使用分号来传递这个集合,如 f(x, z=1; args...),这种情况下也可以使用字典

关键字参数的默认值仅在必要的时候从左至右地传值(当对应的关键字参数没有被传递),所以默认的(关键字参数的)表达式可以调用在它之前的关键字参数

默认值的求值作用域

可选参数和关键字参数的区别在于它们的默认值是怎样被求值的

当可选的参数被求值时,只有在它之前的的参数在作用域之内

当关键字参数的默认值被计算时, 所有的参数都是在作用域之内

function f(x, a=b, b=1)
###
end

在 a=b 中的 b 指的是该函数的作用域之外的 b ,而不是接下来的参数 b

Julia - 函数的参数传递的更多相关文章

  1. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  2. C++函数的参数传递机制以及参数的类型选择

    C++primer之函数的参数传递以及参数的类型 一:函数的基本知识 (1)      函数要素:返回类型,函数名字,形参(参数之间用逗号隔开) (2)      函数调用机制:我们通过调用运算符来执 ...

  3. 深入剖析C/C++函数的参数传递机制

    2014-07-29 20:16 深入剖析C/C++函数的参数传递机制    C语言的函数入口参数,可以使用值传递和指针传递方式,C++又多了引用(reference)传递方式.引用传递方式在使用上类 ...

  4. Python学习笔记7-把函数当参数传递、指定可变参数

    把函数当参数传递 # 函数参数传递 # 面向对象编程就是把对象传来传去 # 面向函数编程就是把函数传来传去 def mytest(num): return num * 2 # # 不光可以传递变量,还 ...

  5. JQuery实战中遇到的两个小问题$(document).ready() 、bind函数的参数传递问题

    一.$(document).ready() 与 window.onload的区别 1.执行时间 window.onload 必须等到页面内所有元素(包括图片 css js等)加载完毕后才会执行. $( ...

  6. JS循环中使用bind函数的参数传递问题

    JS循环中使用bind函数的参数传递问题,问题代码如下: for (var sc in result) { var tempp = '<div class="sidebar_todo_ ...

  7. shell函数【参数传递及输入输出】&内置函数

    Linux——shell脚本基础3:shell函数[参数传递及输入输出]&内置函数 函数定义 1 退出状态 1 参数传递 2 标准IO 2 脚本调试 2 AND&OR 3 内置命令补充 ...

  8. js中函数的参数传递

    js中所有函数的参数传递都是按值传递,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样,基本类型值的传递如同基本类型变量的复制一样,而引用类型的值的传递则如同引用类型 ...

  9. Python中函数的参数传递与可变长参数

    转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...

随机推荐

  1. 【跟着stackoverflow学Pandas】“Large data” work flows using pandas-pandas大数据处理流程

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  2. QUnit使用

    什么是单元测试 每个单元测试就是一段用于测试一个模块或接口是否能达到预期结果的代码. QUnitjs 概念Qunit是一款强大的用于帮助调试代码的,JavaScript单元测试框架.是jQuery的官 ...

  3. .net collection tips

    1.数组对象都是Array的子类,Array是一个抽象类,不能显示实例化,Array提供了大量操作数组的静态方法 2.ArrayList其实是内部封装了一个array,实现了IList的接口.add ...

  4. 在 Visual Studio中 使用Apache Cordova 开发安卓、iOS程序(自定义图标和闪屏)

    方法1 1台安装有linux的电脑,虚拟机也行,并安装imagemagick软件包.我用的是linux mint,直接在软件管理器中安装即可 把https://github.com/shamork/c ...

  5. HDU2157 How many ways矩阵再识

    春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室 ...

  6. SSZipArchive使用详解

    下载SSZipArchive,点击我.或者自己在这里下载. SSZipArchive功能: 解压zip文件 解压密码保护的zip文件 创建zip文件 追加到zip文件 压缩文件 使用一个名字来压缩NS ...

  7. sqlserver docker 安装部署试用

    1. 镜像   docker pull exoplatform/sqlserver 2. 镜像参数    docker run -d -e SA_PASSWORD=<passord> -e ...

  8. unity导入3dsMax源文件.max

    https://blog.csdn.net/qq_28002559/article/details/53693621 首先unity导入3dsMax文件为什么要使用.max而不用.fbx,因为我不是做 ...

  9. 让C# Excel导入导出,支持不同版本的Office(转)

    问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误. 找不到Excel Com组件,错误信息如下. 未能加载文件或程序集“Microsoft.Office.Int ...

  10. 你一定想知道的关于FPGA的那些事

    首先,如果您从未接触过FPGA(现场可编程门阵列),或者有过一点基础想要继续深入了解这个行业,在这里,会向您介绍FPGA,并且向您解释FPGA都能解决什么问题,如何解决这些问题,并讨论如何将设计进行优 ...