Re: ローカル変数で「L」とか「D」の変数名を使うやつ!

コメント欄に書くには長くなりそうだったので、エントリ立ててみた。
ローカル変数で「L」とか「D」の変数名を使うやつ! - Pashango’s Blog

PythonだってUPPERCASEは定数なのは暗黙の了解です(怒られないけどね)、なんでそれをわざわざ使うのかということです。

ここに関する認識の違いですね。では、以下にずらずら書いていきましょう。

Python での定数(的なるもの)

僕が*1 Python で書かれたコードを読む時に、識別子を定数だと認識するには二つ条件があります。

  • UPPERCASE である事
  • モジュールレベルで定義された変数である事

この二つを満した識別子を見つけた時に、僕はそれが定数である事を意図して書かれたコードだと思います。

ローカル変数が UPPERCASE で書かれていたとしても、それは定数を意図したのでは無いであろうと考えますので、
Ruby の定数を引き合いに出すのは違うのじゃないかなと思ったわけですね。

ローカル変数 L について

とはいえ実際に UPPERCASE で書かれたローカル変数を見る事はあまり無いですが、あるとしたら L が一番多いです。
これは PEP8 に理由を求める事ができます。

Names to Avoid

Never use the characters `l' (lowercase letter el), `O' (uppercase
letter oh), or `I' (uppercase letter eye) as single character variable
names.

In some fonts, these characters are indistinguishable from the numerals
one and zero. When tempted to use `l', use `L' instead.

http://www.python.org/dev/peps/pep-0008/

避けるべき名前

「l」 (小文字のエル)、「O」(大文字のオー)、「I」(大文字のアイ)
を1文字の変数名として使わない。

フォントによっては、これらの文字は数字の 1 や 0 と区別できない。
「l」 を使いたくなったら、代わりに「L」を使う。

http://www.oldriver.org/python/pep-0008j.html

と、ここまで書いてきましたが

僕も個人的には、一文字の変数はあんまり使わない方が良いとは思いますね。
特にセンスが無い人*2が使うと、なんだかなーって事になりやすいです。
それなのに使っちゃうのは、僕がダメプログラマだからなのです。


ごめんなさいごめんなさい!

*1:というか PEP8 まま

*2:おれおれ!

読み難いワンライナー

はてブを眺めていたら以下のような質問を見付けたので、解説してみるよ!

perl の構文に関する質問です。
このコードが何をやっているのか教えてください。

$_=3x(1E3-1),s/3/++$p%3*$p%5?7:5x$p/ge,print s/5//g

以下のコードと同じで3または5で割り切れる1000までの数を足した結果が得られることは知っていまが、それぞれの記号が何を意味するのか分かりません。

$sum=0;
map {$sum += $_ if(!($_%3) || !($_%5))} 1..1000;
print $sum;

最近 perl を使い始めたので良くわかっていません。
よろしくお願いします。

http://q.hatena.ne.jp/1246252336

予備知識

まずは、これを解読するために必要な知識は以下

という訳で、一つずつ簡単な解説いってみよう。

  • 暗黙の $_

これは特殊変数とか言われてる奴かな。
正規表現や一部の組み込み関数などでは、対象や引数が渡されなかった時に $_ っていう変数を勝手に使います。

$_ = 111;
print $_; # => 111
print;    # => 111

繰り返し演算子です。文字列に使うと、指定回数繰り返した文字列になりますね。

my $str = "Abc";
print $str x 3; # => "AbcAbcAbc"
  • 指数表記

これはもう表現の問題でして、1E3 は 1 * (10 ** 3) 、つまり 1000 という事ですね。

s/// は、対象となる変数を置換し、置換処理をした回数を返します。

$_ = "113";
print s/1/2/; # => 1
print; # => 213

$_ = "113";
# g修飾子を使うと
print s/1/2/g; # => 2
print; # => 223

g修飾子は繰り返しの指定になります。
この例ですと、付けない場合は一度置換した時点で終了していますけど、付けたほうは最後まで頑張ります!

$_ = "113"s/1/2x2/e; # e修飾子を使うと...
print; # => 2213

e修飾子は正規表現中の Perl コードを評価してくれるようになります。
この場合は x演算子 で 2 を 2回繰り返し、それを置換する結果として利用してます。

$_ = "113";
s/1/2x2/ge; # 合せ技!
print; # => 22223

組み合わせるとこんな風になりますね。

解説

という訳で対象となるコードをもう一度見てみましょう。

$_=3x(1E3-1),s/3/++$p%3*$p%5?7:5x$p/ge,print s/5//g

はい、ここまでの予備知識でなんとかなりそうですね。


僕はもう疲れましたのでここまでにしておきます。
続きが読みたい方はわっふるわ(ry

漫画喫茶などで濃いホットココアを飲むためのライフハック

条件

  • 容器に氷を満たして熱いココアを注いでアイスココアにするタイプの装置がある
  • お湯がある

方法

  1. ホットを飲みたいが、構わずアイスココア用のボタンを押す
  2. お湯で薄められていない濃いココアが出てくる
  3. そのままだとさすがに濃すぎるので、お湯でいい感じまで薄める
  4. おいしい!

誰が得するんだよこれ。。