Julia快速入门(上)

译者按: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

未完待续

    原文作者:数据挖掘
    原文地址: https://juejin.im/entry/5b729d25e51d456652422fe4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞