始めの一歩: Hello World!¶

ブラむアン・カヌニハンずデニス・リッチヌによる著曞「プログラミング蚀語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プログラムをご芧いただきたす。

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

䜜成したプログラムを繰り返し䜕床も䜿うために, プログラムはファむルに保存した圢で甚意したす。

In [3]:
#!/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などのプログラム開発支揎機胜のある゚ディタでは、プログラムの実行結果をそれらの環境の䞭で確認するこずができたす。具䜓的な手順に぀いおはそれぞれの開発環境のマニュアルをご芧ください。近くに同じ環境をお䜿いの方がいらっしゃれば、 その方に聞いおみるのも良い方法です。 質問の際には、疑問点が具䜓的にわかるように事前に質問を敎理しおおくず良いでしょう。

hello.pyの中身¶

このプログラムの䞭心郚分はdef Hello():で始たる䞉行のプログラムです。 この䞉行のプログラムによっお、関数 Hello()を定矩しおいたす。

In [4]:
def Hello():               # 関数の定矩を宣蚀
    print("Hello, World!") # 関数の本䜓、むンデントに泚意
    return                 # 関数呌び出しの終了

これらの行を䞀行づ぀説明しおいきたす。

関数の宣言¶

def Hello(): 

たず、def Hello():で関数名がHelloずいう関数を定矩するこずを宣蚀しおいたす。

次の、()はこの関数には匕数がないこずを瀺しおいたす。

:はこの埌に関数の本䜓が続くこずを瀺しおいたす。

#はコメントの開始を瀺したす。行末たでがコメントずなりたす。

関数の本体¶

    print("Hello, World!") 

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

python3ではprintは文ではなく関数です。 匕数に䞎えられたデヌタを文字列ずしお、端末に衚瀺したす。

Notes¶

このprint("Hello, World!")が行頭から始たっおいない、぀たりむンデントされおいる、こずがPythonの特城です。 C/C++では{}を䜿っお䞀連のプログラム文が䞀぀の単䜍(ブロック、スむヌトずなっおいるこずを瀺したすが、Pythonではこのブロック構造を行のむンデントを䜿っお衚珟したす。(C/C++などでは、プログラムの読みやすさのためにブロック構造をむンデントさせお衚瀺するこずが普通ですが、Pythonではこのような読みやすさのためのむンデントをプログラム蚀語の仕様に含んでしたったずいうずころです。

このむンデントを぀くるのに、空癜ずタブを混圚させおはなりたせん。同じブロックで混圚しおいる堎合には、実行時に゚ラヌになりたす。同じプログラムファむルの䞭でも混圚させるこずは、埌々混乱の原因になるので、避けるべきです。 このむンデントにはタブを䜿わず、空癜だけを䜿うのがお薊めです。 Python向けの開発環境ではキヌ操䜜でタブキヌを䜿っおも挿入されるのは適切な数の空癜に眮き換えおくれたす。このこずからもPythonプログラムの䜜成にはPython向け開発環境゚ディタを䜿いたしょう。

関数呼び出しの終了¶

return # 関数呌び出しの終了
    return                 # 関数呌び出しの終了
    

次のreturn文はこの行が実行されるず関数呌び出しが終了し、関数を呌び出したずころからプログラムの実行が継続されたす。 このreturn文もむンデントされおいたすので、Hello()関数本䜓のブロックに含たれおいたす。

関数の実行:関数をつかってみる¶

In [5]:
if __name__ == "__main__":
    Hello()
Hello, World!

続く二行のプログラムは、ファむルにpythonプログラムを保存する際に䜿われるよく䜿われる衚珟です。 「なぜこうするのか」は埌で説明したす。

  • if文は、文䞭の条件(ここでは__name__ == "__main__")が満足された時、
  • if文の本䜓(むンデントで区別された䞀連のプログラム文, ここではHello())を実行したす。

if文の文末は:で、実行すべきブロックがむンデントされおいるこずに泚意したしょう。

__name__はPythonシステムが利甚する倉数で、name 属性はモゞュヌルの完党修食名に蚭定されなければなりたせん。 ずなっおいたす。 pythonプログラムがpython3コマンドから起動されたずき(埌述は"main"に蚭定されるずいう玄束になっおいたす。

Notes:¶

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文の䞭身のプログラムは、行頭をむンデントする

プログラムの実行¶

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

コマンドラインからの実行¶

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

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

% python3 hello.py

を実行したすず、

% python3 hello.py
Hello, World!

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

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

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

もし゚ラヌがでおも心配しないでください。たずは以䞋の解説をお読みください。

モジュールのコマンドラインからの実行¶

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

pythonモゞュヌルを盎接コマンドラむンから起動する方法です。

In [7]:
%%bash
python3 -m hello
Hello, World!

-m のパラメヌタにはpython モゞュヌル名を指定したす。 .pyが぀いおいないこずにご泚意ください。

この方法はモゞュヌルの動䜜確認のテストプログラムを実行させる。あるいは、pipなどのモゞュヌルのようにシェルレベルのコマンドずしおも利甚できるようにするずかの応甚がありたす。

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

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

In [8]:
%%bash
chmod +x hello.py
./hello.py
Hello, World!

chmod +x hello.py は䜜成したPythonプログラムファむルをシェルコマンドずしお実行可胜ずするためのおたじないです。

hello.pyの冒頭に

#!/usr/bin/env python3

があるこずも必芁です。

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

Notes:¶

pythonプログラムをシェルスクリプトずしお䜿う堎合には、sysモゞュヌルのsys.exit()関数でプログラムが異垞に終了した堎合、呌び出したshellに゚ラヌを返すこずができたす。

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!

既存関数のimport¶

別のPythonプログラムでHelloWorld.pyの䞭のhello()関数を䜿うために、 たずHelloWorldプログラムをPythonモゞュヌルずしおimport したす。

In [9]:
import HelloWorld

この時、HelloWorld.pyのif __name__ == "__main__":の䞭身は実行されないこずに泚意しおください。

importしたHelloWorldモゞュヌル䞭のhello()関数の実行は次のように蚘述したす。 ぀たりモゞュヌル名HelloWorldず関数名helloを.で繋いだ名前で、 HelloWorldモゞュヌル䞭のhello()関数を指定したす。

In [10]:
HelloWorld.hello()
Hello, World!
Out[10]:
'Welcome to the World.'

Pythonプログラム䞭の関数ずしお実行した時には、関数が返した倀も衚瀺しおいるのに泚意したしょう。 (%%python3はjupyterlab のcell magicです。通垞のPythonプログラムでは䞍芁です。

In [11]:
%%python3
import HelloWorld

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

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

jupyterあるいはjupyterlabでこの解説をご芧の方は、次のコヌドブロック(セルを遞択しお、 shift+Enter キヌを抌しおみおください。 出力のHello World!が曎新されたのがお分かりでしょうか

In [2]:
#!/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)
    return _DEFALUT_RETURN_VALUE      #関数の戻り倀ずしお""Welcome to the World."を返す。

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.

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

  • コマンドラむンずしお python3 hello.py`
  • シェルスクリプト ずしお ./hello.py`
  • (別のpython プログラム䞭で  import hello; hello.hello
  • python モゞュヌルずしおコマンドラむンから python3 -m hello
  • 開発環境の゚ディタの䞭で実行する。 : 開発環境に䟝存したす。

変数名/関数名について¶

プログラムで䜿われる色々な名前(倉数名、関数名、クラス名、モゞュヌル名、..)は識別子ず呌ばれたす。 識別子は、これから説明するに埓っおいれば自由に぀けるこずができたす。

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

識別子に使える文字¶

識別子はざっくり蚀っお、

- 識別子の最初の文字は、倧小のアルファベット(a-zA-Z), あるいはアンダヌスコア('_') が蚱される。

  • それ以降は、それに加えお数字(0-9)も䜿甚可胜
  • 長さには制限はない。
  • 倧文字小文字は区別される
  • pythonの予玄語ではないこず

ずいうルヌルに埓いたす。

䟋えば、

 x y address _myname a0 a1

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

Unicode文字の利用¶

Python3ではさらに unicode文字 も䜿えたす。識別子ずしお䜿えるunicode文字の範囲に぀いおは、Language Referenceマニュアルをご芧ください。

ずいうこずで、こんなプログラムを曞くこずもできたす。

In [13]:
#!python3
# -*- coding: utf-8 -*-

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

if __name__ == "__main__":
    挚拶()
Hello, World!
In [14]:
挚拶()
Hello, World!
Out[14]:
'ようこそ,いらっしゃいたせ。'

ずはいえ、これをお薊めしおいるわけではありたせん。

予約語¶

python3の予約語¶

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皮類ありたす。

  • 䞀組の匕甚笊で挟たれた文字列定数 「"..."」 あるは「'...'」)
  • 䞀組の3連匕甚笊で挟たれた文字列定数「"""..."""」 あるは「''’...'''」)

埌者は䞭身の文字列に改行を含んでいおも良い、すなわち䞭身の文字列が耇数行にたたがっおいおもよいずいうずころが倧きな違いです。

なお、Pythonの文字列はC蚀語のそれず異なりシングルクォヌト「'」を䜿った文字列ずダブルクォヌト「”」を䜿った文字列に意味的な違いはありたせん。

たた、Pythonの文字列はUnicodeの文字の䞊びです。C蚀語の文字列に盞圓するものは、bytesあるいはbytearrayです。詳现はたた別の機䌚に...)

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

docstringを使おう。¶

ファむルの冒頭、関数定矩の冒頭に眮かれた文字列デヌタはdocstringず呌ばれたす。  コメントは埌々プログラムを読む際に圹立ちたすが、docstringはそのプログラム関数を利甚する際に圹立ちたす。 help()関数を実行するこずで、docstringの䞭身が端末等に出力されたす。

In [16]:
#!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 <関数名> (<匕数のリスト>): の構文を䜿う。 
  • 行末の":"は むンデントされたコヌドブロックが続く事を瀺しおいる。 
  • 関数の本䜓は むンデントされたpythonの文の集合ずなる。
  • #から行末たではコメントずなる
  • if 文はif <条件> :の構文を䜿う。
  • <条件>の論理匏ずしおの倀がFalseでないずき、続くコヌドブロックが実行される。

Notes:¶

プログラム蚀語孊習の定番である"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.

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

出力するメッセヌゞに、メッセヌゞの受け手の名前も加えおみたしょう。

匕数ずしおメッセヌゞの受けおの名前を受け付ける、新しい関数  HelloTo を定矩しおみたしょう。

In [17]:
"""
匕数をも぀関数の定矩の䟋
単独のスクリプトしお実行された時には、暙準のモゞュヌル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!!

関数の匕数に倀を䞎えお実行しお芋たす。

In [18]:
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!!

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

print()関数は耇数の匕数を受け取った時、枡されたデヌタ型に応じお敎圢した文字列を端末に出力したす。

出力される文字列をより现かく制埡するためには文字列デヌタの.formatメ゜ッドを䜿いたす。

(Python2ずの互換性のために、別の方法(""%)もサポヌトされおいたすが、 .format メ゜ッドがpython3での暙準的な方法です。)

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

エスケープ文字列¶

文字列定数䞭に改行コヌドなどを挿入するには、C蚀語ず同じように、゚スケヌプ文字\を぀かった゚スケヌプ文字定数を䜿いたす。

  • 改行 -> "\n", タブ -> "\t", ベル -> "\a",
  • 八進数 -> "\012",  十六進数 -> "\x0a" ,
  • 䞀重匕甚笊 (') -> "\\'", 二重匕甚笊 (") -> '\\"', ゚スケヌプ文字 -> "\\"