ブライアン・カーニハンとデニス・リッチーによる著書「プログラミング言語C」(1978年)以来、プログラミング言語の最初の例として、文字列"Hello, World!"を画面に印刷するプログラムがよく使われています。この習慣に迎合して、ここでもPython版のHelloWorldプログラムの一例を示します。
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!"が表示されます。
...
が、ここでは繰り返し何度も使えるプログラムとしてのHelloWorldプログラムをご覧いただきます。
作成したプログラムを繰り返し何度も使うために, プログラムはファイルに保存した形で用意します。
#!/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!
このプログラムの中心部分はdef Hello():
で始まる三行のプログラムです。
この三行のプログラムによって、関数 Hello()
を定義しています。
def Hello(): # 関数の定義を宣言
print("Hello, World!") # 関数の本体、インデントに注意
return # 関数呼び出しの終了
これらの行を一行づつ説明していきます。
def Hello():
まず、def Hello():
で関数名がHello
という関数を定義することを宣言しています。
次の、()
はこの関数には引数がないことを示しています。
:
はこの後に関数の本体が続くことを示しています。
#
はコメントの開始を示します。行末までがコメントとなります。
print("Hello, World!")
python3ではprintは(文ではなく)関数です。 引数に与えられたデータを文字列として、端末に表示します。
return # 関数呼び出しの終了
次のreturn
文はこの行が実行されると関数呼び出しが終了し、関数を呼び出したところからプログラムの実行が継続されます。
このreturn
文もインデントされていますので、Hello()
関数本体のブロックに含まれています。
if __name__ == "__main__":
Hello()
Hello, World!
続く二行のプログラムは、ファイルにpythonプログラムを保存する際に使われるイディオムです。 (なぜこうするのか?は後で説明します。)
if
文は、文中の条件(ここでは__name__ == "__main__"
)が満足された時、if
文の本体(インデントで区別された一連のプログラム文, ここではHello()
)を実行します。if
文の文末は:
で、実行すべきブロックがインデントされていることに注意しましょう。
__name__
はPythonシステムが利用する変数で、name 属性はモジュールの完全修飾名に設定されなければなりません。 となっています。 pythonプログラムがpython3コマンドから起動されたとき(後述)は"main"に設定されるという約束になっています。
def
文を使う。if
文を使う。def
文、if
文の中身のプログラムは、行頭をインデントする作成したプログラムをhello.py
という名前のファイルに保存します。
このプログラムを実行するにはいくつかの方法があります。
第一の方法は、シェルのコマンドプロプトからpytho3(or py -3)コマンドを使って実行する方法です。
ファイルhello.py
を保存したディレクトリで、
% python3 hello.py
を実行しますと、
% python3 hello.py
Hello, World!
のように、端末に文字列が印刷されます。
このように動作するのは、hello.pyにif __name__ == "__main__":
以下のプログラムを書きこんだことによるものです。
-m
のパラメータにはpython モジュール名を指定します。 .py
がついていないことにご注意ください。
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プログラムとして組み合わせて使うことも 可能です。
% 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.py
のif __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.
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.
import hello; hello.hello
python3 -m hello
プログラムで使われる色々な名前(変数名、関数名、クラス名、モジュール名、..)は識別子と呼ばれます。 識別子は、これから説明するに従っていれば自由につけることができます。
とはいうものの、 後でプログラムを再読したときに、それらの識別子がさすものの意味がわかるように名前をつけましょう。
識別子はざっくり言って、
- 識別子の最初の文字は、大小のアルファベット(a-zA-Z), あるいはアンダースコア('_') が許される。
というルールに従います。
例えば、
x y address _myname a0 a1
などはいずれも有効な名前(識別子)です。
Python3ではさらに unicode文字 も使えます。 識別子として使えるunicode文字の範囲については、Language Referenceマニュアルをご覧ください。
ということで、こんなプログラムを書くこともできます。
#!python3
# -*- coding: utf-8 -*-
def 挨拶():
print("Hello, World!")
返事= "ようこそ,いらっしゃいませ。"
return 返事
if __name__ == "__main__":
挨拶()
Hello, World!
挨拶()
Hello, World!
'ようこそ,いらっしゃいませ。'
とはいえ、これをお薦めしているわけではありません。
python3の予約語
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プログラムを読みこなすことが可能です(原理的には)。 簡単でしょう?😁
蛇足ですが、予約語の他にも記号 「~!@#%^&*()-+/={}[]|:;\"'<>., 」の使い方も学習する必要があります。
Pythonでの文字列定数(リテラル文字列)の記法には2種類あります。
後者は中身の文字列に改行を拭くんでいても良い、すなわち中身の文字列が複数行にまたがっていてもよいというところです。
なお、Pythonの文字列はC言語のそれと異なりシングルクォート「'」を使った文字列とダブルクォート「”」を使った文字列に意味的な違いはありません。
また、Pythonの文字列はUnicodeの文字の並びです。C言語の文字列に相当するものは、bytes
あるいはbytearray
です。(いずれまた、しょうさい
文字列については、次回以降の講座でより詳しく説明します。
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.
def <関数名> (<引数のリスト>):
の構文を使う。 if <条件> :
の構文を使う。<条件>
の論理式としての値がFalse
でないとき、続くコードブロックが実行される。さあ、無事に最初の一歩は踏み出せたでしょうか? 次はどこに向かいましょうか?
蛇足:
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.
"""
引数をもつ関数の定義の例
単独のスクリプトして実行された時には、標準のモジュール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!!
print()
関数は複数の引数を受け取った時、渡されたデータ型に応じて整形した文字列を端末に出力します。
出力される文字列をより細かく制御するためには文字列データの.format
メソッドを使います。
(Python2との互換性のために、別の方法(""%
)もサポートされていますが、
.format
メソッドがpython3での標準的な方法です。)
print("Hello {}!".format(name))
文字列定数中に改行コードなどを挿入するには、C言語と同じように、エスケープ文字\
をつかったエスケープ文字定数を使います。
\n
, タブ -> \t
, ベル->\a
,\012
, 十六進数-> \x0a
,\'
, 二重引用符 (")-> \"
, エスケープ文字-> \\