2. 始めの一歩: Hello World!

ブライアン・カーニハンとデニス・リッチーによる著書「プログラミング言語C」(1978年)以来、プログラミング言語の最初の例として、文字列“Hello, World!”を画面に印刷するプログラムがよく使われています。この習慣に迎合して、ここでもPython版のHelloWorldプログラムの一例を示します。

2.1. 最初のバージョン

Python はインタプリタ型言語なので、端末からプログラムを一行づつ入力して動作を確認することができます。

% python3
Python 3.9.4 (v3.9.4:1f2e3088f3, Apr  4 2021, 12:32:44)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print ("Hello, World!")
Hello, World!

端末でpython3コマンドを実行すると、python3の入力プロンプト>>>が表示されます。

ここでprint("Hello, World!")を入力してEnterキーを押せば、端末に文字列 “Hello, World!”が表示されます。

%%bash
python3
print ("Hello World!")
Hello World!
%%python3
print ("Hello, World!")
Hello, World!

が、ここでは繰り返し何度も使えるプログラムとしてのHelloWorldプログラムをご覧いただきます。

2.2. Pythonプログラム:hello.py を用意する

作成したプログラムを繰り返し何度も使うために, プログラムはファイルに保存した形で用意します。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# save this as hello.py
# 行中の#以降は行末までコメントとなる(Python プログラムの実行に影響しない)

def Hello():
    print("Hello, World!")
    return

if __name__ == "__main__":
    Hello()
Hello, World!

この様にPythonの中で関数hello()を定義することで、同じ動作を少ない手順で実行することができるようになります。 (Python)プログラムの作成では、問題に応じて解決のための手順を分解/整理して関数やクラス (クラスについては後々説明します)の形で まとめておくということが大切です。

Jupyterlab, VSC, emacsなどのプログラム開発支援機能のあるエディタでは、プログラムの実行結果をそれらの環境の中で確認することができます。具体的な手順についてはそれぞれの開発環境のマニュアルをご覧ください。近くに同じ環境をお使いの方がいらっしゃれば、 その方に聞いてみるのも良い方法です。 質問の際には、疑問点が具体的にわかるように事前に質問を整理しておくと良いでしょう。

2.2.1. hello.pyの中身

このプログラムの中心部分はdef Hello():で始まる三行のプログラムです。 この三行のプログラムによって、関数 Hello()定義しています。

def Hello():               # 関数の定義を宣言
    print("Hello, World!") # 関数の本体、インデントに注意
    return                 # 関数呼び出しの終了

これらの行を一行づつ説明していきます。

2.2.2. 関数の宣言

def hello():

まず、def Hello():で関数名がHelloという関数を定義することを宣言しています。

次の、()はこの関数には引数がないことを示しています。

:はこの後に関数の本体が続くことを示しています。

2.2.3. 関数の本体

    print("Hello, World!")

次の行がプログラムの本体です。

python3ではprintは(文ではなく)関数です。 引数に与えられたデータを文字列として、端末に表示します。

このprint("Hello, World!")が行頭から始まっていない、つまりインデントされている、ことがPythonの特徴です。 C/C++では{}を使って一連のプログラム文が一つの単位(ブロック、スイート)となっていることを示しますが、Pythonではこのブロック構造を行のインデントを使って表現します。(C/C++などでは、プログラムの読みやすさのためにブロック構造をインデントさせて表示することが普通ですが、Pythonではこのような読みやすさのためのインデントをプログラム言語の仕様に含んでしまったというところです。)

2.2.4. 関数呼び出しの終了

    return                 # 関数呼び出しの終了

次のreturn文はこの行が実行されると関数呼び出しが終了し、関数を呼び出したところからプログラムの実行が継続されます。 このreturn文もインデントされていますので、hello()関数本体のブロックに含まれています。

2.2.5. 関数の呼び出し

if __name__ == "__main__":
    Hello()
Hello, World!

続く二行のプログラムは、ファイルにpythonプログラムを保存する際に使われるイディオムです。 (なぜこうするのか?は後で説明します。)

  • if文は、文中の条件(ここでは__name__ == "__main__")が満足された時、

  • if文の本体(インデントで区別された一連のプログラム文, ここではHello())を実行します。

if文の文末は:で、実行すべきブロックがインデントされていることに注意しましょう。

__name__はPythonシステムが利用する変数で、name属性はモジュールの完全修飾名に設定されなければなりません。 となっています。 pythonプログラムがpython3コマンドから起動されたとき(後述)は“main”に設定されるという約束になっています。

if __name__ == "__main__":は、%python3 Hello.pyのように,コマンドラインからこのプログラムが実行された時、 続くコードブロック(:があり、続く行がインデントされていることにご注意ください。)を実行することを意味していいます。 ここでのコードブロックの中身はHello() の一行だけです。 Hello()が実行されると、その前に定義したHello関数の定義に従って、print("Hello, World!") が実行されて端末に “Hello, World!”が表示されると言うわけです。

この簡単なプログラムでは必要ないとも言えるのですが、今後pythonの実用的なプログラムを書いていく上では、このように関数定義と、実際の実行部分を分離しておくことで開発の効率が良くなります。ぜひ習慣化してください。

なお、このプログラムの最初の二行はUnix系の流儀で、このファイルの中身が“python3”のプログラムであること(#!python3)。 また、このファイルの文字はユニコード(”utf-8")であること(# -*- coding: utf-8 -*-)を宣言しています。これも習慣として書いておくようにしましょう。  なおpythonのプログラムでは 行中の#から行末まではコメントとして取り扱われ、プログラムの実行には影響しません。

### ここまでのまとめ

  • python プログラムの作成では関数を定義していく。

  • 関数の定義はdef文を使う。

  • 条件判断は if文を使う。

  • def文、if文の中身のプログラムは、行頭をインデントする

3. プログラムの実行

作成したプログラムをhello.py という名前のファイルに保存します。 このプログラムを実行するにはいくつかの方法があります。

3.1. コマンドラインからの実行

第一の方法は、シェルのコマンドプロプトからpytho3(or py -3)コマンドを使って実行する方法です。

ファイルhello.pyを保存したディレクトリで、

% python3 hello.py

を実行しますと、

% python3 hello.py
Hello, World!

のように、端末に文字列が印刷されます。

このように動作するのは、hello.pyにif __name__ == "__main__":以下のプログラムを書きこんだことによるものです。

jupyter/jupyterlabをお使いの方は、Code 入力セルにプログラムを入力したら、Shift+Enterを押してみましょう。

もしエラーがでても心配しないでください。まずは以下の解説をお読みください。

jupyterlabではセルマジック %%bashを使うことで、シェルコマンドの入力結果を文書の中に取り入れることができます。

%%bash
python3 hello.py
Hello, World!

端末から同じプログラムを起動する別の方法もあります。

%%bash
python3 -m hello
Hello, World!

-m のパラメータにはpython モジュール名を指定します。 .pyがついていないことにご注意ください。

3.2. シェルスクリプトとしての実行

Linuxやmacosでは作成したpythonプログラムをシェルコマンドとして実行することもできます。

%%bash
chmod +x hello.py
./hello.py
Hello, World!

chmod +x hello.py は作成したPythonプログラムファイルをシェルコマンドとして実行可能とするためのおまじないです。

hello.pyの冒頭に

#!/usr/bin/env python3

があることも必要です。

pythonプログラムを実行可能ファイルとすることは、セキュリティホールになる可能性もありますので、慎重に行いましょう。

pythonプログラムをシェルスクリプトとして使う場合には、sysモジュールのsys.exit()関数でプログラムが異常に終了した場合、呼び出したshellにエラーを返すことができます。

3.3. pythonモジュール内の関数としての実行

こうして作ったプログラムを別のPythonプログラムとして組み合わせて使うことも 可能です。

% python3
python3
Python 3.9.6 (v3.9.6:db3ff76da1, Jun 28 2021, 11:49:53)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
import hello
>>> hello.hello()
hello.hello()
Hello, World!

別のPythonプログラムでHelloWorld.pyの中のhello()関数を使うために、 まずHelloWorldプログラムをPythonモジュールとしてimport します。

import HelloWorld

この時、HelloWorld.pyif __name__ == "__main__":の中身は実行されないことに注意してください。

importしたHelloWorldモジュール中のhello()関数の実行は次のように記述します。 つまりモジュール名HelloWorldと関数名hello.で繋いだ名前で、 HelloWorldモジュール中のhello()関数を指定します。

HelloWorld.hello()
Hello, World!
'Welcome to the World.'

Pythonプログラム中の関数として実行した時には、関数が返した値も表示しているのに注意しましょう。

%%python3
import HelloWorld

print(HelloWorld.hello())
Hello, World!
Welcome to the World.

3.4. プログラムの実行(jupyterあるいはjupyterlab)

jupyterあるいはjupyterlabでこの解説をご覧の方は、次のコードブロック(セル)を選択して、 shift+Enter キーを押してみてください。 出力のHello World!が更新されたのがお分かりでしょうか?

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# save this as HelloWorld.py
#
"""
Python 入門講座 第2回の例題プログラム
"""

_DEFALUT_RETURN_VALUE="Welcome to the World."
__DEFALUT_MSG="Hello, World!"

#デフォルトの値が"Hello, World!"である引数 msg をもつ関数 helloを定義する。
def hello(msg:str=__DEFALUT_MSG)->str:
    """
    引数 msg(省略時の値は"Hello, World") を端末に出力し、
    "Welcome to the world。"を値として返す。
    """
    print(msg)
    #関数の戻り値として""Welcome to the World."を返す。
    return _DEFALUT_RETURN_VALUE

def test():
    help(hello)
    reply=hello()
    print(reply)

if __name__ == "__main__":
    test()
Help on function hello in module __main__:

hello(msg: str = 'Hello, World!') -> str
    引数 msg(省略時の値は"Hello, World") を端末に出力し、
    "Welcome to the world。"を値として返す。

Hello, World!
Welcome to the World.

3.5. プログラムの実行:まとめ

  • コマンドラインとして: `python3 hello.py`

  • シェルスクリプト として: `./hello.py`

  • (別の)python プログラム中で : import hello; hello.hello

  • python モジュールとしてコマンドラインから: python3 -m hello

  • 開発環境のエディタの中で実行する。 : 開発環境に依存します。

4. 変数名/関数名について

プログラムで使われる色々な名前(変数名、関数名、クラス名、モジュール名、..)は識別子と呼ばれます。 識別子は、これから説明するに従っていれば自由につけることができます。

とはいうものの、 後でプログラムを再読したときに、それらの識別子がさすものの意味がわかるように名前をつけましょう。

4.1. 識別子に使える文字

識別子はざっくり言って、

- 識別子の最初の文字は、大小のアルファベット(a-zA-Z), あるいはアンダースコア(’_’) が許される。 - それ以降は、それに加えて数字(0-9)も使用可能 - 長さには制限はない。 - 大文字小文字は区別される - pythonの予約語ではないこと

というルールに従います。

例えば、

 x y address my_name a0 a1

などはいずれも有効な名前(識別子)です。

4.2. Unicode文字の利用

Python3ではさらに unicode文字 も使えます。 識別子として使えるunicode文字の範囲については、Language Referenceマニュアルをご覧ください。

ということで、こんなプログラムを書くこともできます。

#!python3
# -*- coding: utf-8 -*-

def 挨拶():
    print("Hello, World!")
    返事= "ようこそ,いらっしゃいませ。"
    return 返事

if __name__ == "__main__":
    挨拶()
Hello, World!
挨拶()
Hello, World!
'ようこそ,いらっしゃいませ。'

とはいえ、これをお薦めしているわけではありません。

4.2.1. 予約語

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

これらの識別子はPythonで予約されているため、 ユーザーが定義する、関数/変数/クラス/モジュール名などに使うことはできません。

これらの予約語はPythonの固有の単語ということですから、この35個の予約語の使い方をマスターすれば、どんなPythonプログラムを読みこなすことが可能です(原理的には)。 簡単でしょう?😁

蛇足ですが、予約語の他にも記号 「~!@#%^&*()-+/={}[]|:;"’<>., 」の使い方も学習する必要があります。

4.2.2. 予約後語の分類

  • 定数

    • False None True

  • 論理演算

    • and not or in is

  • 実行制御

    • if elif else while for

    • break continue pass return yield

  • ライブラリ

    • import from as

  • 非同期処理

    • async await

  • 例外処理

    • try except finally raise

  • 宣言/定義

    • class def del global nonlocal

  • その他

    • lambda: ラムダ式

    • assert: デバッグ用

    • with :コンテキストマネージャ

4.2.3. ちょっと寄り道

python3ではprintは関数名であって、予約語でもありません。だからこんなこともできてしまいます。

印刷=print
印刷("イロハ")
印刷=挨拶
印刷()
print('ABC')
印刷=print
イロハ
Hello, World!
ABC

4.3. 文字列定数について

Pythonでの文字列定数(リテラル文字列)の記法には2種類あります。

  • 一組の引用符で挟まれた文字列定数( 「“…”」 あるは「‘…’」)

  • 一組の3連引用符で挟まれた文字列定数(「""“…”""」 あるは「’’’…’’’」)

後者は中身の文字列に改行を拭くんでいても良い、すなわち中身の文字列が複数行にまたがっていてもよいというところです。

なお、Pythonの文字列はC言語のそれと異なりシングルクォート「’」を使った文字列とダブルクォート「”」を使った文字列に意味的な違いはありません。

また、Pythonの文字列はUnicodeの文字の並びです。C言語の文字列に相当するものは、bytesあるいはbytearrayです。(いずれまた、しょうさい

文字列については、次回以降の講座でより詳しく説明します。

4.4. docstringを使おう。

ファイルの冒頭、関数定義の冒頭に置かれた文字列データはdocstringと呼ばれます。 コメントは後々プログラムを*読む*際に役立ちますが、docstringはそのプログラム/関数を利用する際に役立ちます。 help()関数を実行することで、docstringの中身が端末等に出力されます。

#!python3
# -*- coding: utf-8 -*-
# save this as HelloWorld.py
#
"""
Python 入門講座 第2回の例題プログラム
"""

_DEFALUT_RETURN_VALUE="Welcome to the World."
__DEFALUT_MSG="Hello, World!"

def hello(msg:str=__DEFALUT_MSG)->str:
    """
    引数 msg(省略時の値は"Hello, World") を端末に出力し、
    "Welcome to the world。"を値として返す。
    """
    print(msg)
    return _DEFALUT_RETURN_VALUE

def test():
    help(hello)
    reply=hello()
    print(reply)

if __name__ == "__main__":
    test()
Help on function hello in module __main__:

hello(msg: str = 'Hello, World!') -> str
    引数 msg(省略時の値は"Hello, World") を端末に出力し、
    "Welcome to the world。"を値として返す。

Hello, World!
Welcome to the World.

4.5. まとめ


  • 関数定義には def <関数名> (<引数のリスト>): の構文を使う。

  • 行末の“:”は インデントされたコードブロックが続く事を示している。

  • 関数の本体は インデントされたpythonの文の集合となる。

  • #から行末まではコメントとなる

  • if 文はif <条件> :の構文を使う。

  • <条件>の論理式としての値がFalseでないとき、続くコードブロックが実行される。


プログラム言語学習の定番である“Hello World!”プログラムのpython版を例に、pythonでのプログラムの最初の一歩をご紹介しました。 Pythonでは「プログラムのブロック構造をインデントで表現する」と言う手法をとっています。これはその他のプログラム言語との大きな違いとなっており、他のプログラム言語を習得済みの方は特に、戸惑うところかもしれません。 Pythonでのプログラム開発をサポートしてくれる エディタなどを使うことで、この点は軽減することができるでしょう。

さて、hello.pyを作成して実行してみたが、エラーメッセージが出てしまった方は、上記の解説と端末にあらわれたエラ〜メッセージを読み解いて、プログラムを修正してみてください。 また、エラーなく実行できた方は、 表示する文字列を変えてみて、実行してみましょう。

さあ、無事に最初の一歩は踏み出せたでしょうか? 次はどこに向かいましょうか?

蛇足:

import thisのZenと合わせてYodaに帰せられるとされる次の格言も覚えておきましょう。

Yoda:.. If once you start down the dark path, forever will it dominate your destiny, consume you it will.

Yoda: You will know. When your code you try to read six months from now.

4.6. おまけ:名前も印刷してみよう

出力するメッセージに、メッセージの受け手の名前も加えてみましょう。

引数としてメッセージの受けての名前を受け付ける、新しい関数  HelloTo を定義してみましょう。

"""
引数をもつ関数の定義の例
単独のスクリプトして実行された時には、標準のモジュールgetpassを使ってユーザの名前を取り出して使う。
"""
def HelloTo(name:str)->bool:
    """
    引数nameに与えられた名前の文字列を使って、グリーティング メッセージを端末に表示する。
    """
    print("Hello {}!".format(name))
    print("Welcome to the Python world!!")
    return True

import getpass # getpass モジュールを import = モジュールの提供する関数などを使えるようにする。

def main():
    username=getpass.getuser() # getpassモジュールのgetuser()関数を使って、usernameを取得する。
    HelloTo(username)

if __name__ == "__main__":
    main()
Hello noboru!
Welcome to the Python world!!

関数の引数に値を与えて実行して見ます。

HelloTo("Albert")
HelloTo(name="Einstein")
main()
Hello Albert! Welcome to the Python world!!
Hello Einstein! Welcome to the Python world!!
Hello noboru! Welcome to the Python world!!

4.6.1. 文字列データのFormat(整形)

print()関数は複数の引数を受け取った時、渡されたデータ型に応じて整形した文字列を端末に出力します。

出力される文字列をより細かく制御するためには文字列データの.formatメソッドを使います。

(Python2との互換性のために、別の方法(""%)もサポートされていますが、 .format メソッドがpython3での標準的な方法です。)

print("Hello {}!".format(name))

4.6.2. エスケープ文字列

文字列定数中に改行コードなどを挿入するには、C言語と同じように、エスケープ文字\をつかったエスケープ文字定数を使います。

  • 改行->\n, タブ -> \t, ベル->\a,

  • 八進数-> \012,  十六進数-> \x0a ,

  • 一重引用符 (’)-> \', 二重引用符 (")-> \", エスケープ文字-> \\

4.7. 101回のプロボーズ

def propose(name):
    print("I love you,{}. Will you marry me?".format(name))

for i in range(101):
    propose("薫")
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?
I love you,薫. Will you marry me?