PHPとPythonの書き方の違いを10問の問題で比べてみた

2020/10/27
新入社員のSです。
先月から、初めてPythonの実装に携わらせていただくことになりました。
入社当初、PHPのお勉強として上司の皆様に問題を作っていただいていたので、
その問題をPythonでも解いてみました!
(※python3で記載しています)

■問題1

for文を使って、整数1〜10を出力してください。

# PHP
for ($i = 1; $i <= 10 ; $i++) {
    echo $i;
}

# Python
for i in range(1, 11):
    print(i)

PHP:$i に1〜10の範囲を指定
Python:range()関数で、1〜10の範囲を指定

■問題2

for文とif文を使って、1〜100の範囲で、偶数のみを全て出力してください。

# PHP
for ($i = 1; $i <= 100; $i++) {
   if ($i % 2 == 0) {
      echo $i;
}

# Python
for i in range(1, 101):
   if i % 2 == 0:
      print(i)

■問題3

while文で、整数0〜10を出力してください。

# PHP
$i = 0;
while ($i <= 10) {
   echo $i++;
}

# Python
i = 0
while i <= 10:
   print(i)
   i += 1

PHP:++、--でインクリメント、デクリメントの指定ができる
Python:++、--は使用できない

■問題4

生徒がA~Eまで5人いて、それぞれ身長(height)と体重(weight)があります。
これをひとつの(PHP)連想配列、(Python)辞書型にまとめてください(名前、身長、体重)。
A 150cm 50kg
B 151cm 51kg
C 152cm 52kg
D 153cm 53kg
E 154cm 54kg

# PHP
$students = array(
    'A' => array('height' => 150, 'weight' => 50),
    'B' => array('height' => 151, 'weight' => 51),
    'C' => array('height' => 152, 'weight' => 52),
    'D' => array('height' => 153, 'weight' => 53),
    'E' => array('height' => 154, 'weight' => 54)
);

# Python
students = {
    'A': {'height': 150,  'weight': 50},
    'B': {'height': 151,  'weight': 51},
    'C': {'height': 152,  'weight': 52},
    'D': {'height': 153,  'weight': 53},
    'E': {'height': 154,  'weight': 54}
}

PHP:array() または [] で連想配列、配列を宣言
Python:配列は [] 、辞書型は {} で宣言

■問題5

問題4で作成したものを以下のように出力してください。
Aさん 150cm 50kg
Bさん 151cm 51kg

# PHP
foreach ($students as $name => $details) {
    echo $name . 'さん ' . $details['height'] . 'cm ' . $details['weight'] . 'kg<br>';
}

# Python
for name, details in students.items():
    print(name + 'さん ' + str(details['height']) + 'cm ' + str(details['weight']) + 'kg')

PHP:以下のように foreachで、キー名と値を参照
foreach (連想配列 as (連想配列の)キー名 => (連想配列の)値){
 実行処理文
}
Python:以下のようにforと items() で、キー名と値を参照
for キー名, 値 in 辞書.items():
  実行処理

■問題6

100, 101, 102, 103, 104の要素を持つ配列を用意し、
その配列を結合し、以下のように1行の文字列として出力してください。
100,101,102,103,104

# PHP
$list_num = array(100, 101, 102, 103, 104);
$str_num = implode(',', $list_num);
echo $str_num;

# Python
num_list = [100, 101, 102, 103, 104]
map_num_list = map(str, num_list)
str_num = ','.join(map_num_list)
print(str_num)

PHP:implode() 関数で配列要素を文字列で結合。
Python:要素に数値が含まれる場合、join() 関数で要素の結合をしようとすると TypeError 例外が発生する。
そのため、map() 関数を使用して数値を文字列にしてからjoin() 関数で結合。

■問題7

文字列 'aaa,bbb,ccc,ddd,eee' を用意し、
用意した文字列をカンマ区切りで配列に変換した後、全ての要素を出力してください。

# PHP
$alphabet_str = 'aaa,bbb,ccc,ddd,eee';
$alphabet_list = explode(',',$alphabet_str);
foreach ($alphabet_list as $alphabet) {
    echo $alphabet;
}

# Python
alphabet_str = 'aaa,bbb,ccc,ddd,eee'
alphabet_list = alphabet_str.split(',')
for alphabet in alphabet_list:
    print(alphabet)

PHP:explode() 関数で文字列を配列に変換
Python:split() 関数で文字列を配列に変換

■問題8

りんご, ぶどう, みかん の要素を持つ配列を用意し、全ての要素をwhile文を使用して出力してください。

# PHP
$fruit_list = array('りんご', 'ぶどう', 'みかん');
$flag = 0;
while ($flag < count($fruit_list)){
    echo $fruit_list[$flag];
    $flag++;
}

# Python
fruit_list = ['りんご', 'ぶどう', 'みかん']
flag = 0
while flag < len(fruit_list):
    print(fruit_list[flag])
    flag += 1

PHP:配列内の要素の数を count() 関数でカウント
Python:配列内の要素の数を len() 関数でカウント

■問題9

以下の文字列の配列を用意し、
・配列mark_list (Spade, Heart, Clover, Diamond)
・配列number_list (A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)
配列markと配列numberを組み合わせて、52枚のトランプカードの配列を作ってください。

# PHP
$mark_list = array('Spade', 'Heart', 'Clover', 'Diamond');
$number_list = array('A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K');
$trump = [];
foreach ($mark_list as $mark) {
    foreach ($number_list as $number) {
        $trump[] = $mark . ' - ' . $number;
    }
}

# Python
mark_list = ['Spade', 'Heart', 'Clover', 'Diamond']
number_list = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
trump = []
for mark in mark_list:
    for number in number_list:
        trump.append(mark + ' - ' + number)

■問題10

問題13で作った配列 trump からランダムに5つの要素を取り出して、 以下のように出力してください
Spage - A
Heart - K
Diamond - J
Clover - Q
Spade - 10

# PHP
$randam_num_list = array_rand($trump, 5);
foreach ($randam_num_list as $num) {
    echo $trump[$num] . '<br>';
}

# Python
import random
random_trump_list = random.sample(trump, 5)
for random_trump in random_trump_list:
    print(random_trump)

PHP:array_rand()関数を使用。ランダムに選ばれたキーが返される
Python:randomモジュールをimportし、sample()関数を使用、
sample()関数はランダムに選ばれた要素のリストが返される(重複なし)。

まとめ

Pythonは、「$」 「;」 などが不要で、for文やif文はインデントで処理が判断されている事でコードが見やすい印象でした。
PHPはプログラムの文脈に応じて自動で型を変換して処理をしてくれるところがありますが、
PythonはPHPと比べると少し型に厳しいという違いもありました。