Julia机器学习核心编程:人人可用的高性能科学计算
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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类型的值。