整个 Julia 学习路径都会要求你把你提交的解答当作小型库。也就是说,你需要定义函数、类型等,然后让测试套件来运行它们。 因此,我们会把命名函数作为第一个概念来介绍。
Julia 是一门动态的强类型编程语言。 编程风格主要是函数式的,但比 Haskell 等语言更灵活。
不需要提前声明变量。 只需把值赋给一个合适的名字:
julia> myvar = 42 # an integer
42
julia> name = "Maria" # strings are surrounded by double-quotes ""
"Maria"
如果某个值需要在整个程序中可用,但不期望它改变,最好把它标记为常量。
在赋值前加上const关键字,可以让编译器生成比变量更高效的代码。
常量还有助于避免编码错误。
如果不小心试图修改const值,就会收到警告:
julia> const answer = 42
42
julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24
注意,const只能声明在任何函数外部。
通常它会位于*.jl文件顶部附近,在函数定义之前。
这些与许多其他语言中的相同:
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division with floating-point result)
8 % 3 # 2 (remainder)
在 Julia 中定义命名函数有两种常见方式:
使用function关键字
function muladd(x, y, z)
x * y + z
end
按 4 个空格缩进是常见做法,便于阅读,但编译器会忽略它。
end关键字必不可少。
注意,我们本来可以写成return x * y + z。
不过,Julia 函数总是返回最后被求值的表达式,所以return关键字是可选的。
许多程序员更愿意加上它,以让意图更明确。
使用“赋值形式”
muladd(x, y, z) = x * y + z
这最常用于编写简洁的单表达式函数。
在赋值形式中从不使用return关键字。
这两种形式是等价的,使用方式完全相同,所以选择更易读的那种。
调用函数时,需要指定函数名,并为函数的每个形参传入实参:
# invoking a function
muladd(10, 5, 1)
# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)
与许多语言一样,Julia 要求名称(变量、函数以及许多其他事物的名称)以字母开头,后面可以是字母、数字和下划线的任意组合。
按照惯例,变量、常量和函数名都使用小写,并尽量少用下划线。
在这个练习中,你将编写一些代码,帮你照着最喜欢的烹饪书做出一份美味的千层面。
你有四个任务,全都和烹饪千层面所花的时间有关。
定义expected_bake_time常量,它返回千层面需要在烤箱中烘焙多少分钟。
按照这本烹饪书,千层面需要在烤箱中总共烤 60 分钟。
julia> expected_bake_time
60
定义preparation_time函数,它接收你给千层面添加的层数作为实参,并返回你准备千层面花了多少分钟。假设每加一层需要 2 分钟准备。
julia> preparation_time(4)
8
定义remaining_time函数,它接收千层面已经在烤箱中度过的实际分钟数作为形参,并返回千层面还需要在烤箱中烤多少分钟。
julia> remaining_time(50)
10
定义total_working_time函数,它接收两个实参:第一个实参是你给千层面添加的层数,第二个实参是千层面已经在烤箱中度过的分钟数。
该函数应返回你烹饪千层面总共花了多少分钟,也就是准备时间的分钟数与此刻千层面在烤箱中已度过的分钟数之和。
julia> total_working_time(3, 20)
26