Python和JavaScript中的类似物。 第三部分

我们将继续翻译有关Python和JavaScript类似物的一系列文章


在以前的版本中,我们依靠基于ECMAScript 5的经典版本的Python(2.7)和JS的语法。这次,我们将使用出现在ECMAScript 6标准的Python 3.6和JS中的新功能。


ECMAScript 6是大多数现代浏览器支持的相对较新的标准。 要在较旧的浏览器中使用标准6,您将需要Babel将现代JS6设计转换为跨浏览器支持。


在今天的文章中:字符串中的变量,解压缩列表,lambda函数,不带索引的迭代,生成器和集合。


其他问题的内容:


  1. 第一部分 -类型转换,三元运算符,通过属性名称,字典,列表,字符串,字符串连接访问属性
  2. 第二部分是字典,JSON,常规,错误和异常的序列化。
  3. 这篇文章
  4. 第四部分是函数参数,创建并使用类,继承,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} €' # 'Price: 14.90 €' 

在JS中, 字符串模式以反引号 ` 开头和结尾


 name = 'World'; value = `Hello, ${name}! Welcome!`; price = 14.9; value = `Price ${price.toFixed(2)} €`; // 'Price: 14.90 €' 

请注意,模式可以是单行和多行。
在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] # first == 1 # second == 2 # the_rest == [3, 4] 

在JS(ECMAScrip6)中也可以这样做:


 [first, second, ...the_rest] = [1, 2, 3, 4]; // first === 1 // last === 2 // the_rest === [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。

在下一部分中,我们将讨论函数参数,类,继承和属性。

Source: https://habr.com/ru/post/zh-CN418191/


All Articles