ラベル 考察 の投稿を表示しています。 すべての投稿を表示
ラベル 考察 の投稿を表示しています。 すべての投稿を表示

2019年5月6日

考察・Haskell の影響

英語版Wikipedia の Python の項目には、Python が影響を受けた言語として以下の言語が挙げられています。
ここでは、Haskell について注目してみたいと思います。


Haskell が Python に与えた影響として最も大きなものは、内包表記の採用と思われます。
他の言語を習得してから Python を勉強し始めた時、記法が独特であるが故、しばしば戸惑うのが内包表記です。

# Python での内包表記の例
>>> print([i ** 2 for i in range(1, 10 + 1)])
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

実はこの内包表記の記法は、Haskell の内包表記から取り入れられたもの(のはず)です。
Haskell での内包表記は以下のようになります。
# Haskell での内包表記の例
main = print [i^2 | i <- [1..10]]
-- [1,4,9,16,25,36,49,64,81,100]
Python の内包表記と、極めて近い記法ですよね。


Python の内包表記には条件式を追加できますが、これも Haskell と同様です。

# Python での内包表記 with 条件式の例
>>> print([i ** 2 for i in range(1, 10 + 1) if i % 3 != 0])
[1, 4, 16, 25, 49, 64, 100]
# Haskell での内包表記 with 条件式の例
main = print [i^2 | i <- [1..10], i `mod` 3 /= 0]
-- [1,4,16,25,49,64,100]
条件式を含めても、やはり Python の内包表記と Haskell の内包表記は似ています。

独特な記法で知られる Python の内包表記ですが、これはHaskell の影響だった、というわけです。




他に Haskell が影響を与えたものとして明らかなのは、itertoolsライブラリです。実際、公式ページに Haskell 等の影響を受けたと書かれています。

itertoolsライブラリに含まれている cycle、repeat、dropwhile、takewhile、permutations といった関数は、Haskell にも同名の関数が用意されており、その動作も基本的に同じです。




Python はマルチパラダイム言語ですが、関数型言語に関しては、Haskell からの影響が強い、というのは知っておいて損はないと思います。

2016年5月9日

考察・記号

Python と他のプログラム言語の文法を見比べた際、総じて Python は記号を使う機会の少ない言語であると言えます。


C言語を比較対象として、以下に4例ほどを挙げます。

# ① NOTの書き方。Pythonには ! がない
if not condition:
    pass
// C言語のNOT
if (!condition) [
}

# ② AND条件。Pythonには && がない
if condition1 and condition2:
    pass
// C言語のAND条件
if (condition1 && condition2) [
}

# ③ Pythonの3項演算子は記号を用いない
a = 10 if condition else 0
// C言語の3項演算子
a = condition ? 10 : 0;

# ④ Pythonにはインクリメントが無い
>>> a = 1
>>> a++
  File "", line 1
    a++
      ^
SyntaxError: invalid syntax
上記を見ると、Python の言語設計では、記号を用いた表現はできるだけ避け、日常言語(ここでは英語)に近づけようという思想が感じられます。



PEP 8 には、「日常言語に近づける」という思想を如実に表すルールがあります。

Yes:
if foo is not None:

No:
if not foo is None:
これはズバリ、is not という英語表現が使えるのだから is not を使いなさい、というルールです。

2016年5月2日

考察・ラムダ式

Python の公式のスタイルガイドである PEP 8の中で、ラムダ式について触れられている箇所の内容について考えてみます。


PEP 8 ではラムダ式を変数に代入することを許可していません。PEP 8 で挙げられている例を以下に引用します。

Yes:
def f(x): return 2 * x

No:
f = lambda x: 2 * x
長くなったラムダ式を一旦変数に代入したり、同じラムダ式を繰り返し使う場合に一度変数に代入するのは、それほど悪くない使い方のようにも思えます。
しかし、PEP 8 では、
  • 関数の方がトレースし易い
  • ラムダ式の利点は式の中に埋め込み可能である点。変数に代入するとその利点が活かせない
という理由のため、ラムダ式を変数に代入すべきでない、としています。


ここから「Python はラムダ式を好きじゃない」ということが分かります。
Python では関数内で関数を定義可能です。そして、ラムダ式でできることは関数でもできます。それなら全て関数で書けばいいじゃないか、というのが根本的な考えです。
ただし、sorted() の key のように、ラムダ式を使うことで記述がグッと簡潔になる場面があります。このような時にはラムダ式を使ってもいいよ、というのが Python のラムダ式に対する姿勢です。