热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python是动态语言、变量不需要预先定义_从定义变量小窥Python和Scala的设计理念不同...

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

每一门的编程语言背后都代表着某一种特别的哲学,由这一哲学进而设计出属于这门程序语言的语法,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

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

>>> n = 1.34325

>>> type(n)

值得注意的是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"



推荐阅读
author-avatar
Three-Kobe
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有