【问题标题】:Repeat a function call N times重复函数调用 N 次
【发布时间】:2020-01-18 13:26:28
【问题描述】:

在 Julia 中使用相同的参数调用函数 n 次并将结果返回到数组中的最简单方法是什么?例如,我想得到一个随机字符串数组,每个字符串都有一定的长度。我能想到的最好的是

julia> map(_ -> randstring(4), 1:6)
6-element Array{String,1}:
 "xBWv"
 "CxJm"
 "KsHk"
 "UUIP"
 "64o4"
 "QNgm"

另一种选择是使用广播,例如以下任一方式:

# Broadcast over an array of 4's
randstring.(fill(4, 6))

# Broadcast over an iterator that repeats the number 4 six times
using Base.Iterators
randstring.(repeated(4, 6))

但是,我更喜欢replicate(randstring(4), 6) 这样的语法。为了比较,在 R 中我会做以下事情:

> # Sample from lower-case letters only:
> random_string <- function(n) paste(sample(letters, n, replace = TRUE), collapse = '')
> replicate(6, random_string(4))
[1] "adru" "neyf" "snuo" "xvnq" "yqfv" "gept"

【问题讨论】:

  • 考虑将标题更新为“... in Julia”。
  • @logankilpatrick julia 标记足以表示编程语言,您会发现该标记也被 google 和堆栈溢出搜索拾取。

标签: julia


【解决方案1】:

我会去

using Random
six_randstrings = [randstring(4) for _ in 1:6]

【讨论】:

    【解决方案2】:

    如果您对直接使用 map 或数组推导不满意,那么您可以为此创建一个宏:

    macro replicate(ex, n)
        return :(map(_ -> $(esc(ex)), 1:$(esc(n))))
    end
    
    @replicate(rand(), 4)
    

    【讨论】:

    • 我认为您需要将exn 包装在esc 中,以便能够在另一个函数中使用@replicate,例如:(map(_ -&gt; $(esc(ex)), 1:$(esc(n))))。试试m, n = 3, 5; foo(m, n) = (m = 2m; n = 2n; @replicate(m, n)); foo(6, 10)
    【解决方案3】:

    虽然有一些方法可以在不引入包依赖关系的情况下做到这一点,但Lazy.jl 确实提供了很多这样的好用的工具。

    你特别说

    我的偏好是像 replicate(randstring(4), 6) 这样的语法

    首先,请注意,这不完全是“调用函数n 次,因为randstring(4) 不是函数,它会被求值。

    因此,您希望调用匿名函数 n 次,以与等式标题对齐,在这种情况下,您的首选语法是 replicate(()-&gt;randstring(4),6)

    好消息! Lazy.jl 通过函数 repeatedly 提供了几乎完全相同的语法。唯一的区别是它将n 作为它的第一个参数: repeatedly(6,()-&gt;randstring(4))

    另一个需要注意的区别是,由于其他原因,这会返回 LazyList 类型,而不是 Array

    现在,您可能不会注意到差异,例如您可以像 Array 一样索引和广播到 List

    但是,如果您不打算利用任何不错的 Lazy 属性,并且您确实需要将其设为 Array,那么您可以直接将 List 解压缩为 Array

    这是一个完整的例子:

    using Random
    using Lazy
    
    stringlist = repeatedly(6,()->randstring(4))
    
    stringarray = [stringlist...]
    

    【讨论】:

    • Julia(以及我知道的所有其他编程语言)在调用之前首先评估参数。所以@Jesse 是对的,当replicate 被称为randstring(4) 时,它只是一个字符串。幸运的是,匿名函数是一个简单的修复。
    • @tholy R 是惰性的,在函数内部使用参数之前不会计算参数。
    • @tholy Haskell 是另一种惰性计算函数参数的语言。
    猜你喜欢
    • 2021-10-19
    • 2019-02-09
    • 2023-03-16
    • 1970-01-01
    • 2021-11-30
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多