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)。

继承关系

supertype() 查看某类型的父类型
subtypes() 查看某类型的子类型
typeof() 查看某变量的类型

Any是Julia所有类的父类,相当于java的Object类。
                   ┌> Bool
Any ->Number ┬>Real -----┬>Integer —┼> Signed --> Int8 ~ Int128、BigInt
        └>Complex├>Rational  └> Unsigned --> UInt8 ~ UInt128
            └>AbstractFloat --> Float16 ~ Float64、BigFloat

整数类型

类型带符号?比特数最小值最大值
Int88-2^72^7-1
UInt8802^8-1
Int1616-2^152^15-1
UInt161602^16-1
Int3232-2^312^31-1
UInt323202^32-1
Int6464-2^632^63-1
UInt646402^64-1
Int128128-2^1272^127-1
UInt12812802^128-1
BoolN/A8false(0)true(1)
  • 无符号整数会通过0x前缀以及十六进制数0-9a-f来输入和输出(输入也可以使用大写的A-F)。
  • 整型等原始数值类型的最小和最大可表示的值可用typemin和typemax函数得到。

浮点数

类型精度比特数
Float16half16
Float32single32
Float64double64

特殊浮点值

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

机器精度

  • 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),√xx 的平方根
cbrt(x),∛xx 的立方根
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:
[...]

字符串

单引号表示字符,双引号表示字符串,中括号表示字符串索引。
第一个元素的索引由 firstindex(str) 返回,最后一个由 lastindex(str) 返回。关键字 begin 和 end 可以在索引操作中使用,它们分别表示给定维度上的第一个和最后一个索引。字符串索引就像 Julia 中的大多数索引一样,是从 1 开始的:对于任何 AbstractString firstindex 总是返回 1。

切片:str[a:b] / SubString(str, a, b) : a ~ b-1
长度:length(str)

字符串拼接

string(str1, str2, …) / *

julia> x = "Hello"
julia> y = "World"
julia> string(x, ' ', y, '!')
Hello World!
julia> x * ' ' * y * '!'
Hello World!

插值

$:取出变量的值

字符串函数

标识符功能用法
^ / repeat字符串重复“abc” ^ 3 / repeat(“abc”, 3) --> “abcabcabc”
uppercase/lowercase大小写uppercase(str)
replace替换replace(str, oldsubstr=>newsubstr)
starswith判断起始(空白字符敏感)starswith(str, substr)
strip去掉两端空白字符strip(str)
split分隔字符串split(str, char=’ ')
join拼接字符串join(str, char=’ ')
findfirst查找子串findfirst(substr, str)
findnext从某位置后开始查找子串findnext(substr, str, pos)
occursin查找是否含有该子串occursin(substr, str)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值