将perl脚本重新写入python

将perl脚本重新写入python,python,perl,Python,Perl,我从互联网上找到了这个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('r

我从互联网上找到了这个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";

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

Op/Function     Perl     Python
                ---------------
 map            map      map()
 exponentiation **       **
 reverse        reverse  reverse()
 concatenation  .        +
 range          x .. y   range(x, y+1)
这应该是以同样的方式解决问题的所有物理部分,你必须一步一步地通过每一行来真正理解正在发生的事情


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

在阅读了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))
l=['']*25
对于范围内的yo(25):
对于范围(31)内的x:
y=yo-x/3
l[24-yo]+=('',$)[y**2-20*y+(x**2)/3<0]
打印('\n'.连接(第[:-1]行+第1行)
我在转换代码时注意到perl/python之间的其他差异

  • 在perl中,您可以访问未定义的变量:
    $l.=…
    。但这在Python中是不允许的。应该事先确定。
    • 在python中,通过列表边界访问导致索引器。应该提前分配
  • 在perl中,隐式定义了
    $\
    。为它迭代的每个项目设置它
  • 在perl中返回反向列表,而在Python中返回迭代器。所以我改用了
    [::-1]
  • perl中的
    1/2
    (至少在5.14版中)生成
    0.5
    。在Python2.x中,它生成
    0
    (楼层划分)。在Python3.x中,它生成
    0.5
    (真除法);如果您使用Python2.x运行此代码,您将得到稍微不同的结果。看


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

“但无法做到”
-展示您的尝试并解释您遇到的问题。这里很可能有人可以帮助你,但我们提供的帮助是回答关于你正在编写的代码的问题,而不仅仅是为你编写。当然,让我再试一次,并更新我的代码,因为现在我的打印不接近任何标志:)这是一件非常完美的事情,看,随机的,无关的,但是太棒了…不确定这在Python中是否会更容易。形状为“heart”,颜色为“Red”,内部为“Dollar”,最好在perl中正确使用,“Python”(snake)可能会吓到某人;)开玩笑吧,那是一场令人印象深刻的高尔夫比赛。您能从Python中执行与系统(“perl heart.pl”)等效的操作吗?;-)关于
@l
,有一个
$l[24-$yo]
,即
$l
是数组。@yopy我看到了它的使用位置,但没有看到它的定义位置。与Python不同的是,在Perl中,如果不使用
use warnings,则必须在使用
my
关键字之前声明变量;严格使用它不会提醒您。因此,它不需要预先定义。不幸的是,它远不如原始版本那么可靠(太棒了,非常感谢你,我已经试了两个多小时:)@simbabque,你想要像这一行这样的东西吗<代码>打印('\n'.join(l[::-1]+l代表['''.join('$'[y**2-20*y+(x**2)/3中的l
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))