我们将继续翻译有关Python和JavaScript类似物的一系列文章
在以前的版本中,我们依靠基于ECMAScript 5的经典版本的Python(2.7)和JS的语法。这次,我们将使用出现在ECMAScript 6标准的Python 3.6和JS中的新功能。
ECMAScript 6是大多数现代浏览器支持的相对较新的标准。 要在较旧的浏览器中使用标准6,您将需要Babel将现代JS6设计转换为跨浏览器支持。
在今天的文章中:字符串中的变量,解压缩列表,lambda函数,不带索引的迭代,生成器和集合。
其他问题的内容:
- 第一部分 -类型转换,三元运算符,通过属性名称,字典,列表,字符串,字符串连接访问属性
- 第二部分是字典,JSON,常规,错误和异常的序列化。
- 这篇文章
- 第四部分是函数参数,创建并使用类,继承,setter getter和类属性。
行中的变量
用变量构造字符串的传统方法是使用字符串和变量的串联:
name = 'World' value = 'Hello, ' + name + '!\nWelcome!'
这样的记录可能看起来分散且阅读不佳,并且您经常会在行中单词周围的空格中犯错。
从Python和JS ECMAScrip6中的3.6版本开始,您可以使用字符串插值,或者使用Python术语,使用f字符串。 这些是字符串模式,其中变量值被替换。
在Python中,f行在引号前标有f:
name = 'World' value = f"""Hello, {name}! Welcome!""" price = 14.9 value = f'Price: {price:.2f} €'
在JS中, 字符串模式以反引号 ` 开头和结尾
name = 'World'; value = `Hello, ${name}! Welcome!`; price = 14.9; value = `Price ${price.toFixed(2)} €`;
请注意,模式可以是单行和多行。
在Python中,您可以设置变量的格式。
开箱清单
在Python和现在的JS中,都有一个有趣的机会将序列元素分配给各种变量。 例如,我们可以将列表中的三个值分配给三个变量:
[a, b, c] = [1, 2, 3]
对于元组,可以省略括号。
以下示例在Python中非常流行,它是交换两个变量的值的一种方式:
a = 1 b = 2 a, b = b, a
在JS6 +中,还可以:
a = 1; b = 2; [a, b] = [b, a];
在Python中,如果列表或元组中元素的数量不确定,则可以将这些元素分配给变量的元组,最后几个值作为列表返回:
first, second, *the_rest = [1, 2, 3, 4]
在JS(ECMAScrip6)中也可以这样做:
[first, second, ...the_rest] = [1, 2, 3, 4];
Lambda函数
Python和JS都具有用于创建单行函数的非常清晰的功能。 这样的函数称为lambda函数。 Lambda是具有一个或多个参数并返回计算值的函数。 通常,当您需要将一个函数作为回调传递给另一个函数时,或者需要处理序列中的每个元素时,都使用lambda函数。
在Python中,您可以使用lambda
关键字定义lambda函数:
sum = lambda x, y: x + y square = lambda x: x ** 2
JS使用=>
表示法。 如果有多个参数,则将它们放在方括号中:
sum = (x, y) => x + y; square = x => Math.pow(x, 2);
没有索引的迭代
许多PL仅允许您通过按索引号访问特定元素来绕过阵列,并以该索引的增量循环。
for (i=0; i<items.length; i++) { console.log(items[i]); }
这不是一个非常漂亮的记录,对于初学者来说有点复杂-这样的记录看起来并不自然。 Python有一种简洁明了的方式来绕过列表:
for item in ['A', 'B', 'C']: print(item)
在现代JS中,这是使用for..of
运算符实现的:
for (let item of ['A', 'B', 'C']) { console.log(item); }
您还可以在Python中逐个字符地跳过行:
for character in 'ABC': print(character)
在现代JavaScript中:
for (let character of 'ABC') { console.log(character); }
发电机
Python和现代JS都允许您定义看起来像迭代器的特殊函数。 每次调用(迭代)时,它们将返回序列中的下一个生成的值。 这些功能称为生成器。
生成器通常用于获取:范围中的数字,文件中的行,外部API逐页的数据,斐波那契数字和其他动态生成的序列。
从技术上讲,生成器看起来像普通函数,但是生成器返回单个值并暂停操作直到下一次调用,而不是返回单个值(并停止工作)。 他们将在每次调用时从列表中生成以下值,直到到达列表末尾。
考虑一下Python中的一个示例,其中创建了countdown()生成器,该生成器以相反的顺序(10,9,8,...,1)将给定数字返回到1:
def countdown(counter): while counter > 0: yield counter counter -= 1 for counter in countdown(10): print(counter)
在现代JS中也可以得到相同的结果,但是在函数的描述中要注意*。 这将她定义为发电机:
function* countdown(counter) { while (counter > 0) { yield counter; counter--; } } for (let counter of countdown(10)) { console.log(counter); }
套装
我们已经熟悉了列表(列表),元组(tuple),数组(array)。 但是还有另一种类型的数据-集。 集合是数据数组,其中每个唯一元素仅在单个副本中存在。 集理论将集的运算定义为并集,交集和差,但是我们现在不考虑它们。
我们创建一个集合,向其中添加元素,检查元素的存在,获取元素总数,按元素遍历集合,然后使用Python删除一个元素:
s = set(['A']) s.add('B'); s.add('C') 'A' in s len(s) == 3 for elem in s: print(elem) s.remove('C')
在JS上也一样:
s = new Set(['A']); s.add('B').add('C'); s.has('A') === true; s.size === 3; for (let elem of s.values()) { console.log(elem); } s.delete('C')
总结一下
- 字符串模式(f行)即使在多行对象的情况下也可以提高可读性并简化代码。
- 您可以不使用索引而绕过数组,组或字符串。
- 使用生成器,您可以获得具有几乎无限数量的元素的序列。
- 使用集合可以轻松验证数组中元素的唯一性。
- 当需要小的单行功能时,请使用lambda。
在下一部分中,我们将讨论函数参数,类,继承和属性。