PHPerの為のPython入門 - 超基礎


PHPはもうある程度書けるから他の言語やってみたいなーPythonとかいいなーって思ってる人向けに、PHPとの相違点とか注意した方がよい部分をまとめてみました。
Python布教活動ですー。

Python2.7をベースに話を進めて行きたいと思います。


# Hello World

何はともあれコレ。

```py
# helloworld.py
print("Hello World!")
```

このファイルを以下のコマンドで実行しますです。

```
% python helloworld.py
% Hello World!
```

PHPと違ってApache経由でアクセスしたら見れるよーなんて便利機能はないので、面倒ですがコマンドラインで実行しましょう。
Macユーザーなら[CodeRunner](http://krillapps.com/coderunner/)便利。


# 基本的な記述方法

PHPとPythonで同じものを実装してみます。

```php
<?php

/**
 * 時間を指定すると、対応する挨拶を表示するよ！
 */
function greet($hour) {
    if ($hour > 4 && $hour < 12) {
        echo "Good Morning!" . PHP_EOL;
    } elseif ($hour > 12 && $hour < 18) {
        echo "Good Afternoon!" . PHP_EOL;
    } else {
        echo "Good Evening!" . PHP_EOL;
    }
}

greet(8);  // Good Morning!
greet(15);  // GOod Afternoon!
greet(21);  // GOod Evening!
```

```py
# coding=utf8

def greet(hour):
    """時間を指定すると、対応する挨拶を表示するよ！"""
    if 4 < hour < 12:
        print("Good Morning!")
    elif 12 < hour < 18:
        print("Good Afternoon!")
    else:
        print("Good Evening!")

greet(8)  # Good Morning!
greet(15)  # GOod Afternoon!
greet(21)  # GOod Evening!
```

1つずつ説明していきますね。


# # coding=utf8って何よ？

いきなり謎のコード。
Pythonのコードの1行目に書いてあるのは何でしょう。。

```py
# coding=utf8
```

実はコレがないとPythonのソースコードに日本語（マルチバイト文字）が書けません。。
Pythonはデフォルトだとソースコードの文字コードを`ASCII`として判断するので、 **「これはUTF-8で書かれているのよ！」** と教えてあげないと読めないのです。
面倒ですが`おまじない`だと思って下さいませ。


```py
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
# coding=utf8

print("実はいろんな書き方が出来るのです。")
```


ちなみに`#`で始まる行はPythonではコメントとして扱われます。
PHPでいうところの`//`と同じですね。


# 変数名に $ はいらないよ

PHPで変数を定義する際には必ず変数名の頭に`$`をつける必要がありましたが、Pythonでは必要ありません。
素直に変数名を書けばOK。

```py
variable = 10
```


# 処理の最後に ; (セミコロン) はいらないよ

そのまんまです。
PHPでは処理の最後に`; (セミコロン)`が必要でしたが、Pythonでは要りません。

```py
print("お尻にセミコロンがない！！！")
```


# 関数定義の書き方が違うよ

これも見たまんま。
PHPでは`function`を使用しますが、Pythonでは`def`を使います。

もう一つの相違点として、Pythonの場合は`{}`が要らないです。
有名なので知ってると思いますが、Pythonはスコープの表現に`{}`は使用せず`インデント`を用います。

```py
def func(argument):  # 最後の : (コロン) を忘れずに！
    print(argument)
```


# if文にカッコいらないよ

if文も関数と同様に`{}`ではなく`インデント`でスコープの表現を行います。
また、条件式を定義する所に`()`は必要ありません。

if文の最後にも`: (コロン)`をつける必要があります。

```py
if 4 < hour < 12:  # コロン書くのめんどくさい！！！
    print("Good Morning!")
```

## 条件式の書き方

厳密にはif文についてでは無いのですが、条件式の記述方法にも相違があります。
PHPの場合、条件式を繋ぐ場合は`&&演算子`を用いますが、Pythonの場合は`and演算子`を使います。

```py
hour > 4 and hour < 12
```

PHPの`||演算子`のPythonでの書き方は、ご想像どおりコレ。

```py
hour > 4 or hour < 12
```

**「あれ、上のサンプルに`and演算子`出てこないじゃん。」**

と思った方、Pythonでは不等号の条件式は以下の様につなげて書くことが出来るのですー便利ですー。

```py
4 < hour < 12
```


# ループとか配列とかの例

まずは同じことをPHPとPython両方で書いてみます。

```php
<?php

$jobs = array(
    "John" => "Guitar",
    "Paul" => "Guitar",
    "George" => "Bass",
    "Ringo" => "Drums",
);
foreach ($jobs as $name => $job) {
    printf("%s: %s" . PHP_EOL, $name, $job);
}

$names = array("John", "Paul", "George", "Ringo");
for ($i = 0; $i < count($names) ; $i++) { 
    printf("%d: %s" . PHP_EOL, $i, $names[$i]);
}
```

```py
# coding=utf8

jobs = {
    "John": "Guitar",
    "Paul": "Guitar",
    "George": "Bass",
    "Ringo": "Drums",
}
for name, job in jobs.items():
    print("{}: {}".format(name, job))

names = ["John", "Paul", "George", "Ringo"]
for index, name in enumerate(names)):
    print("{}: {}".format(index, names[index])
```


# 配列とリスト、連想配列と辞書

PHPでは数字が添字の配列も、文字列が添字の連想配列も`array`で定義しますが、Pythonの場合はそれぞれ`list / []`と`dict / {}`を用います。

```py
# リスト
names = ["John", "Paul", "George", "Ringo"]
names = list("John", "Paul", "George", "Ringo")

# 辞書
jobs = {
    "John": "Guitar",
    "Paul": "Guitar",
    "George": "Bass",
    "Ringo": "Drums",
}
jobs = dict(  # あんまりこっちの書き方はしないかな。。
    John="Guitar",
    Paul="Guitar",
    George="Bass",
    Ringo="Drums",
)
```

辞書の注意点として、 **要素の順番は保持されません！！！**
例では`John` `Paul` `George` `Ringo`の順番で要素が定義されていますが、実行結果を見てみると出力される順番が変わっていると思います。


# for文の書き方

`for文`も`if文`と同じように`()`が無く、`{}`の代わりに`インデント`でスコープを表現し、最後に`: (コロン)`をつける必要があります。

Pythonの`for文`はPHPの`foreach文`に近いです。
`for($i = 0; $i < 10; $i++)`の様な所謂普通の`for文`はありません。
「どうしても書きたいよー」って場合は以下の様な感じになるかな。

```py
for index in range(0, 10):
    print(index)
```

## リストをfor文で回す場合の注意点

`リスト`を`for文`で回した場合、そのままだと`要素`が返ってきてしまい、`要素番号（添字）`が取れません。

```py
names = ["John", "Paul", "George", "Ringo"]
for name in names:
    print(name)
```

`要素番号（添字）`も一緒に取りたい場合は`enumerate関数`を使用します。

```py
names = ["John", "Paul", "George", "Ringo"]
for index, name in enumerate(names)):
    print("{}: {}".format(index, names[index])
```

## 辞書をfor文で回す場合の注意点

`辞書`を`for文`で回す場合、`要素`ではなく`キー（添字）`が取れてしまいます。。

```py
jobs = {
    "John": "Guitar",
    "Paul": "Guitar",
    "George": "Bass",
    "Ringo": "Drums",
}
for name in jobs:
    print(name)
```

`要素`と`キー（添字）`両方を取得する場合は`itemsメソッド`を使用します。

```py
jobs = {
    "John": "Guitar",
    "Paul": "Guitar",
    "George": "Bass",
    "Ringo": "Drums",
}
for name, job in jobs.items():
    print("{}: {}".format(name, job))
```

ちょっとややこしいですね。。


# 細々とした相違点

こまかい所だけど、とっても重要な所のお話。

## nullじゃなくてNone

PHPでいう所の`null`は、Pythonでは`None`と書きます。
頭文字は`大文字`なので注意してね。

## trueじゃなくてTrue、falseじゃなくてFalse

言葉は一緒だけど、頭文字が`大文字`になります。
気をつけましょうね。

## !じゃなくてnot

`if文`とかでよく使う打ち消しの`!`あるじゃないっすか。
Pythonだと`not`になるのでご注意を。

```py
if not result:
    print('Failed.')
```

ただし、`!=`はそのままです。

```py
if result != True:
    print('Failed.')
```


# まとめ

色々と説明し足りないものがありますが、ひとまずこんな感じで。。
次は[関数のお話](http://qiita.com/odoku/items/e1faf1cb8de324ad1608)をしまーす。