【Python備忘録】Perlのアレを、Pythonでどう書けばよいか #02
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
お題: 2つのスカラー変数の値を交換したい。しかし、一時変数は使用したくない。(Perlクックブック VOLUME 1から拝借)
1. Perl 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/usr/bin/env perl use strict; use warnings; my ($var1, $var2) = (42, "hello, world"); print_vars($var1, $var2); ($var1, $var2) = ($var2, $var1); print_vars($var1, $var2); sub print_vars { # assumes var2 next to var1 print qq{var1 = "$_[0]", var2 = "$_[1]"\n}; } |
2. Python 2.7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env python2.7 def qq(var): return '"' + str(var) + '"' def print_vars(var1, var2): # assumes var2 next to var1 print "var1 = " + qq(var1) + ", var2 = " + qq(var2) (var1, var2) = (42, "hello, world") print_vars(var1, var2) (var1, var2) = (var2, var1) print_vars(var1, var2) # ポイント1: # 関数(Perlでいうところのサブルーチン)は、 # 呼び出しよりも前に定義しておく必要がある。 # ポイント2: # Perlと同様、複数の変数に対して一度で代入が可能。 # 内部的には、両辺のタプルが個々の変数および値に展開され、 # 対応する位置の変数に対して、対応する位置の値が代入される。 # このような代入方法を「アンパック代入」と呼ぶ。 # ポイント3: # 代入の両辺は、タプルの代わりにリストにしても、 # 同じ効果が得られる。 # 例: [var1, var2] = [42, "hello, world"] |
3. (おまけ) Perl 6 (Rakudo 2016.07.1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/usr/bin/env perl6 my ($var1, $var2) = (42, "hello, world"); print_vars($var1, $var2); ($var1, $var2) = ($var2, $var1); print_vars($var1, $var2); sub print_vars($var1, $var2) { # assumes var2 next to var1 print qq{var1 = "$var1", var2 = "$var2"\n}; } # ポイント1: # strictとwarningsプラグマは、デフォルトで有効となっている。 # ただしwarningsについては、プラグマとして実装されていない模様。 # ポイント2: # 代入に関しては、Perl 5と全く同じように書ける。 # ポイント3: # サブルーチンに渡す引数は、従来の"@_"ではなく、 # サブルーチンのシグネチャに記載した仮引数へ渡される。 # この仮引数はReadonlyなうえ、サブルーチンのブロックに対する # レキシカルスコープを持つ。 # (要するに、ブロック内でmyで宣言したのと同じことであり、 # ブロックの外側からアクセスできない)。 |