PHPしか知らない僕がPythonを少し触ってみたよ 〜変数と表示+α〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
pythonの基本はprint

この記事を三行にまとめると

行末にセミコロンはつけません
「print()」で画面への出力を行います
定数はないみたいです
今日からPythonについて怒涛(?)の更新が始まりまっせー。

今回は基本中の基本ってことで、変数の作り方や変数に入力した文字を画面に表示する方法などをPHPとPythonのそれぞれのやり方で見比べていきたいと思います。



変数の基本

一言で言えばPHPとPythonの変数の違いは先頭に「$」があるかどうかです。

//PHP
$v = '変数';

//Python
v = '変数'

だいぶ手抜きな変数名になってしまいましたね。まあvaliableの頭文字だとでも思ってください。

普段PHPだけじゃなくてjavascriptも書いてる人は「$」があってもなくてもそんな違和感はないと思います。ただしjavascriptと違って、Pythonは変数の先頭に「$」をつけるとエラーになります。言うまでもなくPHPは逆に「$」がないとエラーになるぞい。

//PHP
$v = '変数';//問題ない
v = '変数';//エラー

//Python
$v = '変数'//エラー
v = '変数'//問題ない

//javascript
$v = '変数';//問題ない
v = '変数';//問題ない

ところで上のコードを見ると、Pythonの時だけ行の最後にセミコロン(;)がついていないのが分かると思います。Pythonでは行末にセミコロンはつけません。つけてもエラーにはならないっぽいですけど。



文字を表示

じゃあ上の変数を画面に表示してみましょう。

//PHP
$v = '変数';
echo $v;

//Python
v = '変数'
print(v)

Pythonでは「print()」で画面への出力を行います。PHPにもprint()はあるので、そっち使ってる人にとっては何の違いもないですね。

違いがあるとすれば、Pythonのprint()は配列も出力できるところですかね。PHPだとエラーになってしまう。

//PHP
$v = '変数';
print($v);//「変数」が表示される

$a = array(1,2,3);
print($a);//「Array」が表示される

//Python
v = '変数'
print(v)//「変数」が表示される

a = [1,2,3]
print(a)//「[1,2,3]」が表示される

そう考えるとPythonのprint()はPHPで言うところのprint_r()の感覚に近いかもですね。

配列は別の機会にもうちょいしっかり触れたいと思うので、ここでは多くは語らないことにします。



連続で出力してみる

立て続けにechoやprint()を記述した場合、PHPとPythonでは出力結果がちょい異なります。

//PHP
echo 'aaa';
echo 'bbb';
echo 'ccc';

//出力結果
aaabbbccc

//Python
print('aaa')
print('bbb')
print('ccc')

//出力結果
aaa
bbb
ccc

PHPは一行にまとめて表示されるのに対してPythonは改行して表示されます。何で改行されるのかは後ほど。



コンマで区切る

連続でprint()を書かずとも、コンマ区切りでまとめて表示することができます。これはPHPもPythonも書き方は一緒ですが、出力結果がやっぱり微妙に違います。

//PHP
echo 'aaa','bbb','ccc';

//出力結果
aaabbbccc

//Python
print('aaa','bbb','ccc')

//出力結果
aaa bbb ccc

PHPはそのまま表示されるのに対し、Phtyonの方はスペースが入ります。もしこのスペースを消したければ、「sep」というオプションに空文字を指定することで実現できます。

print('aaa','bbb','ccc',sep = '')

//出力結果
aaabbbccc

「sep」の部分をうっかりコーテーションで囲わないように注意です。

空文字やスペースに限らず、このsepを使えば自由にセパレータを設定できます。

//aaa,bbb,ccc
print('aaa','bbb','ccc',sep = ',')

//aaa-bbb-ccc
print('aaa','bbb','ccc',sep = '-')

ついでに、Pythonのprint()はsep以外にendというオプションもあります。文字列の最後に表示する文字を指定できます。

//aaa,bbb,ccc.
print('aaa','bbb','ccc',sep = ',',end = '.')

//aaaとbbbとcccです
print('aaa','bbb','ccc',sep = 'と',end = 'です')

配列じゃなくてもimplodeできちゃうようなイメージですかね。この辺はPHPのechoやprint()よりも使い勝手が良いかもしれない。

ちなみにsepは初期値がスペースでendは初期値が改行コードです。なのでsepやendを省略すると文字列の間にスペースが入るし、連続でprint()を書いた場合には改行されるってわけです。

print('aaa',end = '')
print('bbb',end = '')
print('ccc',end = '')

//出力結果
aaabbbccc

こうすれば改行されない。



変数展開

例えばPHPの場合だと、ダブルコーテーションの中であれば変数をそのまま変数として扱うことができます。

$v1 = 'あかつき';
$v2 = 'お宿';
echo '{$V1}の{$v2}';//「{$v1}の{$v2}」が表示される
echo "{$v1}の{$v2}";//「あかつきのお宿」が表示される

でもどうやらPythonはシングルでもダブルでも変数を変数のまま扱うことはできないっぽいです。もしこれを似たようなことをやりたい場合は、「format()」ってやつを使わないとダメみたいです。

v1 = 'あかつき'
v2 = 'お宿'
print('{0}の{1}'.format(v1, v2))

{}の中は数字でないとエラーになります。配列のインデックスみたいな感覚ですかね。数字が0ならformat()の第一引数、1なら第二引数って感じです。コーテーションはシングルでもダブルでもオッケーです。

v1 = 'あかつき'
v2 = 'お宿'
print('{1}の{0}'.format(v1, v2))

もしこんな風に1と0の順番を入れ替えれば表示される内容は「お宿のあかつき」になります。PHPの「{$v2}の{$v1}」と同じ動きですね。

当然ながら引数の存在しない数字を入れたらエラーになります。

v1 = 'あかつき'
v2 = 'お宿'
print('{1}の{2}'.format(v1, v2))

この場合は三番目の引数({2}の方)がないぞってエラーになる。

数字だと対応する箇所が自動的に0から振られていきますが、数字以外の文字を使って明示的に対応させることも可能です。

print('{v1}の{v2}'.format(v1 = 'あかつき', v2 = 'お宿'))

これだとv1がどこにあっても「あかつき」になるし、v2がどこにあっても「お宿」になる。



変数名に変数の値を使う

もしも変数名に変数の値を使いたい場合。PHPだとわりと簡単にできます。

$v = 'hensu';
${$v} = '変数';
echo $hensu;

//出力結果
変数

これと同じようなことをPythonでもやりたいってなると、ちょい工夫が必要です。

v = 'hensu'
exec('%s = "変数"' % v)
print(hensu)

exec()っていうのは文字列をコードとして扱う関数です。PHPにもexec()はありますが、あっちはコマンドを実行する関数なのでちょい違いますね(ちょっとどころではないか?)。これも今はあまり説明しません。

「%」ってのはPHPのsprintf()みたいなもんです。

//PHP
$v = 'あかつきの%s';
echo sprintf($v, 'お宿');

//Python
v = 'あかつきの%s'
print(v % 'お宿')

やってることは一緒です。先ほどのexec()の場合だと「%s」の部分が「hensu」に置換されることで、「hensu = “変数”」というコードになるって感じです。

まあ……どうしてもやらざるを得ないって状況でもない限り、このやり方はあまり採用しない方が良いんじゃないかな〜という気がしなくもないです。めんどいしね。



おまけ

コメントアウトは「#」を使います。

//PHP
// $v = '変数';

//Python
# v = '変数'

複数行をまとめてコメントアウトする時はシングルコーテーションを三つ並べる。

//PHP
/*
$v = '変数';
echo $v;
*/

//Python
'''
v = '変数'
print(v)
'''



それからPythonには定数はないみたいです。PHPと同じ感覚でいくなら、定数っぽい書き方で変数を作るようになりますかね。

//PHP
define('DOMAIN_NAME', 'norm-nois.com');
DOMAIN_NAME = 'google.co.jp';//エラー

//Python
DOMAIN_NAME = 'norm-nois.com'
DOMAIN_NAME = 'google.co.jp'
print(DOMAIN_NAME)//「google.co.jp」が表示される

あくまでも定数っぽく書いてるだけの変数なので上書きはできちゃいます。






うーん、どうでしょうか。基本の基本はこんなもんかなと思うのですが、もうちょい検証しといた方が良いことあるかな?

今回は特に気にしませんでしたが、気をつけといた方が良い点として、型は意識しといた方が良いかもです。int型とかstring型とかの型です。PHPだと型に関しては五年くらいはき古したパンツのゴム紐くらいゆるいんで、同じ感覚でPythonのコードを書いてると、型が違うぜ的なエラーに意外とやられるなと思いました。その辺もいずれもうちょいつっこんでいこうと思います。

ではまた次回もこのチャンネルでお会いしやしょう!



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください