H5W3
当前位置:H5W3 > python > 正文

【Python】Javascript的生成器函数要多加一个星号,Python却不需要额外标识,为什么这样设计?

一个Javascript的生成器函数是这样的:

function *gen(n) {
for (let i = 0; i < n; i++) {
yield i;
}
}
[...gen(10)]
// <- (10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Javascript在声明的时候要多加一个星号。如果不加星号,会报SyntaxError

一个python的生成器函数是这样的:

def gen(n):
for i in range(n):
yield i
>>> list(gen(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

python在声明的时候不需要额外标识。直接用yield就行了。

两个语言都用了yield关键词,工作原理也几乎相同,甚至可以说Javascript就是抄的python。那为什么Javascript反而要多加一个星号呢?这个星号有什么意义?为什么要这样设计?是Javascipt太特殊,还是python太特殊?

我相信这应该是有原因的,毕竟ES2015的制定过程相当和谐(字面意义上的)

回答

https://stackoverflow.com/que…


终于闲下来了,完善一下答案。

ES 一直以来在坚持的一个原则便是完全避免 breaking changes,毕竟用户的浏览器版本不是编程人员所能干涉的。如果用户的升级导致某些网站的旧代码失效了,组委会肯定会被喷死。这点和其他语言很不一样。因此 Compatibility 是首要原因,新版 ES 必须完全兼容旧版 ES。

Readability 和 Generality 其实都是产生的附加效果。Generality 其实是个伪需求,空 Generator 都可以被有 0 条或 1 条 yield 语句的 Generator 替代,而且后者可读性比前者更好。Readability 这点 ES 的确实比 Python 的要优秀,至少只阅读函数头我便可以知道这是个 Generator 还是 Normal Function,但优势只有在读长代码时才明显。仅凭这些不足以 diss Python 的设计。

而至于 Python 当年为什么沿用了 def,其实没有过多什么“意义”,仅仅是出于 Guido 的直觉而已:-)(参考 PEP 255)。

我认为是为了清晰,从代码上将生成器和普通函数区别开来。因为我想不出有任何技术原因导致必须这么做。

对编译器来说:如果不加星号,从此编译器的效率就更低了,因为不能在看到function就推断这个是一个普通的blockStatement了。
对开发人员来说,看起来是函数,我居然拿不到返回值也不自动执行代码,像我这种神菜级码农一定会吓死。

btw 我还以为js里面有了指针。。。 惊死我了。

从你问的问题,到你对别人的回复,我总感觉你没有诚心在问问题,而是存在某种目的,但是没有达成。

【Python】Javascript的生成器函数要多加一个星号,Python却不需要额外标识,为什么这样设计?

本文地址:H5W3 » 【Python】Javascript的生成器函数要多加一个星号,Python却不需要额外标识,为什么这样设计?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址