Syntax 变量范围和数字函数

Syntax 变量范围和数字函数,syntax,scope,julia,Syntax,Scope,Julia,我的问题有两个: 1) 据我所知,像for循环这样的构造引入了作用域块,但是我在定义在所述构造之外的变量时遇到了一些问题。以下代码描述了从数字中提取数字并将其放入数组的尝试 n = 654068 l = length(n) a = Int64[] for i in 1:(l-1) temp = n/10^(l-i) if temp < 1 # ith digit is 0 a = push!(a,0) else # ith digit is !=

我的问题有两个:

1) 据我所知,像for循环这样的构造引入了作用域块,但是我在定义在所述构造之外的变量时遇到了一些问题。以下代码描述了从数字中提取数字并将其放入数组的尝试

n = 654068
l = length(n)
a = Int64[]
for i in 1:(l-1)
    temp = n/10^(l-i)
    if temp < 1 #  ith digit is 0
        a = push!(a,0)
    else # ith digit is != 0
        push!(a,floor(temp))
        # update n
        n = n - a[i]*10^(l-i)
    end
end
# last digit
push!(a,n)
我认为for循环内部发生的任何事情对外部都是不可见的,除非我是在for循环外部定义的变量上操作。而且,我认为通过使用
语法我将直接对
a
进行操作,但情况似乎并非如此。如果有人能向我解释这是如何工作的,我将不胜感激:)

2) 第二个问题是关于解释函数时使用的syntex。显然有一个名为digits的函数,它使用我得到的帮助函数从数字中提取数字并将它们放入数组中

julia> help(digits)
Base.digits(n[, base][, pad])
   Returns an array of the digits of "n" in the given base,
   optionally padded with zeros to a specified size. More significant
   digits are at higher indexes, such that "n ==
   sum([digits[k]*base^(k-1) for k=1:length(digits)])".

有人能给我解释一下如何解释Julia中给出的函数信息吗。我如何解释
数字(n[,base][,pad])
?如何正确调用digits函数?我不能这样:
数字(40125[,10])

我无法重现您的结果,运行您的代码会给我

julia> a
1-element Array{Int64,1}:
 654068
代码中存在一些错误和低效:

  • length(n)
    不会给出
    n
    中的位数,但总是返回1(目前,数字是可编辑的,并且返回一个只包含一个数字的序列;本身)。所以for循环永远不会运行
  • /
    整数之间进行浮点除法。要提取数字,最好使用
    div(x,y)
    ,它进行整数除法
  • 没有理由写
    a=push!(a,x)
    ,因为
    就地修改
    a
    。因此,这相当于编写
    push!(a,x);a=a
  • 没有理由特别地将数字设为零,它们在一般情况下处理得很好
你在《朱莉娅》中对范围界定的描述似乎是正确的,我认为正是上述内容给你带来了麻烦

你可以用像这样的东西

n = 654068
a = Int64[]
while n != 0
    push!(a, n % 10)
    n = div(n, 10)
end
reverse!(a)
此循环以相反的顺序提取数字,以避免必须事先计算出位数,并使用模运算符
%
提取最低有效位。然后使用
反向
以按您想要的顺序获取它们,这应该非常有效

关于
数字的文档
[,base]
只是意味着
base
是一个可选参数。说明可能应该是
数字(n[,base[,pad]])
,因为除非指定
base
,否则无法指定
pad
。还要注意的是,
数字
将首先返回最低有效位,如果我们删除
反向,我们会得到什么来自上面的代码。

这是作弊吗

n = 654068
nstr = string(n)
a = map((x) -> x |> string |> int , collect(nstr))
产出:

6-element Array{Int64,1}:
6
5
4
0
6
8

哇,在这么少的代码行中出现这么多错误真是令人尴尬:p但非常感谢你为我澄清了这一点,你的代码工作得很有魅力:)我想说,没有作弊,但效率不高。不过它还是管用的!我决定做一个快速检查,是的,@StefanKarpinski,这个版本似乎比Toivo的版本慢一个数量级,但是将映射函数更改为
(c)->c-“0”
可以使它达到基本相同的速度:)我假设
字符串(::Int)
会非常快(即使在处理更多的情况下…) - ; )
6-element Array{Int64,1}:
6
5
4
0
6
8