不定参数

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

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

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

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. RxJava 1.x 笔记:创建型操作符

    本篇文章是阅读 官方文档 的笔记. 作者:shixinzhang(百度搜索 "shixinzhang CSDN" 即可找到我) RxJava 也用了有段时间,那么多操作符总不想去记 ...

  2. Emgu cv 学习笔记

    http://www.cnblogs.com/CoverCat/p/5003363.html emgu中imagebox与picturebox imagebox 是emgu   设置好厚,新出现的控件 ...

  3. iOS 解决上传100张图片内存奔溃问题

    最近项目需求,从相册中提取100张图片,然后上传到服务器.前提是图片不能压缩.因为要将图片信息采集出来制作出3D模型.所以必须是高清图片. 先看下代码 [NetWorking uploadWithUr ...

  4. android 获取 图片或视频略缩图

    /** * 根据指定的图像路径和大小来获取缩略图 此方法有两点好处: 1. * 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度, * 第二次读取的bitmap是根 ...

  5. ZOJ3551Bloodsucker (数学期望)

    In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothin ...

  6. HDU2825 Wireless Password 【AC自动机】【状压DP】

    HDU2825 Wireless Password Problem Description Liyuan lives in a old apartment. One day, he suddenly ...

  7. MAC OS环境下搭建基于Python语言的Selenium2自动化测试环境

    #1安装Python Mac OS上自带python2.7,在此介绍安装python3.x版本 去官网下载Python for MAC版本 https://www.python.org 安装文件为pk ...

  8. JS 区分单击双击

    var timeout =null; $("#Btn").on("click",function(){ clearTimeout(timeout);//停止单击 ...

  9. Python中super()和__init__()方法

    采用新式类,要求最顶层的父类一定要继承于object,这样就可以利用super()函数来调用父类的init()等函数, 每个父类都执行且执行一次,并不会出现重复调用的情况.而且在子类的实现中,不用到处 ...

  10. 【最全 干货 实例】 缓存手册(Memcached、redis、RabbitMQ)

    http://www.cnblogs.com/suoning/p/5807247.html 本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 re ...