Be a Pythonista ! その1

最初に…

VTuber七夜聖りあらさんとメンターの皆さんがPythonを学習する上で、
少しでもお役に立てれば幸いです。
要望等があれば逐次対応しますので、遠慮なく。

例えば…

  • わかりにくいよ!

  • 具体例もっと書いて!

  • そもそも記事の構成が悪い!(もの書きが仕事じゃないので許して笑)

  • コードスタイルがクソだぞ、げるすら!(気を付けて書きます笑)

なんでもどうぞ!


目次



なんだかんだ環境構築が一番面倒

初学者にとって最も難しくて面倒なのは、環境構築だと思っています。
げるすらも慣れない言語だと困ることがあります。

そこで、最初は面倒な工程は一旦飛ばしてしまいましょう!


面倒は省いて、とにかく書こう

Pythonの標準的な実行環境を導入したサイトを作っておきました。
初歩程度なら十分動きますので、良ければ活用してください。

目先はこのサイトで動かすことを前提にします。
最終的にはちゃんとした環境を導入しますので、ご心配なく。

サイトの使い方はシンプル!

アクセスしたらこんな画面が開きます。

以下のように、入力欄にPythonのコードを書き込みます。

Shiftキーを押しながらEnterキーを押すと、コードが実行されます。
実行結果は入力欄の下に表示されます。

Enterキーだけを押すと、コードを改行できます。

サイトの使い方はこれだけです。
簡単ですよね!?

他にも、Paiza IOという無料サービスもありますので、そちらでもOKです。


そして、とにかく動かそう

動きのないコードを見てても退屈なだけなので、
とにかく書いて、動かしてみましょう。

既にサイト説明でもちょっと書きましたが、
プログラムのキホンのキ、HelloWorldから始めましょう。


print文

キホンのキ、print

まずは以下のコードを書きます。

print('Hello World')

と書きましょう。
書いたら、Shift + Enterで実行しましょう!

図1

図1の結果が得られたと思います。

では、コードの内容を変えて実行してみましょう。

print('Who is that very pretty girl ?')

このように書き換えるとどうなるでしょうか?
実行して確認しましょう!

図2

図2のように、出力結果が変わりましたね?

今実行したのが「print文」です。

print(出力したい文字)

print文は上記の構成になっています。
出力したい文字」の部分に入れた文字が一行で出力されるコードです。


複数行でprintしたいぞ?

では、複数行で出力したい場合はどうすればよいでしょうか?
やり方は複数あります。

その1

print('Who is that very pretty girl ?')
print('She is Nayose Reala')

単純に複数回print文を実行すればよいです。

その2

print('Who is that very pretty girl ?', 'She is Nayose Reala', sep='\n')

print文の動作を変更する方法です。
詳しくは後程解説します。

その3

print('Who is that very pretty girl ?\nShe is Nayose Reala')

文字の中で改行を直接指示してしまう方法です。
これも後で解説します。

他にも方法はあるかもしれませんが、
げるすらがパッと例示できるのはこんなところでしょうか。
それぞれの実行結果は以下の通り。

その1実行結果
その2実行結果

その3に関してはげるすらのサイトでは正しく実行できないので、
Paiza IOでの結果を載せます。

その3実行結果

print文は、実は文字以外も出力できます
例えば、

print(1 + 1)

print()に計算式を入れました。
このように書いた場合、計算結果が出力されます。

計算式のprint文

他にも、いろんなものが出力できます。
print文に何かを渡せばとりあえず出力してくれるので、
最初はコードを書きながらprint文でコードの実行結果を
随時確認することをおすすめします!

ただし、以下の点には気をつけましょう。


print文が思ったように動かない!

print文に計算式を入れて、状況に応じて出力内容を変えたい!
なんてこと、割と普通にあります。
また、計算結果だけ出力するのも味気がないので、
「1 + 1 = 2」
みたいな形で式と答えをセットで出力したいことも多々あるでしょう。

しかし、文字の中に計算式を書いても意味がありません。

たとえば、以下のようなコードを書いて実行してみます。

print('Even math like 1+1 is hard for me to learn.')

上記のように、文字の中に「1 + 1」を入れても文字として処理されます。

1 + 1がそのまま出力されている!

この問題は一工夫すれば解決できるのですが、
その話は「変数」を使えるようになってからの方がいいと思うので、お楽しみに!

他にもprint文が思ったように動かないケースは多々あると思いますが、
そのうち解決できるようになってると思いますので、
今は、そういったこともあるのか~程度に留めておいてください。


さいごに

ここで書いたような初歩的なprint文だと、できることが限られていて
これ何に使うんだよ」って思うかもしれません。
ですが、使い方次第でprint文もいろんな表現が可能になります。
コツとテクを覚えればprint文だけでも奥が深いのです!
例えば、

import time


for i in range(101):
    print(f'\r{i} %', end='')
    time.sleep(0.1)

このコードを実行すると、改行無しで0%~100%が上書きで出力できます!
ほかにも、プログレスバーを表現したりすることだって可能なんです!

import time


for i in range(101):
    script = '*' * i + '-' * (100 - i)
    print(f'\r{script}', end='')
    time.sleep(0.1)

このコードだと、処理の進捗に応じて「*」と「ー」で
どの程度処理が進んでいるかを視覚的に表現することもできます!

もちろん、%表示とプログレスバーを組み合わせることもできます。

import time


for i in range(101):
    script = '*' * i + '-' * (100 - i)
    print(f'\r{script} {i} %', end='')
    time.sleep(0.1)

これで、プログレスバーの右側に%表示もされます。

長くなるので書きませんが、BINGOゲームなんかもprintで表現できます。

こんなこともできるって思うと、print文も面白いでしょ?
と思うげるすらなのでした。


まとめ(ゆるふぁい勢はここまで!)

この記事で一番覚えておいてほしいのは、
「print文の基本的な使い方」だけです。
理由も単純で、自分が書いたコードがどんな結果になったか確認できる
一番簡単な方法だからです。
print(○○) で ○○ が表示される
ぐらいの認識で今は全く問題ありません。
いろいろ書きましたが、上記太字以外でわからないところがあったら、
「はにゃ~?」でいいです笑
げるすらに聞いてもらっても全然構いません。

ゆるふぁいでいきましょ~!


やや真面目に解説(がちふぁい勢向け)

ここからはちょいとマニアックかもしれません。
気になったら読む程度でいいと思います。

print文にはどんな設定があるのでしょうか?
どうやって値を渡せばよいのでしょうか?
print文が受け取ることができる設定や値をひとつずつ見ていきましょう!


printの引数一覧

  • *values : 出力する値

  • sep : 区切り文字の設定

  • end : 出力が終わった際に自動入力する文字の設定

  • file : 出力先の設定

  • flush : 出力を実行するタイミングの設定


*values とは?

出力したい値のことです。
上記の引数一覧でvaluesだけに「*」がついているのには意味があります。
ここでは詳しく解説しませんが、簡単に言うのであれば、
何個でも値を受け付けますよ!」という意味だと思って問題ありません。
*」はそういう特別な機能を与える魔法の記号なのです。
他にも「**」なんて物もあります。
詳しくは、後々に解説する「関数」でのお楽しみです!

具体的に「*values」に値を渡すコードは以下の通りです。

print('She is Nayose Reala.')
print('She', 'is', 'Nayose', 'Reala.')

上記のコードだと、printに与えた値は全て*valuesの値として扱われます。
出力結果は二つとも同じで、以下の通りになります。

She is Nayose Reala.
She is Nayose Reala.

※げるすらサイトだとなぜかprintの挙動がおかしいです。
 この辺から解説内容とげるすらサイトの結果が異なることがありますが、
 気にしないでください・・・。めんご。
 げるすらが普段使っている開発環境でちゃんと出力確認してるので、
 書いている内容が正しいです。

上記のように、「print」などに複数の値を渡して機能させたいときは、
,(コンマ)」で区切ってあげると複数の値を渡すことができます。
「.(ピリオド)」ではないので注意しましょう!


sep とは?

*valuesに与えられた値をどの文字で区切るかの設定です。
初期設定は半角スペースになっています。
具体的に例を見た方が早いと思うので、いくつかコードを書きます。

print('She', 'is', 'Nayose', 'Reala.')
print('She', 'is', 'Nayose', 'Reala.', sep='/')
print('She', 'is', 'Nayose', 'Reala.', sep='%')
print('She', 'is', 'Nayose', 'Reala.', sep='!?!?')

それぞれの出力結果は以下の通りになります。

She is Nayose Reala.
She/is/Nayose/Reala.
She%is%Nayose%Reala.
She!?!?is!?!?Nayose!?!?Reala.

printのカッコの中に「sep=区切り文字」で設定できます。
4行目の設定のように、区切り文字は一文字である必要はありませんし、
一種類である必要もありません。
*valuesで与えられた値の間に差し込む文字だと認識して問題ありません。

ただし、以下のような値の渡し方だとすべての単語の間に区切り文字を差し込むことができません。

print('She', 'is Nayose Reala.', sep='///')
print('She is Nayose Reala.', sep='%%%')

出力結果は以下の通り。

She///is Nayose Reala.
She is Nayose Reala.

1行目は*valuesに「She」と「is Nayose Reala.」の二つしか値を与えていないので、「She」と「is Nayose Reala.」の間にしか区切り文字が入りません。

2行目は*valuesに値が「She is Nayose Reala.」の一つしか与えられていませんので、区切り文字が入りません。

注意しましょう!

また、区切り文字を何も入れたくない場合は、
sep=''
のように指定すると区切り文字は何も入りません。
例えば、

print('She', 'is', 'Nayose', 'Reala.', sep='')

とすると、

SheisNayoseReala.

となります。


end とは?

*valuesの値を全て出力した後に一度だけ付け加える文字です。
日本語の「」と同じようなものだと思ってください。
初期設定では改行コード「\n」が指定されています。
これまた具体例を書きましょう。

print('She', 'is', 'Nayose', 'Reala')
print('She', 'is', 'Nayose', 'Reala', end='.')

出力結果は以下の通り。

She is Nayose Reala
She is Nayose Reala.

2行目はendに「.(ピリオド)」を指定しているので、
文の終わりにピリオドを出力してくれています。

ただ、この文の終わりに改行を行っていない点には注意が必要です。
例えば、以下のようにコードを実行した場合、
意図しない出力をすることがあります。

print('She', 'is', 'Nayose', 'Reala', end='.')
print('She', 'is', 'Nayose', 'Reala')

結果は以下の通り。

She is Nayose Reala.She is Nayose Reala

改行の指示をしていないので、ピリオドの後にも出力が続いています。
これを防ぐためには、改行コードを含める必要があります。

print('She', 'is', 'Nayose', 'Reala', end='.\n')
print('She', 'is', 'Nayose', 'Reala')

end='.' から end='.\n' に変更しました。
このコードの結果は以下の通り。

She is Nayose Reala.
She is Nayose Reala

ちゃんと改行されていますね!

たった今追加した「\n」とは、改行を意味するおまじないです。

文字の中に「\n」を記入しても、その場所で改行されます。
「複数行でprintしたいぞ?」の「その3」で紹介した改行方法はこれです。

この「\」と「n」を組み合わせると強制で改行が実行されるところ、
非常に強力なおまじないですよね。
気をつけましょう!

文字の中に「\」を文字として含めたい場合は、
エスケープしたりrawを使ったりする必要がありますが、
それはまた別の機会に・・・。

逆に改行や文字を文末に入れたくないような場合には、
end=''
のように指定すれば出力後に何も付け加えられません。
sep='' の時と同じですね!


file とは?

printの結果をどこに出力するかの設定です。
初期設定では「sys.stdout」に設定されています。
sys.stdoutは、「コンソール」に表示することだと考えていいと思います。
fileを指定することでコンソール以外に出力するようにするということです。

具体的には以下の通りです。

with open('file.txt', 'w') as f:
    print('She', 'is', 'Nayose', 'Reala', end='.', file=f)

このように書けば、
「She is Nayose Reala.」
という文字をfile.txtに出力することができます。

ぶっちゃけ使いません笑

通常はテキストやCSVを作成する場合は以下のように書きます。

with open('file.txt', 'w') as f:
    f.write('She is Nayose Reala.')

たぶんこちらの方が一般的だと思います。

ここで使用した「with open() as f:」の部分は、別の機会に解説します!


flush とは?

print文を実行してから、実際に文字が出力される挙動を指定できます。
初期設定では「False」に設定されています。

ぶっちゃけ最初の方はこの設定が無くても困りません!

print文は本来、実行されてから直ちに出力されるわけではありません。
通常、多くのシステムで出力はバッファリングされています。
つまり、データを一時的にため込みます。
これは、頻繁に出力されるようなコードが実行された場合、
都度出力をしていると計算機への負荷が上がりパフォーマンス低下の
原因となるからです。
それを回避するために、バッファリングしたうえで一気に出力します。

flushとは、このバッファリングを無効にする設定です。
なので、
flush=True
と指定すると、バッファリングが無効になります。
ややこしいね!!!

もし出力が直ちに出力が実行される必要があるprint文であれば、

print('She', 'is', 'Nayose', 'Reala', flush=True)

とすればよいでしょう。
ちなみにげるすらはこの設定を過去に一度しか変更したことがありません。
つまり、ほぼ必要ありません笑
覚えておいて損はありませんが、優先順位は激下げでかまいません。


ざっくりまとめると?

  • printは「*values」「sep」「end」「file」「flush」を受け取る。

  • 「*values」は一つ以上の値を渡す必要がある。(printだからね!)

  • 「sep」と「end」は使い方次第で便利に出力できる。

  • 「file」は使い方次第ではあるが、一般には変更しないと思う。

  • 「flush」はほぼいらん子。

今回は、具体的にprintに対してどのように値を渡せばよいのか、
そのルールに関する部分はほとんど言及していません。
これについては、「関数」をやった時に説明した方がわかりやすいので、
少々お待ちください。

以上、長々と失礼しました。


次の記事

次の記事は変数です。
よければ見ていってください!

この記事が気に入ったらサポートをしてみませんか?