基础

基础 属于 Julia

2 个练习

关于 基础

Julia 是一门动态的强类型编程语言。它的编程风格以函数式为主,但比 Haskell 这类语言更灵活。

Julia 有一套强大而多用途的类型系统,这在后面的概念中会变得很重要。实际使用中,Julia 通常会根据上下文推断出合适的默认类型。

尽管 Julia 强调可读性,让它看起来像 Python 和 Ruby 那样的脚本语言,但 Julia 代码在运行之前会先经过编译。即时(JIT)编译器会在遇到每个函数时为其生成高度优化的代码,因此运行速度很快。

Julia 不是面向对象的语言,也没有许多其他语言里那种核心的类层次结构。

相反*(读到这里请别慌!)*,Julia 依赖的是:

  • 一套类型层次结构。
  • 可组合的函数(设计上便于组合,用法灵活而强大)。
  • 多重分派,意思是函数的调用可以使用数量和类型都可变的实参。

随着我们在教学大纲中不断深入,这些有点让人困惑的术语会逐渐清晰起来。

官方文档里有大量关于当前版本的有用信息,不过对初学者来说可能有点过于庞杂。

视频包括:

注释

在代码里加注释非常重要,它能帮助人类读懂你的代码、理解你的意图:可能是别人,也可能是未来的你自己。编译器(大多情况下)会忽略它们。

Julia 中有两种写法:

  • 单行注释以#开头
  • 多行注释以#=开头,以=#结尾。允许嵌套。
# This is a single-line comment

x = 3  # This is an inline comment

#=
	Multi-line comments can be used for longer explanations.

	They are especially useful to comment out blocks of code during debugging.
=#

变量与赋值

要创建一个变量,只需给它赋一个值:

julia> myvar = 42  # an integer (in fact, Int64)
42

julia> bigint = 1_234_567_890  # optionally use underscore as digit separator, for readability
1234567890

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

赋值会把一个值“绑定”到变量上。

指定类型是可选的,大多数情况下 Julia 会根据上下文推断出合适的默认类型。

类型是 Julia 中的一个重要主题。我们会在后面的概念中进一步探讨。现在最好先不用操心它们。

与许多函数式语言不同,Julia 中的变量可以重新赋值,你可以随意改变绑定到该变量上的值和类型:

julia> myvar = 3
3

julia> myvar = "now a string"
"now a string"

常量

在任何函数之外创建的全局变量:

  • 是允许的。
  • 有时是必要的。
  • 通常不推荐(不过这只针对*.jl文件;REPL 的行为不同)。

如果某个值需要在整个程序中都能访问,但又不应该改变,那就改用常量。

在赋值前加上const关键字,可以让编译器生成更高效的代码。

不小心试图修改const的值会给出警告:

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

算术运算符

算术运算大体上遵循常规写法:

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division)
8 % 3  # 2 (remainder)
2 ^ 3  # 8 (exponentiation)

注意,用/做除法得到的总是浮点数。

我们会在后面的概念中再回到这一点,那里会讨论如何用div()或÷做整除来截断,以及如何用//得到有理数。

函数

为了获得最佳的运行性能,最好把大部分代码放在函数里。与其他一些语言不同,在 Julia 中定义大量的小函数完全没有问题。

在 Julia 中定义具名函数有两种常见方式:

  1. 使用function关键字

    function muladd(x, y, z)
        x * y + z
    end
    

    为了可读性,按惯例缩进 4 个空格,但编译器会忽略缩进。end关键字必不可少:这一点更像 Ruby,而不是 Python。

    注意,我们本来也可以写成return x * y + z。不过,Julia 函数总是返回最后一个求值的表达式,所以return关键字是可选的。许多程序员更喜欢写上它,让自己的意图更明确。

  2. 使用“赋值形式”

    muladd(x, y, z) = x * y + z
    

    这最常用于单行函数定义或数学函数,也就是函数体只有一个表达式的情况。在赋值形式中绝不使用return关键字。

这两种形式是等价的,用法完全相同,选可读性更好的那种就行。

调用函数时,写出函数名,并为函数的每个形参传入实参:

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

既然我们把这类函数叫作“具名”函数,你也许能猜到还有“匿名”函数。这会在后面的概念中介绍。

命名约定

和许多语言一样,Julia 要求名称(变量、函数以及许多其他东西的名称)以字母开头,后面可以是字母、数字和下划线的任意组合。

按照惯例,变量、常量和函数的名称使用小写,并且尽量避免下划线,除非需要用下划线来避免混淆。

不过,Julia 全程使用 Unicode,所以对“字母”的解释相当灵活。

除英语之外的其他语言也支持,emoji 也一样*(不过请注意品味,挑个合适的)*。

尤其是数学家钟爱的所有希腊字母都可以使用*(而且有几个常用的值已经预定义好了)*:

julia> π   # a built-in constant
π = 3.1415926535897...

能识别 Julia 的编辑器,包括 REPL、Pluto.jl 以及装了 Julia 插件的 VS Code,都能轻松输入这些字符。

要输入 π,先输入\pi再按<Tab>。你输入的内容会被替换成这个希腊字母。

在后面的概念中,你会看到更多这样的例子。

事实上,反斜杠缩写并不是 Julia 特有的。它们来自 LaTeX,这是一个排版系统,许多科学家和工程师几乎每天都在用它写报告。

通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 基础