不定参数

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

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

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

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. Kotlin Reference (二) Idioms

    most from reference 一些常用操作 创建单例类 object 数据类data classList.Map.Array的简单操作Lazy延迟加载属性空类型?空类型表达式?..?:.?. ...

  2. 上周面试回来后写的Java面试总结,想进BAT必看

    上周陪同之前一起工作的同事去面试(乔治,小袁,鹏飞(面试人)),第一站是去深圳,第二站上海,第三站杭州.面试什么公司我在这里就不多说了,你们知道是一线公司就行.其实本来真的没打算写这篇文章,主要是自己 ...

  3. Java面试题收集以及参考答案(100道)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  4. XMPP协议相关知识

    XMPP协议的组成 主要的XMPP 协议范本及当今应用很广的XMPP 扩展: RFC 3920 XMPP:核心.定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XM ...

  5. lx 与cd 的计算方法

    Candela to lux calculation with distance in meters The illuminance Ev in lux (lx) is equal to the lu ...

  6. java并发--Callable、Future和FutureTask

    在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...

  7. Java并发--同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...

  8. Codeforces 559C Gerald and Giant Chess【组合数学】【DP】

    LINK 题目大意 有一个wxh的网格,上面有n个黑点,问你从(1,1)走到(w,h)不经过任何黑点的方案数 思路 考虑容斥 先把所有黑点按照x值进行排序方便计算 \(dp_{i}\)表示从起点走到第 ...

  9. 开启opcache提高性能

    在开启opcache之前,我们先介绍一下编译与解释: 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快:而解释器则是只在执行程 ...

  10. HTML CSS 表格换行禁止 超出指定长度自动截断

    word-break:keep-all; white-space:nowrap; overflow:hidden; min-width:30px; max-width:100px;