Примечание переводчика: Julia — очень молодой, но очень энергичный язык программирования.Он обладает гибкостью и простотой использования скриптовых языков, но не уступает в распространенности и высокой эффективности традиционным компилируемым языкам.В оценке производительности языков программирования для обработки данных Учитывая учреждения, Юлия входит в число лучших. С точки зрения переводчика, Джулия хорошо интегрирует суть языков сценариев, таких как Python, но также перенимает многие спецификации и способы использования языка C. Поэтому для большинства читателей с опытом программирования Джулия не позволит людям чувствовать себя странно. Поэтому переводчик здесь настоятельно рекомендует вам взглянуть на Джулию и испытать этот мощный и яркий язык программирования.
Эта статья переведена сjuliabyexample.helpmanual.io, для удобства обучения все коды будут предоставлять онлайн-среду запуска на этом сайте, вы можете нажать кнопку запуска, чтобы просмотреть реальные результаты вывода программы, и улучшить память за счет собственных модификаций. Из-за длины исходного текста, этот сайт будет разделен на три статьи для перевода.Для удобства просмотра некоторые из переводов были удалены.
Hello World
Сначала посмотрите на самые популярные коды в мире:
Hello Worldxxxxxxxxxx1 1println("hello world")
Если у вас уже установлена Julia на вашем компьютере, вы можете сохранить приведенный выше скрипт Julia какhello_world.jlзатем пройтиjulia hello_world.jlвыполнить его. Вы также можете пройтиinclude("hello_world.jl")чтобы применить этот скрипт, он выполнит все выражения в файле и даст окончательный ввод.
Несколько сломанных функций Мори
Следующие примеры показывают несколько простых функций и как их позвонить. Еще примеры числовой нормализации упоминаются ниже.
Пример простой функцииxxxxxxxxxx11 1# 一个用来计算球体体积的函数2
function sphere_vol(r)3
# julia允许使用unicode字符作为函数名(UTF-8编码)4
# 所以单词"pi"和字符π都是可以使用的5
return 4/3*pi*r^36
end7
8
vol = sphere_vol(3)9
# @printf 方法允许数字规格化当时不会自动在句末加上\n,请参看下文的例子10
@printf "volume = %0.3f\n" vol 11
# 程序输出: volume = 113.097
Быстрое определение функцийxxxxxxxxxx4 1# 函数也可以通过这样的方式快速定义2
quadratic(a, sqr_term, b) = (-b + sqr_term) / 2a3
4
quadratic(1, 2, 3)
Функция с несколькими возвращаемыми значениямиxxxxxxxxxx19 1quadratic(a, sqr_term, b) = (-b + sqr_term) / 2a2
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, r213
end14
15
quad1, quad2 = quadratic2(2.0, -2.0, -12.0)16
println("result 1: ", quad1)17
# 程序输出: result 1: 3.018
println("result 2: ", quad2)19
# 程序输出: result 2: -2.0
Некоторые примеры строк
Вот несколько примеров различных манипуляций со строками (указатели в строках и указатели в массивах практически одинаковы, см. примеры ниже).
определение строкиxxxxxxxxxx5 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 α,β,γ
Две функции печати строкxxxxxxxxxx6 1# println 会在输出末尾换行2
# print 则不会这样3
print("this")4
print(" and")5
print(" that.\n")6
# 程序输出: this and that.
определение персонажаxxxxxxxxxx9 1# 字符可以使用单引号'来定义2
c1 = 'a'3
println(c1)4
# 程序输出: a5
# 可以用 Int() 来获取字符的ascii值6
println(c1, " ascii value = ", Int(c1))7
# 程序输出: a ascii value = 978
println("Int('α') == ", Int('α'))9
# 程序输出: Int('α') == 945
Конверсия строкаxxxxxxxxxx8 1s1 = "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 α,β,γ
подстрокаxxxxxxxxxx14 1s1 = "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 α,β,γ"
Встраивание строкxxxxxxxxxx9 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
Конкатенация строкxxxxxxxxxx11 1# 字符串之间可以使用*运算符连接2
# 使用*来代替+好像显得不那么直观3
# 但大家觉得这样更好(PHPers也是这么想的?4
s2 = "this" * " and" * " that"5
println(s2)6
# 程序输出: this and that7
8
# 当然,你也可以使用string函数9
s3 = string("this", " and", " that")10
println(s3)11
# 程序输出: this and that
Преобразование строк и нормализация
Преобразование типа строкиxxxxxxxxxx8 1# 字符串可以使用float和int函数来转换类型2
e_str1 = "2.718"3
e = float(e_str1)4
println(5e)5
# 程序输出: 13.596
num_15 = parse(Int, "15")7
println(3num_15)8
# 程序输出: 45
Нормализация строкxxxxxxxxxx14 1e_str1 = "2.718"2
e = float(e_str1)3
# 使用printf可以将数字转换成字符串并加以规格化4
@printf "e = %0.2f\n" e5
# 程序输出: 2.726
7
# 或是使用sprintf构建另一个字符串8
e_str2 = @sprintf("%0.3f", e)9
println(e_str2)10
# 程序输出: 2.71811
12
# 同时输出两个字符串:13
println("e_str1 == e_str2: $(e_str1 == e_str2)")14
# 程序输出: e_str1 == e_str2: true
Нормализация строкxxxxxxxxxx17 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.1425
@printf "scientific form: %0.6e\n" 1000pi6
# 程序输出: scientific form: 3.141593e+037
# 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" 10000000015
# 程序输出: a pointer: 0x0000000005f5e10016
@printf "print a integer: %d\n" 1e1017
# 程序输出: print an integer: 10000000000
Манипуляции со строками
Поиск строкиxxxxxxxxxx12 1s1 = "The quick brown fox jumps over the lazy dog α,β,γ"2
3
# search函数返回某个字符在字符串中第一次出现的位置4
i = search(s1, 'b')5
println(i)6
# 程序输出: 117
# 函数中第二个参数与split函数中第二个参数是一致的,参见下文8
9
# 如果第二个参数是另一个字符串,则返回一个位置范围10
r = search(s1, "brown")11
println(r)12
# 程序输出: 11:15
замена строкиxxxxxxxxxx6 1s1 = "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"
Приложение регулярного выраженияxxxxxxxxxx11 1s1 = "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:157
8
# 另一个例子9
r = replace(s1, r"b[\w]*n", "red")10
show(r); println()11
# 程序输出: "The quick red fox jumps over the lazy dog"
Приложение регулярного выраженияxxxxxxxxxx11 1s1 = "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"
Приложение регулярного выраженияxxxxxxxxxx12 1s1 = "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)\" ") end11
println()12
# 程序输出: "quick" "brown" "jumps" "over" "lazy"
Повтор строкиxxxxxxxxxx5 1# 字符串可以使用repeat函数来重复显示, 2
# 也可以直接使用^运算符3
r = "hello "^34
show(r); println()5
# 程序输出: "hello hello hello "
Обрезка струнxxxxxxxxxx11 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
# (注意数组中是字符而不是字符串)
Сегментация строкxxxxxxxxxx16 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
Продолжение следует