将perl脚本重写为python

2024-05-14 17:51:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我从因特网上找到了这个perl脚本,并试图用python重写,但没能做到。如果有人精通perl和python,请帮帮我。我确实希望python能够比perl更容易地做到这一点。在

谢谢

#!/usr/bin/perl
use Term::ANSIColor;
map(($yo=$_,map(( $y=$yo-$_/3,$l[24-$yo] .= (' ','$')[$y**2-20*$y+($_**2)/3<0]),    (0..30)),),(0..24));
print color('red');
print join("\n", map(reverse($_).$_, @l)), "\n";

输出:

^{pr2}$

Tags: 脚本mapbinuseusrredperlcolor
2条回答

在阅读了Hunter McMillen的答案之后,我将OP的perl代码转换为python。在

l = [''] * 25
for yo in range(25):
    for x in range(31):
        y = yo - x / 3
        l[24 - yo] += (' ', '$')[y**2 - 20*y + (x**2) / 3 < 0]

print('\n'.join(line[::-1] + line for line in l))

在转换代码时,我注意到perl/python之间的其他差异。在

  • 在perl中,可以访问未定义的变量:$l .= ...。但这在Python中是不允许的。应该事先定义。
    • 在python中,通过列表边界访问的原因是IndexError。应该提前分配。在
  • 在perl中,$_是隐式定义的。^{}为它迭代的每个项设置它。在
  • ^perl中的{a2}返回反向列表,而Python中的^{}返回迭代器。所以我用了[::-1]。在
  • ^perl中的{}(至少在5.14版本中)产生{}。在python2.x中,它生成0(floor division)。在Python3.x中,它生成0.5(真除法);如果使用Python2.x运行这段代码,将得到稍微不同的结果。见http://asciinema.org/a/6681

顺便说一句,这是黑色的心而不是红色的;)

Perl和Python都是动态语言,共享许多类似的内置函数,在Perl代码中使用的每个函数和/或运算符都在Python中有一个直接映射:

Op/Function     Perl     Python
                       -
 map            map      map()
 exponentiation **       **
 reverse        reverse  reverse()
 concatenation  .        +
 range          x .. y   range(x, y+1)

这应该是所有的物理部分,以同样的方式解决问题,你将不得不逐步通过每一行,以真正了解发生了什么。在

此外,您永远不会显示@l的定义位置。在

相关问题 更多 >

    热门问题