B***i 发帖数: 724 | |
g*****g 发帖数: 34805 | 2 It's not that bad once you get used to the syntax. But it's certainly harder
to read than Java.
【在 B***i 的大作中提到】 : 有人有同感吗?
|
p*****2 发帖数: 21240 | 3
harder
比java好读多了吧?
【在 g*****g 的大作中提到】 : It's not that bad once you get used to the syntax. But it's certainly harder : to read than Java.
|
p*****2 发帖数: 21240 | 4
大牛在学scala吗?
【在 B***i 的大作中提到】 : 有人有同感吗?
|
B***i 发帖数: 724 | 5 不是大牛。
用scala 用了好一段时间了。但是还是觉得不好读, 不好写。 原来用java, python
写个小程序很容易, 换成scala 就难受得很。
【在 p*****2 的大作中提到】 : : 大牛在学scala吗?
|
B***i 发帖数: 724 | 6 举个例子, 如果我有个一文件, 想找到第二个注释行 (假设注释行第一个字符都是#)
, 用python 就很容易
count = 0
f = open(filename)
line = f.readline()
while line:
if line.startswith("#"):
count += 1
if count >= 2:
return line
line = f.readline()
谁能帮我写个 scala得程序? 当然有 "functional programming"得风格最好了。
如果这个文件超级大的话, 不知道效率如何? |
p*****2 发帖数: 21240 | 7
#)
没看出来python这个坡语言有什么容易的。
Scala:
Source.fromFile("input.txt").getLines.filter(i=>i.startsWith("#")).toList(1)
【在 B***i 的大作中提到】 : 举个例子, 如果我有个一文件, 想找到第二个注释行 (假设注释行第一个字符都是#) : , 用python 就很容易 : count = 0 : f = open(filename) : line = f.readline() : while line: : if line.startswith("#"): : count += 1 : if count >= 2: : return line
|
n*w 发帖数: 3393 | 8 临时学的
scala.io.Source.fromPath("myfile.txt").getLines().filter(line => line.
StartWith("#")) slice (2, 2) |
B***i 发帖数: 724 | 9 这个 getLines() 是不是要把所有的line全部读进来?
【在 n*w 的大作中提到】 : 临时学的 : scala.io.Source.fromPath("myfile.txt").getLines().filter(line => line. : StartWith("#")) slice (2, 2)
|
n*w 发帖数: 3393 | 10 The answer should be no since get lines returns an iterator.
Don't convert it to an array.
【在 B***i 的大作中提到】 : 这个 getLines() 是不是要把所有的line全部读进来?
|
|
|
w******p 发帖数: 166 | 11 i don't think python should be judged because of this example, otherwise
bash and its friends may look even better, and it's also only reading as
much of the file as necessary:
$ grep -m2 "^#" file | tail -1 |
N********n 发帖数: 8363 | 12
PYTHON不至于这么面吧,居然要写这么多行CODE.
【在 B***i 的大作中提到】 : 举个例子, 如果我有个一文件, 想找到第二个注释行 (假设注释行第一个字符都是#) : , 用python 就很容易 : count = 0 : f = open(filename) : line = f.readline() : while line: : if line.startswith("#"): : count += 1 : if count >= 2: : return line
|
B***i 发帖数: 724 | 13 感谢大家的回复。 我其实不应该说python 简单的。 我其实原来想说的是python容易
读, 象大白话。 scala 写出来的东西很精炼, 但是象文言文, 很难读。
感谢nkw, 现在对scala 明白多了一些。
还有一个例子, 继续前面的的例子,假设每行都是一个数字, 要找出第二个和前一行
相同的数字。 比如说
2
3
3 <- 第一个和前行相同的数字
4
4 <- 第二个和前行相同的数字
5
2
5
5 <- 第三个和前行相同的数字
用python等过程语言就很容易。 大白话, 谁都会,啰嗦一点就是了。
用functional programming 风格的程序就让我费老鼻子劲了(还带bug,)
List(0,1,2,3,3,4,4,5,6).scanLeft((0, 0)) {
(pre, next) =>
if (pre._1 == next)
(next, pre._2 + 1)
else
(next, pre._2)
}
.filter{ _._2 == 2}
.head
如果要求是第二个和前面倒数第二个(隔行)相同的呢?我已经跪了。
1
3 *
2
3 <- 第一个和前隔行相同的数字
4
5
4 <- 第二个和前隔行相同的数字
5
2
5 <- 第三个和前隔行相同的数字 |
g*****g 发帖数: 34805 | 14 You can't compare it to script. grep is a function call to begin with.
【在 w******p 的大作中提到】 : i don't think python should be judged because of this example, otherwise : bash and its friends may look even better, and it's also only reading as : much of the file as necessary: : $ grep -m2 "^#" file | tail -1
|
p*****2 发帖数: 21240 | 15
list=for(i<-1 until arr.length if arr(i)==arr(i-1)) yield arr(i)
【在 B***i 的大作中提到】 : 感谢大家的回复。 我其实不应该说python 简单的。 我其实原来想说的是python容易 : 读, 象大白话。 scala 写出来的东西很精炼, 但是象文言文, 很难读。 : 感谢nkw, 现在对scala 明白多了一些。 : 还有一个例子, 继续前面的的例子,假设每行都是一个数字, 要找出第二个和前一行 : 相同的数字。 比如说 : 2 : 3 : 3 <- 第一个和前行相同的数字 : 4 : 4 <- 第二个和前行相同的数字
|
h***t 发帖数: 2540 | 16 你这个Python写的真烂,有那么多行吗? 感觉你是把C++或者Java翻译了
#)
【在 B***i 的大作中提到】 : 举个例子, 如果我有个一文件, 想找到第二个注释行 (假设注释行第一个字符都是#) : , 用python 就很容易 : count = 0 : f = open(filename) : line = f.readline() : while line: : if line.startswith("#"): : count += 1 : if count >= 2: : return line
|
p*****2 发帖数: 21240 | 17
嗯。感觉LZ还需要多多练习。
【在 h***t 的大作中提到】 : 你这个Python写的真烂,有那么多行吗? 感觉你是把C++或者Java翻译了 : : #)
|
B***i 发帖数: 724 | 18 如果想只返回第一个满足条件的而不想遍历整个数组呢?
【在 p*****2 的大作中提到】 : : 嗯。感觉LZ还需要多多练习。
|
B***i 发帖数: 724 | 19 谢谢指教。 正在学习中
【在 p*****2 的大作中提到】 : : 嗯。感觉LZ还需要多多练习。
|
l*******b 发帖数: 2586 | 20 试了下这个, 你看看好用不
def rep(l: List[Int]): Int = l match {
case x :: y :: z => if(x == y) x else rep(y :: z)
case _ => -1
}
rep(List(1,2,2,4,4,5))
【在 B***i 的大作中提到】 : 谢谢指教。 正在学习中
|
|
|
l*******b 发帖数: 2586 | 21 再来个这个
val c = List(1,2,2,3,3,4)
c.sliding(2).find(c => c(0) == c(1))
res28: Option[List[Int]] = Some(List(2,2))
【在 l*******b 的大作中提到】 : 试了下这个, 你看看好用不 : def rep(l: List[Int]): Int = l match { : case x :: y :: z => if(x == y) x else rep(y :: z) : case _ => -1 : } : rep(List(1,2,2,4,4,5))
|
B***i 发帖数: 724 | 22 谢谢。 这个解法很好。 不过好像find () 是找满足条件第一个的? 如果要找第二个
的呢?
而且正符合我的看法。 scala 写起来短小精悍, 那是使用了预先定义好了很多idiom.
比如这里的sliding.
【在 l*******b 的大作中提到】 : 再来个这个 : val c = List(1,2,2,3,3,4) : c.sliding(2).find(c => c(0) == c(1)) : res28: Option[List[Int]] = Some(List(2,2))
|
B***i 发帖数: 724 | 23 这个能帮解释一下吗? 特别是 match { case x :: y :: z 这句
【在 l*******b 的大作中提到】 : 试了下这个, 你看看好用不 : def rep(l: List[Int]): Int = l match { : case x :: y :: z => if(x == y) x else rep(y :: z) : case _ => -1 : } : rep(List(1,2,2,4,4,5))
|
p*****2 发帖数: 21240 | 24
val arr=Array(2,3,3,4,4,5,2,5,5)
arr((1 until arr.length).find(i=>arr(i)==arr(i-1)).get)
【在 B***i 的大作中提到】 : 如果想只返回第一个满足条件的而不想遍历整个数组呢?
|
p*****2 发帖数: 21240 | 25
就是把list分成三部分
x=l(1)
y=l(2)
z=其他的
【在 B***i 的大作中提到】 : 这个能帮解释一下吗? 特别是 match { case x :: y :: z 这句
|
B***i 发帖数: 724 | 26 真是太奥妙了。 加个 .get就取下一个吗? 越来越感觉象文言文了。被之乎者也搞晕了
【在 p*****2 的大作中提到】 : : 就是把list分成三部分 : x=l(1) : y=l(2) : z=其他的
|
p*****2 发帖数: 21240 | 27 你看看impatient那本书吧
【在 B***i 的大作中提到】 : 真是太奥妙了。 加个 .get就取下一个吗? 越来越感觉象文言文了。被之乎者也搞晕了
|
B***i 发帖数: 724 | 28 好, 我去找找.谢谢。
【在 p*****2 的大作中提到】 : 你看看impatient那本书吧
|
n******t 发帖数: 4406 | 29 这也叫短小精干啊。。
idiom.
【在 B***i 的大作中提到】 : 谢谢。 这个解法很好。 不过好像find () 是找满足条件第一个的? 如果要找第二个 : 的呢? : 而且正符合我的看法。 scala 写起来短小精悍, 那是使用了预先定义好了很多idiom. : 比如这里的sliding.
|