1.2 Julia基本语法


1.2 Julia 基本语法

Julia 语法核心一句话:赋值即声明、索引从 1 开始、块结构用 end 收尾、函数返回最后一个表达式。从 Python 或 MATLAB 迁移,90% 的语法可以直接猜中,剩下 10% 是本节要练的。

逐个敲:变量与类型

REPL 里逐行输入,观察输出:

x = 10 # Int64 y = 3.14 # Float64 α = 42 # 希腊字母可以做变量名,数学味十足 s = "半径是 $x" # 字符串插值用 $ typeof(x), typeof(y)

注意 Julia 不需要声明类型,但它是有类型的语言——每个值都有确定的类型,typeof 随时可查。整数会自动选择宽度,超过 typemax(Int64) 就升级成 BigInt

typeof(100) # Int64 typeof(10000000000000000000) # BigInt,自动升级 1 / 2 # 0.5,除法默认返回浮点 1 ÷ 2 # 0,整除用 ÷(REPL 里输入 \div 再按 Tab) 2^10 # 幂运算

💡 关键直觉:REPL 支持 LaTeX 式输入——\alpha 按 Tab 变 α,\pi 变 π,\div 变 ÷。写公式代码时这是杀手级体验。

数组:和 MATLAB 像,和 Python 不像

v = [1, 2, 3] # 一维向量 M = [1 2 3; 4 5 6] # 空格分列、分号分行,MATLAB 风格 M[1, 2] # 2 —— 索引从 1 开始 M[2, :] # 第二行全部 v .* 10 # 广播:逐元素乘,点号是关键

语法迁移速查图

语法迁移速查图

控制流:写三个小函数练手

条件、循环、异常各写一个,直接可以运行:

# 条件:给成绩分级 function grade(score) if score >= 90 "A" elseif score >= 60 "B" else "C" end end # 循环:1 到 n 的平方和 function sum_of_squares(n) total = 0 for i in 1:n total += i^2 end total end # 异常:安全除法 function safe_divide(a, b) try a / b catch e println("出错了:$e") nothing end end

注意 grade 没写 return——最后一个表达式就是返回值,这是 Julia 的惯例。三元表达式 x > 0 ? "正" : "非正" 也常用。

元组、字典、集合一分钟

t = (x = 1, y = 2) # 具名元组 t.x # 1 d = Dict("a" => 1, "b" => 2) d["a"] # 1 haskey(d, "c") # false s = Set([1, 2, 2, 3]) # {1, 2, 3} 自动去重 union(s, Set([3, 4])) # 并集

⚠️ 常见坑:Julia 的字典和集合是无序的,别依赖遍历顺序;另外 M[1:2, :] 切片会复制数据,大矩阵上频繁切片是性能杀手,第 5 章会讲视图 @view

新手报错现场:三连排查

初学阶段最容易撞上的异常,我把报错原文和原因对上号。第一类是 MethodError: no method matching +(Int64, String)——你把数字和字符串相加了。Julia 不会像 JavaScript 那样偷偷转型,也不会像 Python 那样直接拼起来,它坚持类型必须匹配。解决办法要么显式转换 string(x) * s,要么用插值 "x is $x"。第二类是 BoundsError: attempt to access ... at index [0]——十有八九是 Python 习惯带过来的 0 索引。第三类最隐蔽:

f(x) = 2x + 1 map(f, [1, 2, 3]) # [3, 5, 7],没问题 map(f, [1.0, "a"]) # MethodError:f 对 String 没有定义

同一个函数名对不同类型是否可用,取决于有没有对应方法——这里只是提前踩到多重派发的门槛,第 2 章会正面讲。现在先记住:看到 MethodError,第一反应是"参数类型是什么、有没有匹配的方法",而不是"代码逻辑错了吗"。

字符串处理的进阶细节

字符串这一块有几个点值得一口气练完。Julia 的字符串不可变、用双引号,单引号是"字符"类型——'a'"a" 是两个不同的类型:

typeof('a') # Char typeof("a") # String s = "Julia 1.10" length(s) # 9,字符数 lastindex(s) # 9,最后一个字符的字节索引 s[1:5] # "Julia" occursin("1.10", s) # true,子串判断 replace(s, "1.10" => "1.11") # 字符串替换 split("a,b,c", ',') # 三个子串的数组 uppercase("abc") # "ABC"

这里埋着一个中文相关的坑:Julia 字符串按 UTF-8 编码,s[i] 按字节索引访问,一个中文字占三个字节,所以 "你好"[2] 会报错而不是给你"好"。要按字符遍历,用 for c in s 或者 first(collect(s))。写处理中文文本的程序时,这条能省你一个下午。

练手小项目:猜数游戏

把本节所有语法串成一个能玩的小程序,三十行以内:

function guess_number() target = rand(1:100) println("我想好了一个 1 到 100 之间的数") while true print("你猜:") input = readline() n = try parse(Int, input) catch println("请输入整数"); continue end if n < target println("小了") elseif n > target println("大了") else println("猜中了!答案是 $n") break end end end

这个例子覆盖了变量、循环、条件、异常、字符串插值、函数定义六件事。把它敲进一个 .jl 文件,用 include("文件名.jl") 加载后调用 guess_number() 跑起来。写完这个,你已经能读懂 Julia 生态里大部分示例代码了。

本节要点回顾

  • 赋值即创建,类型自动推断,typeof 随时可查。
  • 索引从 1 开始end 表示末尾,与 MATLAB 一致。
  • 点号广播 sin.(a) 取代 Python 的列表推导或向量化库。
  • 块用 end 收尾,缩进只是美观不是语法。
  • 函数默认返回最后一个表达式return 可省。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U