содержание
О Юлии
Переменные и строки
постоянный
тип
операция
функции и методы
поток управления
сфера
составной тип
Я слышал о Джулии и раньше, но в то время официальный сайт еще время от времени не работал.1.0 выпущенная версияЕго информация есть везде.На официальном сайте есть свой Упрощенный китайский.Попробую,пока горячо,и поболтаю о нем.
О Юлии
Джулия выросла из пользовательского спроса. Пользователи надеются получить скриптовый язык программирования с открытым исходным кодом, обладающий высокой производительностью C, гибкостью Ruby, макросами Lisp и удобными символами математических выражений, такими как Matlab. Его можно использовать как язык программирования общего назначения, такой как Python, для статистического анализа, как R, как естественный для строк, как Perl, как мощный, как Matlab для линейной алгебры, и как приклеенный к другим программам, как Shell.
Словом, обо всем думает, все как...
Официальная Юлия имеет следующие особенности (некоторые опущены):
- Быстро: Julia может быть скомпилирована в эффективный нативный код для разных платформ с помощью LLVM.
- Общие сведения: Джулия использует множественную диспетчеризацию в качестве парадигмы программирования, упрощая выражение объектно-ориентированных и функциональных парадигм программирования.
- Динамический: Джулия имеет динамическую типизацию, похожую на язык сценариев.
- Численные вычисления: Джулия хороша в числовых вычислениях, ее синтаксис подходит для математических вычислений, поддерживает несколько числовых типов и поддерживает параллельные вычисления.
- Необязательные аннотации типов: у Джулии подробные описания типов данных.
- Компонуемость: пакеты Julia можно запускать в естественных комбинациях. Валюта и цвет в одном столбце матрицы единичного количества или таблицы данных могут сочетаться с хорошей производительностью.
Переменные и строки
В Julia встроена поддержка операций с большими числами без вызова функций. Также поддерживает юникод
julia> 83275689127389671289376897238976*895623897689127389068912376897289/3487689234768972893+28358923785-23895728937
-3.4911515696355016e18
julia> unicode_var = "你好,中国"
"你好,中国"
julia> 'g'
'g': ASCII/Unicode U+0067 (category Ll: Letter, lowercase)
julia> λ = "special_variable_name"
"special_variable_name"
julia> λ = "redefine its value since it's a variable"
"redefine its value since it's a variable"
скопировать код
Строки будут обрабатывать escape-символы, если вы хотите сохранить их, вам нужно их добавить.raw
julia> println("hello\nworld")
hello
world
julia> println(raw"hello\nworld")
hello\nworld
скопировать код
Вы также можете получить соответствующий символ с помощью операции с индексом, и на последний символ ссылается конец, но индекс не начинается с 0!
julia> welcome[0]
ERROR: BoundsError: attempt to access "hello world"
at index [0]
julia> welcome[1]
'h': ASCII/Unicode U+0068 (category Ll: Letter, lowercase)
julia> welcome[end]
'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
скопировать код
Вы также можете использовать операции срезаwelcome[2:4]
получить подстрокуello
.
Чтобы объединить строки, используйте string(str1,str2.,..) или*
,Не работает+
.
Если вы хотите внутренне оценить строку (интерполяция официального термина), вам нужно использовать$(xx)
синтаксис:
julia> "3+2-5=$(3+2-5)"
"3+2-5=0"
julia> name = "yang"
"yang"
julia> "hello, $name"
"hello, yang"
скопировать код
Цель Джулии — иметь те же мощные возможности обработки строк, что и Perl, поэтому встроенные регулярные выражения — это производительность того, что они говорят. Его регулярные выражения совместимы с Perl и задаются какPCREПри условии, что следующий пример взят из официальной документации:
julia> r"^\s*(?:#|$)"
r"^\s*(?:#|$)"
julia> typeof(ans)
Regex
julia> m = match(r"(a|b)(c)?(d)", "acd")
RegexMatch("acd", 1="a", 2="c", 3="d")
julia> m.match
"acd"
julia> m.captures
3-element Array{Union{Nothing, SubString{String}},1}:
"a"
"c"
"d"
скопировать код
постоянный
постоянный пропускconst
Ключевое слово указано, но константа может быть переопределена.REPL выводит только предупреждение и не препятствует этой практике.Только при переопределении значения другого типа будет выдано сообщение об ошибке. Документация настоятельно не рекомендует переопределять постоянные значения.
julia> const a,b = 2,3
(2, 3)
julia> const a,b = 3,2
WARNING: redefining constant a
WARNING: redefining constant b
(3, 2)
julia> a,b
(3, 2)
julia> const a,b = 3.0,2
ERROR: invalid redefinition of constant a
скопировать код
тип
Целочисленные значения и значения с плавающей запятой не зависят от платформы и имеют явные диапазоны:
Type | Signed? | Number of bits | Smallest value | Largest value |
---|---|---|---|---|
Int8 |
✓ | 8 | -2^7 | 2^7 - 1 |
UInt8 |
8 | 0 | 2^8 - 1 | |
Int16 |
✓ | 16 | -2^15 | 2^15 - 1 |
UInt16 |
16 | 0 | 2^16 - 1 | |
Int32 |
✓ | 32 | -2^31 | 2^31 - 1 |
UInt32 |
32 | 0 | 2^32 - 1 | |
Int64 |
✓ | 64 | -2^63 | 2^63 - 1 |
UInt64 |
64 | 0 | 2^64 - 1 | |
Int128 |
✓ | 128 | -2^127 | 2^127 - 1 |
UInt128 |
128 | 0 | 2^128 - 1 | |
Bool |
N/A | 8 |
false (0) |
true (1) |
Type | Precision | Number of bits |
---|---|---|
Float16 |
half | 16 |
Float32 |
single | 32 |
Float64 |
double | 64 |
Тип переменной может быть указан с помощьюtypeof()
Получить, размер можно использоватьsizeof()
Get, оба параметра могут быть значениями или типами данных.
julia> typeof([1,2,4])
Array{Int64,1}
julia> typeof(0xcafebabe)
UInt32
julia> λ = "special_variable_name"
"special_variable_name"
julia> typeof(λ)
String
julia> typeof(2e-2)
Float64
julia> typeof(Int)
DataType
julia> typeof(String)
DataType
julia> typeof(true)
Bool
скопировать код
julia> sizeof(2e-2)
8
julia> sizeof(Float16)
2
julia> sizeof(Int16(1024))
2
julia> sizeof("hello")
5
julia> sizeof([1,2,3])
24
скопировать код
операция
Julia в основном используется для численной оптимизации, научных вычислений и т. д., а выражения близки к математическим символам. В дополнение к ежедневным четырем арифметическим операциям, есть также квадратные операции2^10
, и некоторые причудливые операторы:
julia> √4
2.0
julia> √√16
2.0
julia> typeof(√) #看起来开根号是个sqrt的语法糖
typeof(sqrt)
julia> sqrt(4)
2.0
julia> 2(3+2)
10
julia> x=1
julia> x(x+1)#x放到前面会被解析为可调用对象导致出错
ERROR: MethodError: objects of type Int64 are not callable
julia> (x+1)x
2
скопировать код
Операторов много,официальная документацияЕсть краткое содержание, вот прямая копия и перевод:
арифметические операторы | название | описывать |
---|---|---|
+x |
unary plus | операция идентификации |
-x |
unary minus | найти противоположное |
x + y |
binary plus | добавление |
x - y |
binary minus | вычитание |
x * y |
times | умножение |
x / y |
divide | разделение |
x ÷ y |
integer divide | Целочисленное деление, результат сохраняет целое число |
x \ y |
inverse divide | Эквивалентноy / x
|
x ^ y |
power | квадратный |
x % y |
remainder | Излишек |
!x |
negation | !true==false и наоборот. только для бул |
побитовые операторы | Name |
---|---|
~x |
Нет |
x & y |
и |
x \| y |
или |
x ⊻ y |
Исключающее ИЛИ (⊻ этот символНапечатать не просто...) |
x >>> y |
логикапереместить вправо |
x >> y |
арифметикапереместить вправо |
x << y |
логический/арифметический сдвиг влево влево |
Операторы числового сравнения | Name |
---|---|
== |
равный |
!= , ≠
|
не равный |
< |
меньше, чем |
<= , ≤
|
меньше или равно |
> |
больше, чем |
>= , ≥
|
больше или равно |
Кроме того, у Джулии есть функция, которая может выполнять цепные сравнения.
julia> 1 < x < 6
true
скопировать код
не как большинство языковx>1 && x<6
Ручная логическая комбинация вот такая.
Ранее сообщалось, что Джулия надеется иметь такие же мощные возможности обработки и выражений линейной алгебры, как и Matlab.Конечно, операции линейной алгебры необходимы. можно использовать.Operator
выполнять векторные операции
julia> [1,2,3].^ 2
3-element Array{Int64,1}:
1
4
9
julia> [1,2,3].+ 2
3-element Array{Int64,1}:
3
4
5
julia> [1,2,3].÷ 2
3-element Array{Int64,1}:
0
1
1
скопировать код
Наконец, Джулия также поддерживает представление дробей и комплексных чисел, поэтому я не буду здесь вдаваться в подробности, если вам интересно, обратитесь кComplex and Rational Numbers
функции и методы
Джулия рассматривает функцию как объект, который связывает набор аргументов и возвращаемое значение. Первая форма — это полное определение функции:
function add(a,b)
x = a+b
#return x 如果没有return默认返回最后一个表达式求得的值
end
скопировать код
Второй — определение функции в виде присваивания
add2(a,b) = a+b
скопировать код
Функции считаются объектами первого класса в Julia и могут быть назначены переменным, использованы в качестве параметров и возвращены.
julia> apply = function(func,arg)
func(arg)
end
#269 (generic function with 1 method)
julia> apply(!,false)
true
скопировать код
В приведенном выше примере определяется анонимная функция, т. е. лямбда, а затем функция!
Передано как параметр. лямбда в порядкеarg -> expr_body
Определять:
julia> lambda = val ->( "$val" * "$val","$val","...")
#317 (generic function with 1 method)
julia> lambda("wow")
("wowwow", "wow", "...")
скопировать код
Обратите внимание на тело лямбда-функции.()
Представляет кортеж, который позволяет функции возвращать несколько значений.
Julia поддерживает указание типов параметров, значений по умолчанию и параметров ключевых слов.
julia> misc = function(a::Int,b::Int=2;flag=true)
a+1,b+2,!flag
end
#341 (generic function with 2 methods)
julia> misc(1,2,flag=false)
(2, 4, true)
скопировать код
Подзаголовок — функции и методы, а как насчет методов? На самом деле, во многих других языках методы — это другое название функций в объектно-ориентированной области. Здесь Юлия дает другое определение:
It is common for the same conceptual function or operation to be implemented quite differently for different types of arguments: adding two integers is very different from adding two floating-point numbers, both of which are distinct from adding an integer to a floating-point number. Despite their implementation differences, these operations all fall under the general concept of "addition". Accordingly, in Julia, these behaviors all belong to a single object: the + function. To facilitate using many different implementations of the same concept smoothly, functions need not be defined all at once, but can rather be defined piecewise by providing specific behaviors for certain combinations of argument types and counts. A definition of one possible behavior for a function is called a method.
Методы — это более конкретные представления функций. Если вы изучили C++, то его можно сравнивать полностью, функции — это шаблонные функции, а методы — специализированные шаблоны функций.
поток управления
Поток управления Джулии в основном похож на другие языки высокого уровня, так что вот пример.
- составное выражение
julia> z = begin
a=1
b=2
(a+b,a/b)
end
julia> z
(3, 0.5)
скопировать код
- условная операция
#julia也提供 ?: 三元运算符
if flag && a<b
println("a <b")
elseif flag && a==b
println("a==b")
elseif flag && a<b
println("a>b")
end
скопировать код
- пока цикл
julia> let i=0,res=0
while i<=100
res +=i
i+=1
end
println(res)
end
5050
скопировать код
- для цикла
julia> for i=1:10
print(i," ")
end
1 2 3 4 5 6 7 8 9 10
julia> for name in ["Alice","Andrew","Jane"]
print(name*" ")
end
Alice Andrew Jane
julia> while true
println(i)
global i+=1
if i<5
continue
else
break
end
end
5
скопировать код
- Обработка исключений
julia> throw("exception")
ERROR: "exception"
Stacktrace:
[1] top-level scope at none:0
...
julia> try
sqrt(-1)
catch y
println(y)
end
DomainError(-1.0, "sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).")
скопировать код
Возможно, позже я напишу еще одну статью о Задаче Джулии.
сфера
Модули являются неотъемлемой частью современной разработки программного обеспечения, и Юлия обеспечивает их поддержку. использоватьmodule end
создать модуль,import
Импортировать:
julia> module warehouse
x = 1
y = (arg,val) -> arg(arg(val))
end
WARNING: replacing module warehouse.
Main.warehouse
julia> import .warehouse
julia> warehouse.y(+,2)
2
скопировать код
составной тип
использоватьstruct ... end
Вы можете создать составной тип, который представляет собой объектно-ориентированный подход, предложенный Джулией.
struct Novel
name::String
author::String
price::Float64
# 构造函数
Novel(name::String,author::String,price::Float64) = new(name,author,price)
end
function stringify(val::Novel)
print("Novel{",val.name,",",val.author,",",val.price,"}")
end
ff = Novel("Gobacktoearth","yy",56.4)
stringify(ff)
Novel{Gobacktoearth,yy,56.4}
скопировать код
Мой блог будет перемещен и синхронизирован с Tencent Cloud + Community, и всем предлагается присоединиться: https://cloud.tencent.com/developer/support-plan?invite_code=wsp9wvpm612x
автор:racaljk
Любая форма перепечатки приветствуется, но обязательно с указанием источника.
Ограничено моим уровнем, если в статье и коде есть неуместные выражения, пожалуйста, не стесняйтесь, дайте мне знать.