Think Julia : 变量,表达式和陈述(第二节)

编程语言最强大的功能之一是操纵变量的能力。变量是引用值的名称。

赋值语句

一个赋值语句创建一个新的变量,并给它一个值:

julia> message = "And now for something completely different"
"And now for something completely different"
julia> n = 17
17
julia> π = 3.141592653589793
3.141592653589793

此示例进行三项分配。第一个将字符串赋给一个名为的新变量message; 第二给出整数17到n; 第三个指定π的(近似)值π\pi TAB

在纸上表示变量的常用方法是使用指向其值的箭头来编写名称。这种图被称为状态图,因为它显示了每个变量所处的状态(将其视为变量的心态)。状态图显示了上一个示例的结果。
这里写图片描述

变量名称

程序员通常为其有意义的变量选择名称 - 它们记录变量的用途。

变量名称可以随意使用。它们几乎可以包含所有Unicode字符,但它们不能以数字开头。使用大写字母是合法的,但通常只使用小写字母表示变量名称。

可以通过Julia REPL中类似LaTeX的缩写的制表符输入来输入Unicode字符。

下划线字符_可以出现在名称中。它通常用于具有多个单词的名称中,例如your_name或airspeed_of_unladen_swallow。

如果给变量一个非法名称,则会出现语法错误:

julia> 76trombones = "big parade"
ERROR: syntax: "76" is not a valid function argument name
julia> more@ = 1000000
ERROR: syntax: extra token "@" after end of expression
julia> struct = "Advanced Theoretical Zymurgy"
ERROR: syntax: unexpected "="

76trombones是非法的,因为它以数字开头。more@是非法的,因为它包含非法字符,@。但是怎么了struct?

事实证明这struct是朱莉娅的关键词之一。REPL使用关键字来识别程序的结构,并且它们不能用作变量名。

Julia有这些关键字:

abstract type   baremodule   begin      break            catch
const           continue     do         else             elseif
end             export       finally    for              function
global          if           import     importall        let
local           macro        module     mutable struct   primitive type
quote           return       try        using            struct
while

您不必记住此列表。在大多数开发环境中,关键字以不同的颜色显示; 如果你尝试使用一个作为变量名,你就会知道。

表达式和语句

表达式是值、变量和运算符的组合。一个值本身就是一个表达式,一个变量也是一个表达式,所以下面这些都是合法的表达式:

julia> 42
42
julia> n
17
julia> n + 25
42

在提示符下键入表达式时,REPL会对其进行求值,这意味着它会找到表达式的值。在此示例中,n值为17并且n + 25值为42。

语句是具有效果的代码单元,如创建变量或显示值。

julia> n = 17
17
julia> println(n)
17

第一行是赋值的赋值语句n。第二行是显示值的print语句n。

当您键入语句时,REPL会执行它,这意味着它会执行语句所说的任何内容。通常,语句没有值。

脚本模式

到目前为止,我们已经以交互模式运行Julia ,这意味着您可以直接与REPL进行交互。交互模式是一种很好的入门方式,但如果您使用的是几行代码,则可能会很笨拙。

另一种方法是将代码保存在一个名为脚本的文件中,然后在脚本模式下运行REPL 来执行脚本。按照惯例,Julia脚本的名称以.jl结尾。

如果您知道如何在计算机上创建和运行脚本,那么您就可以开始了。否则我建议再次使用JuliaBox。打开文本文件,编写脚本并使用.jl扩展名保存。可以使用该命令在终端中执行该脚本julia name_of_the_script.jl。

由于Julia提供了两种模式,因此您可以在将它们放入脚本之前以交互模式测试代码。但是交互模式和脚本模式之间存在差异,这可能会令人困惑。

例如,如果您使用Julia作为计算器,则可以键入

julia> miles = 26.2
26.2
julia> miles * 1.61
42.182

第一行为值分配值miles并显示该值。第二行是表达式,因此REPL对其进行求值并显示结果。事实证明,马拉松大约42公里。

但是如果您在脚本中键入相同的代码并运行它,则根本没有输出。在脚本模式下,表达式本身都没有可见效果。Julia实际上会对表达式求值,但除非您告诉它,否则它不会显示该值:

miles = 26.2
println(miles * 1.61)

这种行为一开始可能令人困惑。

脚本通常包含一系列语句。如果有多个语句,则在语句执行时,结果会一次显示一个。

例如,脚本

println(1)
x = 2
println(x)

产生输出

1 
2

赋值语句不产生输出。

要检查您的理解,请在Julia REPL中键入以下语句并查看它们的作用:
5
x = 5
x + 1

现在将相同的语句放在脚本中并运行它。什么是输出?通过将每个表达式转换为print语句然后再次运行来修改脚本。

运营顺序

操作符,Julia遵循数学惯例。PEMDAS是记住规则的一个有用方法:

P arentheses具有最高优先级,可用于强制表达式按您想要的顺序进行求值。由于括号中的表达式首先被计算,因此2*(3-1)是4,并且(1+1)^(5-2)是8.您还可以使用括号使表达式更容易阅读(minute * 100) / 60,即使它不会更改结果。

E eenentiation具有次高的优先级,因此1+2^3是9而不是27,并且2*3^2是18,而不是36。

中号 ultiplication和d暂无报价具有优先级高于甲 ddition和小号 ubtraction。所以2*3-1是5而不是4,而且6+4/2是8,而不是5。

具有相同优先级的运算符从左到右进行求值(取幂除外)。所以在表达式中degrees / 2 * π,除法首先发生,结果乘以π。通过划分2 πdegrees / 2 / π

我不怎么努力记住运算符的优先级。如果我看不出表达式,我就用括号把它表示出来。

字符串操作

通常,您不能对字符串执行数学运算,即使字符串看起来像数字,因此以下是非法的:

"2" - "1"    "eggs" / "easy"    "third" + "a charm"

但有两个例外,*并且^。

的*运算符执行字符串连接,这意味着它通过将它们连接起来端至端连接的字符串。例如:

julia> first = "throat"
"throat"
julia> second = "warbler"
"warbler"
julia> first * second
"throatwarbler"

该^操作也适用于字符串; 它执行重复。例如,”Spam”^3是”SpamSpamSpam”。如果其中一个值是字符串,则另一个必须是整数。

通过乘法和取幂的类比,这种使用和^有意义。正如4^3相同4*4*4,我们期望”Spam”^3是相同的”Spam”“Spam”*”Spam”,它是。

注释

随着程序越来越大,越来越复杂,它们越来越难以阅读。形式语言很密集,通常很难查看一段代码并弄清楚它在做什么,或者为什么。

因此,最好在程序中添加注释,以自然语言解释程序正在执行的操作。这些注释称为注释,它们以#符号开头:

# compute the percentage of the hour that has elapsed
percentage = (minute * 100) / 60

在这种情况下,注释单独出现在一行上。您还可以在一行末尾添加注释:

percentage = (minute * 100) / 60   # percentage of an hour

从行#到结尾的所有内容都被忽略 - 它对程序的执行没有影响。

当注释记录代码的非显而易见的特征时,注释最有用。这是合理的假设,读者可以找出哪些代码的功能; 解释原因更有用。

这条评论对代码来说是多余的,没用:

v = 5   # assign 5 to v

此评论包含代码中没有的有用信息:

v = 5   # velocity in meters/second.

好的变量名称可以减少对注释的需求,但长名称可能使复杂的表达式难以阅读,因此需要权衡。

调试

程序中可能发生三种错误:语法错误,运行时错误和语义错误。区分它们以便更快地跟踪它们是有用的。

语法错误
“语法”是指程序的结构和有关该结构的规则。例如,括号必须是匹配对,因此(1 + 2)是合法的,但是8)语法错误。

如果程序中的任何位置存在语法错误,Julia会显示错误消息并退出,您将无法运行该程序。在编程生涯的前几周,您可能会花费大量时间来跟踪语法错误。随着您获得经验,您将减少错误并更快地找到它们。

运行时错误
第二种类型的错误是运行时错误,因为错误直到程序开始运行后才出现。这些错误也称为异常,因为它们通常表示发生了异常(和坏)。

在前几章中您将看到的简单程序中很少出现运行时错误,因此在您遇到之前可能需要一段时间。

语义错误
第三种错误是“语义”,这意味着与意义有关。如果程序中存在语义错误,它将在不生成错误消息的情况下运行,但它不会做正确的事情。它会做点什么。具体来说,它会做你告诉它做的事情。

识别语义错误可能很棘手,因为它要求您通过查看程序的输出并尝试弄清楚它在做什么来向后工作。

词汇表

变量
引用值的名称。

分配
为变量赋值的语句

状态图
一组变量及其引用的值的图形表示。

关键词
用于解析程序的保留字; 你不能使用像关键字if,function和while作为变量名。

操作数
运营商运营的价值之一。

表达
表示单个结果的变量,运算符和值的组合。

评估
通过执行操作来简化表达式以产生单个值。

声明
代表命令或操作的代码段。到目前为止,我们看到的陈述是作业和印刷陈述。

执行
运行一个声明并按照它说的做。

互动模式
通过在提示符下键入代码来使用Julia REPL的方法。

脚本模式
一种使用Julia REPL从脚本中读取代码并运行它的方法。

脚本
存储在文件中的程序。

操作顺序
管理涉及多个运算符和操作数的表达式的计数的规则。

串联
要端到端地连接两个操作数。

评论
程序中的信息,适用于其他程序员(或任何阅读源代码的人),对程序的执行没有影响。

语法错误
程序中的错误使得无法解析(因此无法解释)。

运行时错误或异常
程序运行时检测到的错误。

语义
程序的含义。

语义错误
程序中的错误使得它执行程序员所期望的操作之外的其他操作。

演习

练习2-1
从上一章开始重复我的建议,无论何时学习新功能,都应该以交互模式进行尝试,并故意出错以查看出现了什么问题。

我们已经看到这n = 42是合法的。怎么样42 = n?

怎么样x = y = 1?

在某些语言中,每个语句都以分号结尾;。如果你在朱莉娅声明的末尾加上分号会怎么样?

如果您在声明结尾处加上句号怎么办?

在数学符号中你可以繁殖x并y喜欢这样:x y。如果你在Julia尝试那会怎么样?

练习2-2
练习使用Julia REPL作为计算器:

半径为\(r \)的球体的体积为\(\ frac {4} {3} \ pi r ^ 3 \)。半径为5的球体的体积是多少?[R是43π[R3。半径为5的球体的体积是多少?

假设一本书的封面价格是24.95美元,但书店可以获得40%的折扣。第一份副本的运费为3美元,每份额外的副本为75美分。60份的批发总成本是多少?

如果我在早上6:52离开我的房子并以一个轻松的速度(每英里8:15)跑1英里,然后以3英里的速度(每英里7:12)和1英里的轻松步伐,我几点了回家吃早餐?

猜你喜欢

转载自blog.csdn.net/m0_37696990/article/details/82710694
今日推荐