Julia 基础
Julia 基础
介绍
- 科学计算编程语言
- 非常灵活
默认环境:~/.julia/environments/v1.9/
===
:完全相等性比较,还需要具有相同的内存地址
ByRow(f)
:以 f 函数进行变换
1 | # 创建未初始化的 Matrix |
1 | typeof() |
参考资料
教程:Julia语言入门
Julia 与其他语言的差异:与其他语言的显著差异 · Julia中文文档
GitHub - m3g/JuliaNotes.jl: A collection of examples and explanations about Julia
Julia 微积分笔记:Calculus with Julia
[GitHub - RoyiAvital/Julia100Exercises: A set of introductory exercises for Julia. Based on \ 100 NumPy Exercises](https://github.com/rougier/numpy-100).
安装
- 二进制版本下载:
1 | brew install Julia # macOS |
官方包注册表:GitHub - JuliaRegistries/General: The official registry of general Julia packages
Julia 包镜像:交大镜像
1 | # 设置环境变量 |
使用
工具
代码格式化:JuliaFormatter
Julia VSCode 插件:需设置 Julia 二进制文件路径,才能使用查看 API、在 REPL 中执行代码等功能
- 激活 Julia 环境:输入 “Julia: Activate This Environment”
- 更换 Julia 环境:输入 “Julia: Change Current Environment”
- 在 VSCode 中的 Jupyter Notebook 中运行 Julia 代码(只能是默认的 Julia 环境)
- 如何在 Jupyter Notebook 中的使用其他的 Julia 环境
- VSCode Julia 插件经常 crash
1 | { |
- IJulia:Julia 的 Jupyter Notebook
1 | using IJulia |
1 | # 连接 Jupyter 需输入 token,查看 token |
REPL
- REPL:交互式会话(read-eval-print loop)
- 按
Tab
键可以自动补全 - Julia 的 REPL 有四种 mode
- 退出 Juila mode:
Ctrl + D
键或输入exit()
- 退出 Help、Shell、Search 到 Julia mode:
Backspace
或Crtl + C
键
1 | # 四种 mode 的 prompt |
运行
1 | julia script.jl # 基本 |
使用环境
进入 pkg,执行
activate .
,激活该目录使其成为 “活动项目”;添加 package(会生成Project.toml
项目文件及Manifest.toml
清单文件)使用他人的项目
- 注:若项目包含 manifest,则以该 manifest 给出的相同状态安装包;否则,将解析与项目兼容的最新版本的依赖项
1 | # 克隆 |
包管理
参考:
键入
]
进入 pkg(交互式包管理模式;BACKSPACE
或Crtl + C
键退出)
1 | # 安装 package |
创建包
1 | (@v1.9) pkg> generate HelloWorld |
目录结构
1 | . |
注册包
注册包,类似 Python 的 package 打包发布到 PyPI
注册表
- 默认自动安装 General 注册表
1 | # 进入 pkg |
语法
注释
1 | # 单行注释 |
输出
println
会自动添加换行符,print
不会
1 | println() |
变量
Unicode 字符可以作为变量名(不建议)
1 | ❄ = -12 |
1 | # 环境变量 |
复合表达式
begin ... end
(..., ..., ...)
...;...
数据类型
字符串
字符串属于不可修改类型 (immutable), 即不能直接修改字符串的内容, 但可以给保存了字符串的变量赋值为一个新的字符串。
字符串连接 - *
字符串重复 - ^
字符串插值 - $var
,$(expression)
Julia 可识别 Unicode math(输入 LaTeX 符号,按 Tab 键,可补全成 Unicode symbols,部分可用作运算符)
- π
\pi
+TAB - ÷
\div
+TAB - ≥
\ge
+TAB - ≤
\le
+TAB - ≠
\ne
+TAB - ∈
\in
+TAB - ⊂
\subset
+TAB - ⊃
\supset
+TAB - 🐢–
\:turtle:
+TAB - √
\sqrt
+TAB
字符串处理相关函数
1 | parse() |
Symbol
符号是一种特殊的数据类型,用于表示固定且不可变的标识符。它们在代码中以冒号 :
开头
1 | elements = [:Si,] |
函数
1 | f(x) = x^2 + 3*x + 1 |
1 | function func(x, y, z) |
1 | # mysd: Input numeric vector x, output its sample standard deviation. |
- 添加!,含义是什么
用于表示该函数会对其参数进行原地修改(in-place modification)。换句话说,带有 !
的函数会改变至少一个传入参数的内容或状态,而不是创建一个新的副本并返回。
;
前是位置参数,后是关键字参数
可变参数:参数名添加 ...
1 | # 位置参数的示例 |
if-elseif-else-end 结构
1 | age = 35 |
循环
1 | for loopvar = a:b |
1 | # 方式1 |
枚举
1 | arr=collect(1:5) |
嵌套循环
1 | # 9x9乘法表 |
数据结构
missing 对象表示缺失值, 缺失值不区分具体类型, 属于 Missing 数据类型
数组
索引起始为 1,与 Fortran 相同,与 Python、C++ 不同;end 表示最后一个元素的位置
1 | v1 = [2, 3, 5, 7, 11, 13, 17] |
数组的类型标注为 Array{Type, N}
,其中 Type
是元素类型,N
是数组的维度。例如,Array{Int, 1}
表示一个整数类型的一维数组。
@show expr
可以用比较简洁的带有提示的方式
范围:范围不是向量, 而是一种 “可遍历数据结构 “。 用 collect()
函数可以将范围转换成向量
1 | 1:5 |
1 | v1 = [2, 3, 5, 7, 11, 13, 17] |
数组类型:Array{Int64}
、Array{Float64}
、Array{String}
、Array{Any}
(可容纳任何 Julia 对象作为元素)等;eltype()
查看类型
相关函数
1 | # v为向量,x为元素,u为向量 |
Julia 中的函数, 包括自定义函数, 如果可以对单个标量执行, 将函数名加后缀句点后, 就可以变成向量化版本, 对向量和矩阵执行。 这称为广播。 运算也是如此,运算符前面加点后就可以将标量运算应用到元素之间的运算。
1 | sqrt.([1,2,3]) |
列表推导
1 | xcube = [i^3 for i=1:3] |
元组
同 python
命名元组
1 | data_keys = (energy_key = "energy", force_key = "forces") |
字典
- Python 中的
:
变成=>
;元素访问相同 keys()
- 遍历字典键;values()
- 遍历字典值
1 | d = Dict("name" => "Li Ming", "age" => 18) |
字典推导
1 | Dict(x => x * x for x in [2, 3, 5, 7]) |
集合
同 python
模块
using ModuleName
使得模块中的所有导出(exported)函数直接可用,不允许重定义或扩展原有函数
import
不行(和 Python 一样)
1 | using JuLIP |
using
和 import
的区别
1 | using ModuleName |
宏
宏:在程序中自动生成代码(表达式)
1 | # assert (单元测试) |
宏定义
1 | macro sayhello() |
标准库
Base
1 | Dates # DateTime, Date |
并行计算
1 | using Distributed |