Юлия Опыт Основы языка

Язык программирования Julia

содержание

  О Юлии
Переменные и строки
постоянный
тип
операция
функции и методы
поток управления
сфера
составной тип

Я слышал о Джулии и раньше, но в то время официальный сайт еще время от времени не работал.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++, то его можно сравнивать полностью, функции — это шаблонные функции, а методы — специализированные шаблоны функций.

поток управления

Поток управления Джулии в основном похож на другие языки высокого уровня, так что вот пример.

  1. составное выражение
julia> z = begin
    a=1
    b=2
    (a+b,a/b)
end
julia> z
(3, 0.5)скопировать код
  1. условная операция
#julia也提供  ?:  三元运算符
if flag && a<b
    println("a <b")
elseif flag && a==b
    println("a==b")
elseif flag && a<b
    println("a>b")
endскопировать код
  1. пока цикл
julia> let i=0,res=0
           while i<=100
               res +=i
               i+=1
           end
           println(res)
       end
5050скопировать код
  1. для цикла
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скопировать код
  1. Обработка исключений
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
Любая форма перепечатки приветствуется, но обязательно с указанием источника.
Ограничено моим уровнем, если в статье и коде есть неуместные выражения, пожалуйста, не стесняйтесь, дайте мне знать.