译者按:Julia是一门非常年轻,但又极具生命力的程序语言,它既有脚本语言的灵活性和易用性,但又不失传统编译语言的一些常见用法和高效率,在很多机构给出的数据科学类程序语言性能评比中,Julia都名列前茅。在译者看来,Julia很好地融汇了Python等脚本语言的精华,但又采用了很多C语言的规范和用法,因此对于大多数已经有编程经验的读者来说,Julia都不会让人感到陌生。因此,译者在这里极力推荐大家一窥Julia的门径,体验一下这门强大而生机勃勃的程序语言。
本文译自 juliabyexample.helpmanual.io ,为方便大家学习,所有代码将在本站提供在线运行环境,您可以点击运行按钮查看真实的程序输出结果,并通过自己的修改来增强记忆。由于原文较长,本站将分三篇文章进行翻译,为方便大家浏览,部分译文有删改。
Hello World
首先来看看世界上最流行的代码:
Hello World
xxxxxxxxxx
1 1
println("hello world")
如果你已经在你的电脑上安装好Julia,那么你可以把上述的Julia脚本保存为hello_world.jl
然后通过julia hello_world.jl
来执行它。你也可以通过include("hello_world.jl")
来应用这段脚本,它将执行文件中的所有表达式然后给出最后的输入。
几个森破的函数
下面的例子中给出了几个简单的函数以及它们的调用方法。下文中会提到关于数字规格化的更多例子。
简单函数示例
xxxxxxxxxx
11 1
# 一个用来计算球体体积的函数
2
function sphere_vol(r)
3
# julia允许使用unicode字符作为函数名(UTF-8编码)
4
# 所以单词"pi"和字符π都是可以使用的
5
return 4/3*pi*r^3
6
end
7
8
vol = sphere_vol(3)
9
# @printf 方法允许数字规格化当时不会自动在句末加上\n,请参看下文的例子
10
@printf "volume = %0.3f\n" vol
11
# 程序输出: volume = 113.097
xxxxxxxxxx
4 1
# 函数也可以通过这样的方式快速定义
2
quadratic(a, sqr_term, b) = (-b + sqr_term) / 2a
3
4
quadratic(1, 2, 3)
xxxxxxxxxx
19 1
quadratic(a, sqr_term, b) = (-b + sqr_term) / 2a
2
3
# 求解方程 0 = a*x^2+b*x+c, 参数类型可在函数定义时声明
4
function quadratic2(a::Float64, b::Float64, c::Float64)
5
# 与很多程序语言不一样的是,2*a可以用2a来表示
6
# 另外,a**2和pow(a,2)可以用a^2来表示
7
sqr_term = sqrt(b^2-4a*c)
8
r1 = quadratic(a, sqr_term, b)
9
r2 = quadratic(a, -sqr_term, b)
10
# 函数可以同时传回多个返回值
11
# 如果函数中没有使用return来标明返回值,则函数会返回最后一段表达式中的变量
12
r1, r2
13
end
14
15
quad1, quad2 = quadratic2(2.0, -2.0, -12.0)
16
println("result 1: ", quad1)
17
# 程序输出: result 1: 3.0
18
println("result 2: ", quad2)
19
# 程序输出: result 2: -2.0
字符串的一些例子
下面是一些不同的字符串处理的例子(字符串中的指针和数组指针实质上是一样的,参见下文的例子)。
字符串定义
xxxxxxxxxx
5 1
# 我们使用双引号"来定义字符串
2
# 和变量名一致,字符串中可以包含任意的unicode字符
3
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
4
println(s1)
5
# 程序输出: The quick brown fox jumps over the lazy dog α,β,γ
xxxxxxxxxx
6 1
# println 会在输出末尾换行
2
# print 则不会这样
3
print("this")
4
print(" and")
5
print(" that.\n")
6
# 程序输出: this and that.
xxxxxxxxxx
9 1
# 字符可以使用单引号'来定义
2
c1 = 'a'
3
println(c1)
4
# 程序输出: a
5
# 可以用 Int() 来获取字符的ascii值
6
println(c1, " ascii value = ", Int(c1))
7
# 程序输出: a ascii value = 97
8
println("Int('α') == ", Int('α'))
9
# 程序输出: Int('α') == 945
xxxxxxxxxx
8 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# 字符串可以简单地转换为全大写或是全小写
4
s1_caps = uppercase(s1)
5
s1_lower = lowercase(s1)
6
println(s1_caps, "\n", s1_lower)
7
# 程序输出: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG Α,Β,Γ
8
# 程序输出: the quick brown fox jumps over the lazy dog α,β,γ
xxxxxxxxxx
14 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# 子字符串的指针和数组是类似的
4
# (show函数会输出真实的值)
5
show(s1[11]); println()
6
# 程序输出: 'b'
7
8
# 也可以使用这样的方法获取子字符串
9
show(s1[1:10]); println()
10
# 程序输出: "The quick "
11
12
# end可以被用来指定字符串或是数组的末尾
13
show(s1[end-10:end]); println()
14
# 程序输出: "dog α,β,γ"
xxxxxxxxxx
9 1
# julia支持字符串嵌入
2
a = "welcome"
3
b = "julia"
4
println("$a to $b.")
5
# 程序输出: welcome to julia.
6
7
# 这还可以用来完成计算
8
println("1 + 2 = $(1 + 2)")
9
# 程序输出: 1 + 2 = 3
xxxxxxxxxx
11 1
# 字符串之间可以使用*运算符连接
2
# 使用*来代替+好像显得不那么直观
3
# 但大家觉得这样更好(PHPers也是这么想的😂
4
s2 = "this" * " and" * " that"
5
println(s2)
6
# 程序输出: this and that
7
8
# 当然,你也可以使用string函数
9
s3 = string("this", " and", " that")
10
println(s3)
11
# 程序输出: this and that
字符串的转换与规格化
字符串类型转换
xxxxxxxxxx
8 1
# 字符串可以使用float和int函数来转换类型
2
e_str1 = "2.718"
3
e = float(e_str1)
4
println(5e)
5
# 程序输出: 13.59
6
num_15 = parse(Int, "15")
7
println(3num_15)
8
# 程序输出: 45
xxxxxxxxxx
14 1
e_str1 = "2.718"
2
e = float(e_str1)
3
# 使用printf可以将数字转换成字符串并加以规格化
4
@printf "e = %0.2f\n" e
5
# 程序输出: 2.72
6
7
# 或是使用sprintf构建另一个字符串
8
e_str2 = @sprintf("%0.3f", e)
9
println(e_str2)
10
# 程序输出: 2.718
11
12
# 同时输出两个字符串:
13
println("e_str1 == e_str2: $(e_str1 == e_str2)")
14
# 程序输出: e_str1 == e_str2: true
xxxxxxxxxx
17 1
# 可用的数字格式字符有f, e, g, c, s, p, d:
2
# (pi是一个预先定义好的常量;但因为它的类型是"MathConst",它必须先要转换为float类型才能被规格化)
3
@printf "fix trailing precision: %0.3f\n" float(pi)
4
# 程序输出: fix trailing precision: 3.142
5
@printf "scientific form: %0.6e\n" 1000pi
6
# 程序输出: scientific form: 3.141593e+03
7
# g这种用法尚未被指定
8
@printf "a character: %c\n" 'α'
9
# 程序输出: a character: α
10
@printf "a string: %s\n" "look I'm a string!"
11
# 程序输出: a string: look I'm a string!
12
@printf "right justify a string: %50s\n" "width 50, text right justified!"
13
# 程序输出: right justify a string: width 50, text right justified!
14
@printf "a pointer: %p\n" 100000000
15
# 程序输出: a pointer: 0x0000000005f5e100
16
@printf "print a integer: %d\n" 1e10
17
# 程序输出: print an integer: 10000000000
字符串操作
字符串搜索
xxxxxxxxxx
12 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# search函数返回某个字符在字符串中第一次出现的位置
4
i = search(s1, 'b')
5
println(i)
6
# 程序输出: 11
7
# 函数中第二个参数与split函数中第二个参数是一致的,参见下文
8
9
# 如果第二个参数是另一个字符串,则返回一个位置范围
10
r = search(s1, "brown")
11
println(r)
12
# 程序输出: 11:15
xxxxxxxxxx
6 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# 字符串的replace操作如下所示
4
r = replace(s1, "brown", "red")
5
show(r); println()
6
# 程序输出: "The quick red fox jumps over the lazy dog"
xxxxxxxxxx
11 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# search和replace方法可以使用正则表达式,此时字符串需加上前缀'r'
4
r = search(s1, r"b[\w]*n")
5
println(r)
6
# 程序输出: 11:15
7
8
# 另一个例子
9
r = replace(s1, r"b[\w]*n", "red")
10
show(r); println()
11
# 程序输出: "The quick red fox jumps over the lazy dog"
xxxxxxxxxx
11 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# julia中也有这样的函数:它能够寻找能被一个字符串匹配到的正则表达式,并以RegexMatch类型返回
4
# match函数会从左向右寻找第一个匹配(也可以人为指定开始的位置)
5
r = match(r"b[\w]*n", s1)
6
println(r)
7
# 程序输出: RegexMatch("brown")
8
9
# RegexMatch类型拥有一个match属性,这个属性记录了所匹配到的字符串
10
show(r.match); println()
11
# 程序输出: "brown"
xxxxxxxxxx
12 1
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
2
3
# matchall函数会返回一个数组,数组中包含所有符合要求的匹配
4
r = matchall(r"[\w]{4,}", s1)
5
println(r)
6
# 程序输出: SubString{String}["quick","brown","jumps","over","lazy"]
7
8
# eachmatch函数会迭代输出所有匹配结果
9
r = eachmatch(r"[\w]{4,}", s1)
10
for(i in r) print("\"$(i.match)\" ") end
11
println()
12
# 程序输出: "quick" "brown" "jumps" "over" "lazy"
xxxxxxxxxx
5 1
# 字符串可以使用repeat函数来重复显示,
2
# 也可以直接使用^运算符
3
r = "hello "^3
4
show(r); println()
5
# 程序输出: "hello hello hello "
xxxxxxxxxx
11 1
# strip函数的用法和python是一致的
2
# 当传入参数仅有一个时,函数将会删去字符串两边的空格
3
r = strip("hello ")
4
show(r); println()
5
# 程序输出: "hello"
6
7
# 当第二个参数指定为数组时,字符串将会删去其中所有的字符
8
r = strip("hello ", ['h', ' '])
9
show(r); println()
10
# 程序输出: "ello"
11
# (注意数组中是字符而不是字符串)
xxxxxxxxxx
16 1
# 类似的,split函数也与python中类似
2
r = split("hello, there,bob", ',')
3
show(r); println()
4
# 程序输出: ["hello"," there","bob"]
5
r = split("hello, there,bob", ", ")
6
show(r); println()
7
# 程序输出: ["hello","there,bob"]
8
r = split("hello, there,bob", [',', ' '], limit=0, keep=false)
9
show(r); println()
10
# 程序输出: ["hello","there","bob"]
11
# (后两个参数用来指定个数限制以及是否包含空字符)
12
13
# 与split相反的join函数就很简单了
14
r= join(collect(1:10), ", ")
15
println(r)
16
# 程序输出: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
未完待续