Python和Scala的定义变量

每一门的编程语言背后都代表着某一种特别的哲学,由这一哲学进而设计出属于这门程序语言的语法,Python和Scala也不例外。我们从变量的定义去一窥Python和Scala设计哲学的不同。

在Scala里面变量可以分为两种,分别是var和val,var在它的生命周期是可以不断被赋值的,而val一旦定义便无法改变。 我们可以在REPL里简单的测试下:

scala> var a = 1
a: Int = 1

scala> a=2
a: Int = 2

scala> val a = 1
a: Int = 1

scala> a = 2
<console>:8: error: reassignment to val
       a = 2
         ^

第一步中我们定义了var的变量a=1,a再下一步中可以变成a=2。但是如果我们定义的a是val,我们再赋值a=2时,Scala会抛出错误。让我们再看看Python的变量,Python的变量都是Scala里的var,在它的生命周期都是可以被赋值的。

>>> a = 1
>>> a
1
>>> a = 2
>>> a
2

好的,我们不应该满足于简单的var和val,让我们再深入的看看Scala的变量还返回了什么有趣的东西。前一篇文章中,我们提到了类型推断,这一次借着定义变量再看看它是怎么运行的。首先先简单定义一个val的变量

scala> val a = 1
a: Int = 1

而它完整的定义a应该是这样的:

scala> val a:Int = 1
a: Int = 1

前文也说过Scala是一门静态语言,但是我们却不需要像C或者Java一样必须预先定义数据类型(比如上例中的Int类型),可以把数据类型的定义交由Scala的编译器。把val a:Int = 1简化成了val a = 1。在这一点很Python很像,都是“Simple is better than complex.”。再多一些例子体会Scala的类型推断的强大。

scala> val msg = "Hello, World!"
msg: String = Hello, World!

scala> val char = 'H'
char: Char = H

scala> val n = 1.2334324
n: Double = 1.2334324

Python作为一门动态语言拥有着在检查变量类型的能力,而无需预定义。

>>> msg = "Hello, World!"
>>> type(msg)
<class 'str'>
>>> n = 1.34325
>>> type(n)
<class 'float'>

值得注意的是PEP 526(已经在Python3.6版本执行了)提出了Type Hint,可以使用如下的方式:

my_var: int
my_var = 5  # Passes type check.
other_var: int  = 'a'  # Flagged as error by type checker,
                               # but OK at runtime.

表明my_var是int类型,但是并不像Scala一样会做强制的类型检查,这个仅仅只是一个提示。对于Type Hint的引进,极大地方便了工程化,而且也没有影响Python的动态特性。当然,虽然两者看起来类似,但是我们应该了解Scala的类型推断是在编译期处理的,而Python是在运行时检查类型,实际上是两种不同的处理技术,不能混为一谈。

我们从变量这一点发现了到Scala追求的是Scalable的,拥有着var和val两种变量的定义方式,而Python是“There should be one-- and preferably only one --obvious way to do it.”,只要var即可,val略显多余。

"阅后甜点" 最后的最后,简单来看看在REPL里的换行就好了: Scala是直接按回车键,就会出现符号|,然后可以继续输入了。

scala> val multiLine =
     | "HaHa"
multiLine: String = HaHa

Python还需要你输入一个\,这样才能换行输入。

>>> multi_line = \
... "HaHa"

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

Python数据类型—字符串(1)

Python数据类型 — 字符串(1) 除了数值,我们还常常需要对文字进行处理。本文将介绍Python用于文字处理的数据类型 — 字符串,并解释如何在计算机系统...

2238
来自专栏大数据和云计算技术

由快速排序到分治思想

算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第一篇《由快速排序到分治思想》,非常赞!希望对大家有帮助,大家会喜欢! 快速排序是一种基于分治思想...

3586
来自专栏大数据钻研

让你分分钟学会 javascript 闭包

闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它。...

2774
来自专栏C语言及其他语言

C语言的数据类型

变量与常量数据 在程序的世界中,可以让计算机按照指令做很多事情,如进行数值计算、图像显示、语音对话、视频播放、天文计算、发送邮件、游戏绘图以及任何我们可以想...

5115
来自专栏take time, save time

初级程序员面试不靠谱指南(二)

3.read-only的const。如果你突然冒出一句看似很高深的话但又不解释一般都是装逼,就像前面提到过const准确的应该理解为一个read-only的变量...

2937
来自专栏zhisheng

干货分享:让你分分钟学会 javascript 闭包 一像素

闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它。...

3505
来自专栏web前端-

面向对象的几种设计模式

其实面向对象是相对于面向过程而言,通俗来说就是创建对象,每个对象有自身的属性和方法,对象.属性  对象.方法 实际上这已经是一个面向对象的过程了,面向过程,是指...

3614
来自专栏Java爬坑系列

【Java入门提高篇】Day14 Java中的泛型初探

  泛型是一个很有意思也很重要的概念,本篇将简单介绍Java中的泛型特性,主要从以下角度讲解:   1.什么是泛型。   2.如何使用泛型。   3.泛型的好处...

3326
来自专栏大数据架构师专家

python实战系列之python变量

编程语言中为了能够更好的处理数据,都需要使用一些变量。Python 语言的变量可以是各种不同的数据类型,使用变量的时候不需要声明直接使用就可以。

931
来自专栏liuchengxu

Scala 最佳实践:纯函数

我们所处的是一个命令式编程(imperative programming)的时代,这也是我们为何更喜欢用命令式风格写代码的原因。在我们周围的一切都是可变的。虽然...

891

扫码关注云+社区

领取腾讯云代金券