Julia学习笔记(一):变量、数值与运算

交互式会话REPL

  • 一旦用户输入了一段完整的代码(表达式),然后按回车,交互式会话就会执行这段代码,并将结果显示出来。如果输入的代码以分号结尾,那么结果将不会显示出来。
  • 变量 a n s ans ans总会存储上一次执行代码的结果,需要注意的是,变量 a n s ans ans只在交互式会话中才有。

REPL模式:

  • ?进入help模式(查看帮助文档)或者用@doc <函数名>
  • ;进入shell模式(执行shell命令)
  • ]进入package模式(增删库)add/rm <库名>(或者using Pkg,然后Pkg.add)
  • b a c k s p a c e backspace backspace返回正常Julia格式

变量

  • 变量是与某个值相关联(或绑定)的名字。可以用它来保存一个值(例如某些计算得到的结果),供之后的代码使用。
  • 变量名是大小写敏感的,且不包含语义
  • Unicode数学符号可以用反斜杠+LaTeX再按tab打出

合法变量名

唯一明确禁止的变量名称是内置关键字的名称。

命名规范

  • 变量的名字采用小写。
  • 用下划线(_)分隔名字中的单词,但是不鼓励使用下划线, 除非在不使用下划线时名字会非常难读。
  • 类型(Type)和模块(Module)的名字使用大写字母开头,并且用大写字母 而不是用下划线分隔单词。
  • 函数(Function)和宏(Macro)的名字使用小写,不使用下划线。
  • 会对输入参数进行更改的函数要使用 ! 结尾。这些函数有时叫做 “mutating” 或 “in-place” 函数,因为它们在被调用后,不仅仅会返回一些值 还会更改输入参数的内容。

整数、浮点数

整数和浮点值是算术和计算的基础。这些数值的内置表示被称作原始数值类型(numeric primitive),且整数和浮点数在代码中作为立即数时称作数值字面量(numeric literal)。

整数类型

类型 带符号? 比特数 最小值 最大值
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)
  • 无符号整数会通过0x前缀以及十六进制数0-9a-f来输入和输出(输入也可以使用大写的A-F)。
  • 整型等原始数值类型的最小和最大可表示的值可用typemin和typemax函数得到。

浮点数

类型 精度 比特数
Float16 half 16
Float32 single 32
Float64 double 64

特殊浮点值

Float16 Float32 Float64 名称 描述
Inf16 Inf32 Inf 正无穷 一个大于所有有限浮点数的数
-Inf16 -Inf32 -Inf 负无穷 一个小于所有有限浮点数的数
NaN16 NaN32 NaN 不是数 一个不和任何浮点值(包括自己)相等的值

机器精度

  • Julia提供了eps函数,它可以给出1.0与下一个Julia能表示的浮点数之间的差值。参数可以是一个浮点数,也可以是一个类型。
  • Julia也提供了nextfloat和prevfloat两个函数分别返回基于参数的下一个更大或更小的可表示的浮点数。

Note.两个相邻可表示的浮点数之间的距离并不是常数,数值越小,间距越小,数值越大,间距越大。

舍入模式

Julia所使用的默认模式总是RoundNearest,指舍入到最接近的可表示的值,这个被舍入的值会使用尽量少的有效位数。

数值字面量系数

为了让常见的数值公式和表达式更清楚,Julia允许变量直接跟在一个数值字面量后,暗指乘法。另外,数值字面量也能作为被括号表达式的系数,括号表达式也可以被用作变量的系数。

julia> x = 3;
julia> 2x^2 - 3x + 1
10
julia> 2(x-1)^2 - 3(x-1) + 1
3

Note.

  • 用于隐式乘法的数值字面量系数的优先级高于其它的二元运算符,例如乘法(*)和除法(/、\以及//)。
  • 无论是把两个括号表达式并列,还是把变量放在括号表达式之前,都不会被用作暗指乘法,而是由于被解释为函数调用而报错。
julia> (x-1)(x+1)
ERROR: MethodError: objects of type Int64 are not callable

零和一字面量

函数 描述
zero(x) x类型或变量x类型的零字面量
one(x) x类型或变量x类型的一字面量

Note.在比较中可避免不必要的类型转换开销。

数学运算和初等函数

算术运算符

表达式 名称 操作
+x 一元加法运算符 全等操作
-x 一元减法运算符 取相反数
x+y 二元加法运算符 加法
x-y 二元减法运算符 减法
x*y 二元乘法运算符 乘法
x/y 二元除法运算符 除法
x÷y 整除 取x/y整数部分
x\y 反向除法 等价于y/x
x^y 幂操作符 x的y次幂
x%y 取余 等价于rem(x,y)

Bool类型:

表达式 名称 描述
!x 否定 互换true与false

位运算符

所有原始整数类型都支持以下位运算符:

表达式 名称
~x 按位取反
x&y 按位与
x|y 按位或
x$y 按位异或
x>>>y 向右逻辑移位(高位补0)
x>>y 向右算术移位(复制原高位)
x<<y 向左逻辑/算数移位

复合赋值操作符

每一个二元运算符和位运算符都可以给左操作数复合赋值:方法是把 = 直接放在二元运算符后面。

+= -= *= /= = ÷= %= ^= &= |= ⊻= >>>= >>= <<=

Note. 复合赋值后会把变量重新绑定到左操作数上,所以变量的类型可能会改变。

向量化dot运算符

每个二元运算符都有一个dot运算符与之对应,例如 ^ 就有对应的 .^ 存在。这个对应的.^被Julia自动地定义为逐元素地执行 ^ 运算。

Note 将点运算符用于数值字面量可能会导致歧义。例如,1.+x到底是表示1.+x还是1.+x?这会令人疑惑。因此不允许使用这种语法,遇到这种情况时,必须明确地用空格消除歧义。
数值比较

数值比较符

表达式 含义
== 等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
  • 整数是按位比较的,浮点数是按IEEE 754标准比较的
  • Inf等于它本身,且大于所有数,除了NaN
  • -Inf等于它本身,且小于所有数,除了NaN
  • NaN不等于、不大于、不小于任何数,包括它本身

测试函数

函数 测试是否满足如下性质
isequal(x,y) x与y是完全相同的
isfinite(x) x是有限大的数字
isinf(x) x是(正/负)无穷大
isnan(x) x是NaN

Note

  • isequal认为NaN之间是相等的
  • isequal也能用来区分带符号的零
  • 对于其它类型,isequal会默认调用==,所以如果你想给自己的类型定义相等,那么就只需要为 ==增加一个方法。如果你想定义一个你自己的相等函数,你可能需要定义一个对应的hash方法,用于确保isequal(x,y)隐含着hash(x)==hash(y)。

链式比较

Julia允许链式比较:

julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true

运算符的优先级与结合性

分类 运算符 结合性
语法 .followed by:: 左结合
幂运算 ^ 右结合
一元运算符 + - √ 右结合
移位运算 << >> >>> 左结合
除法 // 左结合
乘法 * / % & \ ÷ 左结合
加法 + - | $ 左结合
语法 : … 左结合
语法 |> 左结合
语法 <| 右结合
比较 > < >= <= == === != !== <: 无结合性
流程控制 && followed by || followed by ? 右结合
Pair 操作 => 右结合
赋值 = += -= *= /= //= = ^= ÷= %= = &= ⊻= <<= >>= >>>=

数值转换

Julia 支持三种数值转换,它们在处理不精确转换上有所不同。

  • T(x) 和 convert(T,x) 都会把 x 转换为 T类型。
    如果 T 是浮点类型,转换的结果就是最近的可表示值, 可能会是正负无穷大。
    如果 T 为整数类型,当 x 不能由 T 类型表示时,会抛出 InexactError。
  • x % T 将整数 x 转换为整型 T,与 x 模 2^n 的结果一致,其中 n 是 T 的位数。换句话说,在二进制表示下被截掉了一部分。
  • 舍入函数 接收一个 T 类型的可选参数。比如,round(Int,x) 是 Int(round(x)) 的简写版。

舍入函数

函数 描述 返回类型
round(x) x舍到最接近的整数 typeof(x)
round(T, x) x舍到最接近的整数 T
floor(x) x向-Inf 舍入 typeof(x)
floor(T, x) x向-Inf 舍入 T
ceil(x) x向+Inf方向取整 typeof(x)
ceil(T, x) x向+Inf方向取整 T
trunc(x) x向0取整 typeof(x)
trunc(T, x) x向0取整 T

除法函数

函数 描述
div(x,y), x÷y 截断除法;商向零近似
fld(x,y) 向下取整除法;商向-Inf近似
cld(x,y) 向上取整除法;商向+Inf近似
rem(x,y) 取余;满足 x == div(x,y)*y + rem(x,y);符号与 x 一致
mod(x,y) 取模;满足 x == fld(x,y)*y + mod(x,y);符号与 y 一致
mod1(x,y) 偏移 1 的 mod;若 y>0,则返回 r∈(0,y],若 y<0,则 r∈[y,0) 且满足 mod(r, y) == mod(x, y)
mod2pi(x) 以 2pi 为基取模;0 <= mod2pi(x) < 2pi
divrem(x,y) 返回 (div(x,y),rem(x,y))
fldmod(x,y) 返回 (fld(x,y),mod(x,y))
gcd(x,y…) x, y,… 的最大公约数
lcm(x,y…) x, y,… 的最小公倍数

符号和绝对值函数

函数 描述
abs(x) x的模
abs2(x) x 的模的平方
sign(x) 表示 x 的符号,返回 -1,0,或 +1
signbit(x) 表示符号位是true或false
copysign(x,y) 返回一个数,其值等于x的模,符号与 y 一致
flipsign(x,y) 返回一个数,其值等于x的模,符号与 x*y 一致

幂、对数与平方根

函数 描述
sqrt(x),√x x 的平方根
cbrt(x),∛x x 的立方根
hypot(x,y) 当直角边的长度为x和y时,直角三角形斜边的长度
exp(x) 自然指数函数在x处的值
expm1(x) 当x接近0时的exp(x)-1的精确值
ldexp(x,n) x*2^n的高效算法,n为整数
log(x) x的自然对数
log(b,x) 以b为底x的对数
log2(x) 以2为底x的对数
log10(x) 以10为底x的对数
log1p(x) 当 x接近 0 时的 log(1+x) 的精确值
exponent(x) x 的二进制指数
significand(x) 浮点数 x 的二进制有效数(也就是尾数)

三角和双曲函数

sin cos tan cot sec csc sinh cosh tanh coth sech csch asin acos atan acot asec acsc asinh acosh atanh acoth asech acsch sinc cosc

Note

  • 所有这些函数都是单参数函数,不过 atan 也可以接收两个参数 来表示传统的 atan2 函数。
  • 另外,sinpi(x) 和 cospi(x) 分别用来对 sin(pix) 和 cos(pix) 进行更精确的计算。
  • 要计算角度而非弧度的三角函数,以 d 做后缀。 比如,sind(x) 计算 x 的 sine 值,其中 x 是一个角度值。

复数和有理数

复数

全局常量 im 被绑定到复数 i,表示 -1的主平方根。

Note. 注意 3/4im == 3/(4im) == -(3/4im),因为系数比除法的优先级更高。

Julia 提供了一些操作复数的标准函数:

函数 含义
real() 实部
imag() 虚部
conj() 复共轭
abs() 绝对值
abs2() 平方后绝对值
angle() 以弧度为单位的相位角

Note

  • 从变量构建复数时,文本型数值系数记法不再适用。应改为使用更高效的 complex 函数直接通过实部与虚部构建一个复数值:
julia> a = 1; b = 2; complex(a, b)
1 + 2im
  • Inf 和 NaN 可能出现在复数的实部和虚部。
julia> 1 + Inf*im
1.0 + Inf*im

julia> 1 + NaN*im
1.0 + NaN*im

有理数

Julia 有一个用于表示整数精确比值的分数类型。分数通过 // 运算符构建:

julia> 2//3
2//3

如果一个分数的分子和分母含有公因子,它们会被约分到最简形式且分母非负。整数比值的这种标准化形式是唯一的,所以分数值的相等性可由校验分子与分母都相等来测试。分数值的标准化分子和分母可以使用numerator()和denominator()函数得到。

Julia接受构建无穷分数值,但不接受试图构建一个 NaN 分数值:

julia> 5//0
1//0
julia> 0//0
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]
上一篇:Python 打印给定目录的文件树


下一篇:【Redis】基本数据类型常用操作 - Zset (有序集合)