Julia 基本语法全解析(中文版)
目标:从零基础到能写出清晰、高效的 Julia 代码
涵盖变量、数据类型、运算、控制流、函数、容器、宏等核心语法
1. 变量与命名规则
x = 10
name = "Julia"
π = 3.14159
命名规范
| 规则 | 示例 |
|---|---|
| 变量名:小写 + 下划线 | user_count, max_value |
| 常量:全大写 | PI = 3.14, MAX_RETRIES = 5 |
| 类型:大驼峰 | MyType, Point2D |
| 函数:小写 | calculate_sum() |
| 支持 Unicode | α = 0.05, ∑ = sum |
提示:用
Tab补全希腊字母,如\alpha+ Tab →α
2. 基本数据类型
| 类型 | 示例 | 说明 |
|---|---|---|
Int64 | 42 | 整数(默认 64 位) |
Float64 | 3.14 | 浮点数(默认) |
Bool | true, false | 布尔值 |
Char | 'A', '中' | 字符(单引号) |
String | "Hello" | 字符串(双引号) |
Nothing | nothing | 空值 |
Missing | missing | 缺失值 |
typeof(42) # Int64
typeof(3.14) # Float64
typeof("hi") # String
3. 基本运算符
| 运算 | 符号 | 示例 | 结果 |
|---|---|---|---|
| 加减 | +, - | 5 + 3 | 8 |
| 乘除 | *, / | 10 / 3 | 3.333... |
| 整除 | ÷ 或 \div+Tab | 10 ÷ 3 | 3 |
| 取余 | % | 10 % 3 | 1 |
| 幂 | ^ | 2^10 | 1024 |
| 比较 | ==, !=, <, >, <=, >= | 5 == 5.0 | true |
| 逻辑 | &&, ||, ! | true && false | false |
注意:
=是赋值,==是相等判断
4. 字符串操作
# 字符串插值
name = "Alice"
"Hello, $name!" # → "Hello, Alice!"
# 连接
"Hi " * "there" # → "Hi there"
# 多行字符串
poem = """
床前明月光,
疑是地上霜。
"""
# 常用函数
length("Julia") # 5
uppercase("hi") # "HI"
split("a,b,c", ",") # ["a", "b", "c"]
join(["a","b"], "-") # "a-b"
5. 控制流
5.1 if 语句
x = 10
if x > 0
println("正数")
elseif x < 0
println("负数")
else
println("零")
end
三元运算符(简洁版):
x > 0 ? "正" : "非正"
5.2 for 循环
# 遍历范围
for i in 1:5
println(i)
end
# 遍历数组
for fruit in ["苹果", "香蕉", "橙子"]
println(fruit)
end
# 使用 enumerate 获取索引
for (i, val) in enumerate([10, 20, 30])
println("$i: $val")
end
5.3 while 循环
n = 1
while n <= 5
println(n)
n += 1
end
5.4 循环控制
for i in 1:10
if i % 2 == 0
continue # 跳过本次
end
if i > 5
break # 跳出循环
end
println(i)
end
6. 容器类型
6.1 数组 Array(最常用)
# 一维数组
arr = [1, 2, 3, 4]
# 类型指定
ints = Int[1, 2, 3]
floats = Float64[1.0, 2.0]
# 索引从 1 开始!
arr[1] = 10
arr[end] # 最后一个元素
# 切片
arr[2:3] # [2, 3]
# 二维数组(矩阵)
matrix = [1 2 3; 4 5 6] # 2×3 矩阵
# 常用函数
push!(arr, 5) # 添加元素
pop!(arr) # 删除末尾
length(arr) # 长度
size(matrix) # (2, 3)
6.2 元组 Tuple(不可变)
t = (1, "hi", 3.14)
t[1] # 1
# t[1] = 2 # 错误!不可修改
6.3 字典 Dict
phonebook = Dict("Alice" => "123", "Bob" => "456")
phonebook["Alice"] # "123"
phonebook["Charlie"] = "789"
haskey(phonebook, "Bob") # true
keys(phonebook) # ["Alice", "Bob", "Charlie"]
values(phonebook) # ["123", "456", "789"]
6.4 集合 Set(无重复)
s = Set([1, 2, 2, 3]) # Set{Int64} with 3 elements: {1,2,3}
push!(s, 4)
union(s, [3, 4, 5]) # {1,2,3,4,5}
7. 函数定义
7.1 标准写法
function add(x, y)
return x + y
end
7.2 简洁写法(单表达式)
add(x, y) = x + y
square(x) = x^2
7.3 匿名函数
f = x -> x^2
map(x -> x^2, [1,2,3]) # [1, 4, 9]
7.4 多重派发(Julia 杀手锏)
greet(x::String) = println("Hello, $x!")
greet(x::Int) = println("Number: $x")
greet("Julia") # Hello, Julia!
greet(42) # Number: 42
7.5 可选参数与默认值
function power(x, n=2)
return x^n
end
power(3) # 9
power(3, 3) # 27
7.6 可变参数
function sum_all(nums...)
return sum(nums)
end
sum_all(1, 2, 3, 4) # 10
8. 常用内置函数
| 函数 | 用途 |
|---|---|
println(x) | 打印并换行 |
print(x) | 打印不换行 |
typeof(x) | 查看类型 |
length(arr) | 容器长度 |
size(arr) | 数组维度 |
rand(n) | 生成 n 个 [0,1) 随机数 |
zeros(3,3) | 3×3 零矩阵 |
ones(5) | 长度 5 的全 1 数组 |
collect(1:10) | 范围转数组 |
9. 宏(Macros)
以
@开头,编译期执行
@time sleep(1) # 计时
@show x # 显示变量名和值
@which sin(3.14) # 查看函数定义位置
@assert 1 + 1 == 2 # 断言
10. 综合示例:统计数组
function stats(arr)
if isempty(arr)
return nothing
end
mn = minimum(arr)
mx = maximum(arr)
avg = mean(arr)
std_dev = std(arr)
println("最小: $mn, 最大: $mx")
println("平均: $(round(avg, digits=2))")
println("标准差: $(round(std_dev, digits=2))")
return (min=mn, max=mx, mean=avg, std=std_dev)
end
data = [3, 1, 4, 1, 5, 9, 2, 6]
stats(data)
输出:
最小: 1, 最大: 9
平均: 3.88
标准差: 2.8
语法速查表
| 语法 | 示例 |
|---|---|
| 注释 | # 单行注释 |
| 多行注释 | #= ... =# |
| 数组 | [1, 2, 3] |
| 矩阵 | [1 2; 3 4] |
| 范围 | 1:10, 1:2:10 |
| 推导式 | [x^2 for x in 1:5] |
| 广播 | sin.(arr) |
| 管道 | arr |> sum |> sqrt |
小练习(立即上手)
- 写函数判断是否为素数
- 实现斐波那契数列(递归 + 迭代)
- 统计字符串中各字符出现次数(用
Dict) - 生成 100 个随机数,画直方图(需
Plots)
推荐学习路径
| 阶段 | 内容 |
|---|---|
| 1 天 | 变量、运算、控制流 |
| 2 天 | 数组、函数、多重派发 |
| 3 天 | 包管理、绘图、数据处理 |
| 1 周 | 写一个小项目(如 CSV 分析) |
恭喜!你已掌握 Julia 核心语法!
下一站:
需要我:
- 生成 可运行的练习答案?
- 写一个 完整小项目(如词频统计)?
- 讲解 广播
.和 管道|>深入用法?
随时提问!