2.2 Julia中的变量
与其他编程语言一样,Julia也使用变量来存储从计算或外部源获得的值。
打开REPL(在Windows操作系统下打开安装好的Julia程序)。
【范例2-5】为变量赋值
01 $ julia 02 julia> x = 100 #将100赋值给变量x 03 100 04 julia> x*5 #将变量中的值乘以5 05 500
代码02行将100赋值给了x,代码03行立即给出了输出结果;代码04行输入了一个表达式x*5,代码05行得到了一个结果:500。
与其他编程语言一样,Julia可以更改存储在变量中的值或改变其状态。
【范例2-6】变量操作
下面的代码创建了两个变量。
01 julia> x = 24 #为x指定不同的值,会覆盖之前的值 02 24 03 julia> y = 10 #创建另一个变量y 04 10
代码01、03行定义了x和y,并分别赋值24和10,接下来对它们进行交换操作。
01 julia> x,y = y,x (10,24) #x和y互换 02 julia> x 03 10 04 julia> y 05 24
代码01行定义的内容将x和y的值互换,代码02、04行分别对它们进行输出验证,输出结果为10和24。
变量名称可以以字符“_”(下画线)开头。除此之外,Julia还允许使用Unicode字符(UTF-8)作为变量名称,但并非所有的Unicode字符都能使用。
【范例2-7】Julia的特殊变量名
01 julia> _ab = 40 02 40 03 julia> @ab = 10 04 ERROR: syntax: unexpected "=" #错误,意外的"=" 05 julia> 1000 06 1000
代码01行定义了_ab变量,这个名称可以使用。代码03行定义了@ab,04行报错,虽然提示的是“=”错误,但可以推测出其实是变量名称错误。代码05行直接输入了值1000,06行得到了一个输出结果。请注意,“!”(感叹号)不应该在变量名称中使用,因为以感叹号结尾的函数用于修改其参数。
我们可以使用UTF-8中任何大于00A0的符号集(尽管还有很多符号不能使用)。
01 julia> क = 101 #此处使用印地语作为变量 02 101
Julia提供了一些内置的常量和函数,我们可以为其赋值,但不建议这样做,因为可能会造成混淆。
01 julia> for = 100 02 ERROR: syntax: unexpected "=" 03 julia> if = 1000 04 ERROR: syntax: unexpected "=" 05 #错误,意外的"="
代码01行的for和04行的if是Julia中的保留字,所以它们不能作为变量名称。
2.2.1 命名约定
虽然Julia在命名上没有什么限制,几乎所有的组合都是被允许的,但还是有必要遵循一些命名规则。
• 变量名称为小写形式。
• 下画线用于分隔变量名称中的不同单词,但不建议使用带下画线的名称。
• 函数和宏名称小写,不使用下画线。
• 类型和模块的名称的第一个字符大写,最好使用驼峰命名法。
• 修改或写入任何参数的函数以“!”符号结尾。
Julia是一种强类型语言,因此有必要对变量的类型进行定义。如果没有明确定义变量的类型,那么Julia将尝试通过分配给变量的值来进行推断。当然,我们也可以使用Julia提供的typeof()函数来计算出变量的类型。
【范例2-8】typeof()函数的使用
01 julia> typeof(_ab) 02 Int64 03 julia> langname = "Julia" 04 "Julia" 05 julia> typeof(langname) 06 String
代码01行将_ab作为参数传入typeof()中,它返回了Int64,也就是说,_ab的类型是Int64。这里的Int64和String指的是类型。Int有不同的大小,通常其默认值与操作系统的字长有关。
在Julia中,我们可以使用下画线来分隔数字。
【范例2-9】使用下画线分隔数字
01 julia> 1_0_0 02 100
这在很多情况下都有用。
2.2.2 整数、位、字节和布尔数据类型
在算术运算中可以使用整数、位、字节、布尔数据类型和浮点数,它们是Julia的基本组成部分。与其他编程语言一样,在Julia中数字是一种值的表现形式。
下面我们来了解Julia中原始的数值类型,如表2-1所示为整数类型表。
表2-1 整数类型表
UInt指的是无符号整数类型,其值从0开始。在表2-1中展示了特定类型的整数可以容纳的最小值和最大值。我们还可以使用typemin()和typemax()函数来计算整数类型的最小值和最大值。
【范例2-10】typemin()和typemax()函数的使用
01 julia> typemax(Int32) 02 2147483647 03 julia> typemin(Int32) 04 -2147483648
从表2-1中也可以看出,最小值是−231,最大值是231–1。调用这两个函数,将类型作为参数传入函数中,将会得到一个结果。例如,代码01行在typemax()中传入一个Int32类型,得到的结果为2147483647,这个数值就是Int32的最大值。代码03行同理。
1. 在REPL中使用整数
在REPL中可以使用整数。
【范例2-11】在REPL中使用整数
01 $ julia 02 julia> 24 03 24 04 julia> typeof(24) 05 Int64
这里使用的是Int64类型,因为是64位系统。在32位系统下,默认的整数类型是Int32。
同样,我们也可以检查正在使用的系统的位数是多少。
01 julia> Sys.WORD_SIZE 02 64
在处理无法用32位整数(Int32)表示的大数字的情况下,即使在32位计算机上,Julia也会创建64位整数(Int64),而不是32位。
01 julia> large_integer = 99999999999 02 julia> typeof(large_integer) 03 Int64
2. 数据溢出
在下面的范例中,定义了一个具有Int16类型的x变量的函数,并将它赋值为10000(我们将在后面的章节中详细介绍函数和类型)。
【范例2-12】数据溢出
01 julia> x = Int16(10000) 02 10000 03 julia> x*x 04 -7936
代码01行将x赋值为Int16类型的值,代码03行执行x*x时超过了Int16类型的范围,导致数据溢出。
01 #16位Int类型的最大值为32767 02 julia> x = typemax(Int16) 03 32767 04 #Julia将保持变量类型,即使超过最大值 05 julia> x + Int16(1) 06 -32768
代码01行将x赋值为Int16类型的最大值32767,并在代码05行将x增加1,这使得x超过了该类型的最大值,导致数据溢出。
3. 布尔数据类型
Bool是一种广泛使用的逻辑数据类型,它有真和假两种状态。
【范例2-13】布尔数据类型测试
下面的代码对布尔数据类型进行了一些测试。
01 julia> 1 > 2 02 false 03 julia> typeof(ans) 04 Bool
代码01行中的1>2显然不成立,所以返回了false。我们可以使用typeof()函数来计算ans的类型,结果是Bool。
与其他编程语言不同,在Julia中不会将0、NULL或空字符串视为false。比如下面的代码:
01 julia> if 0 02 println("hello") 03 end
代码01行中的if 0将报错,错误信息如下:
01 TypeError:上下文中使用非布尔值(Int64) 02 Stacktrace:[1] include_string(:: String,:: String) 03 at ./loading.jl:515
意思就是代码01行中的0不是布尔值,而是Int64类型的值。