Python初級プログラミング(1)
2023/07/17
そろそろPython使おう
  • このサイトの記事/レポートはPerl系が多めなことからわかるように、普段何かしらのツールを作成する時はPerlを使っています。ですが自分の作成した環境を後任に引き継いで改善やリファクタリングしてもらおうと考えた場合、次の世代から見てPerlは古い言語になっているかなという印象(*1)があります。

  • 誰かのソースコードを引き継ぐ時、担当者が「普段使っていない言語」ではかなりストレスがあるでしょう。なので私も「Python 3を触る」ことにしました。初級プログラミングでは「関数を使わない短いスクリプト」レベルを目指します。

  • Pythonの記述に関するレポートはネット上で大量に存在するため、改めて記述する意味は無いかもしれませんが、他の言語を知っている人が新たな言語を覚える際、どの程度の学習/メモ量(*2)になるのか、その参考になればと考えています。

Python初級プログラミング(1):目次

"hello, world!!"とコメントと漢字コード: [目次へ]
  • スクリプトファイル漢字コードはUTF-8。cp932コンソール出力は変換される。
  • print関数の機能については、サンプルコードの中で使用例を追加していく。
  • # はコメント
    print ("hello, world!") # お約束
    
    # スクリプトファイルの漢字コードはUTF-8
    print ("ハロー, ワールド!")
    >001_sample.py
    hello, world!
    ハロー, ワールド!

変数,数値,文字列: [目次へ]
  • 変数宣言時の型は無いので、ネーミングルールを意識する。
  • 変数使用前に宣言が必要。つまり何らかの初期値設定(明示的未定義:None含む)は必須。
  • int_a = 100  # 整数
    print ("int_a =",int_a) # printは「,」で連接できる
    
    dbl_b = 123.456  # 倍精度浮動小数点
    print ("dbl_b =",dbl_b)
    
    str_c = "Yesterday, I have enjoyed"  # 文字列1
    str_d = "long jogging."              # 文字列2
    print (str_c, str_d)
    >002_sample.py
    int_a = 100
    dbl_b = 123.456
    Yesterday, I have enjoyed long jogging.

演算子とBool変数: [目次へ]
  • 他の言語と違いが出やすいものだけ列挙。演算子を把握しないと制御文書きにくいので。
    • 二項演算子
      演算子機能
      A // B除算の小数点以下切り捨て(2.5なら2, -3.5なら-4)
      A % B剰余
      A ** Bべき乗

    • 比較演算子: Bool値で戻る
    • 演算子機能
      A == BEQUAL: AとBが等しければTrue。文字列にも適用できる。
      A != BNOT EQUAL: AとBが等しくなければTrue。文字列にも適用できる。

    • 論理/Bool演算子: Bool値で戻る
    • 演算子機能
      A and BAND: AとBの両方がTrueならTrue
      A or BOR: A又はBがTrueならTrue
      not ANOT: AのBool値反転

    • Bool変数: True/Falseを格納する変数型もある
    • bool_flag_a = False
      bool_flag_b = True
      
      print ("bool_flag_a =",bool_flag_a)
      print ("bool_flag_b =",bool_flag_b)
      print ("flag_a and flag_b =",bool_flag_a and bool_flag_b)
      print ("flag_a or flag_b =",bool_flag_a or bool_flag_b)
      >003_sample.py
      bool_flag_a = False
      bool_flag_b = True
      flag_a and flag_b = False
      flag_a or flag_b = True

条件分岐(if文): [目次へ]
  • if文末はコロン':'。ブロックはインデントで表現。※すごくPythonで書いている感が出始める。
  • elseは普通にある。else-ifはelif。
  • switch/case文は無い。皆で同じ記述を使うPythonの思想。
  • int_a = 80
    print ("---- int_a =",int_a,"----")
    if int_a > 100:
        print ("(1)100より大きい:",int_a)
    elif (int_a <= 100) and (int_a >= 50):  # <== ここ
        print ("(2)100以下50以上:",int_a)
    else:
        print ("(3)50未満:",int_a)
    
    int_b = 200
    print ("---- int_b =",int_b,"----")
    if int_b > 100: # <========================== ここ
        print ("(1)100より大きい:",int_b)
    elif (int_b <= 100) and (int_b >= 50):
        print ("(2)100以下50以上:",int_b)
    else:
        print ("(3)50未満:",int_b)
    
    int_c = 30
    print ("---- int_b =",int_c,"----")
    if int_c > 100:
        print ("(1)100より大きい:",int_c)
    elif (int_c <= 100) and (int_c >= 50):
        print ("(2)100以下50以上:",int_c)
    else:    # <================================= ここ
        print ("(3)50未満:",int_c)
    >004_sample.py
    ---- int_a = 80 ----
    (2)100以下50以上: 80
    ---- int_b = 200 ----
    (1)100より大きい: 200
    ---- int_b = 30 ----
    (3)50未満: 30

リスト: [目次へ]
  • 繰り返し実行文の話をする前に、複数データを扱えるようにしておく。
  • リストは[ ]で包むだけ。デリミタはカンマ。要素に数値/文字列混合できる。
  • 可変(mutable)オブジェクト。要は"リファレンス"→要素に他のオブジェクトを指定すれば多重化。
  • list_a = [0,1,2,"3:文字列",4]
    
    print ("All =",list_a)
    print ("[0] =",list_a[0])
    print ("[1] =",list_a[1])
    print ("[2] =",list_a[2])
    print ("[3] =",list_a[3])
    print ("[4] =",list_a[4])
    >005_sample.py
    All = [0, 1, 2, '3:文字列', 4]
    [0] = 0
    [1] = 1
    [2] = 2
    [3] = 3:文字列
    [4] = 4

繰り返し(for文): [目次へ]
  • 対象オブジェクトのイテレータ(iterator)を使うのが基本思想。※intはimmutableだから非推奨と思われる。
  • in演算子を使うのがポイント。
  • list_int_a = [0,20,40,80,160]
    
    for int_a in list_int_a: # listオブジェクトのiteratorでループ回数決まる
        if int_a > 100:
            print ("100 <",int_a)
        elif (int_a <= 100) and (int_a > 30):
            print ("100>=",int_a,"> 30")
        else:
            print (" 30>=",int_a)
    >006_sample.py
     30>= 0
     30>= 20
    100>= 40 > 30
    100>= 80 > 30
    100 < 160
  • インデックス変数を使いたいときはrange()関数を利用。逆順はreversed(range())。
  • list_int_a = [0,50,100,200,400]
    
    for i in range(4): # range関数で[0,1,2,3]の「リスト」を渡している
        if list_int_a[i] > 100:
            print ("100 <",list_int_a[i])
        elif (list_int_a[i] <= 100) and (list_int_a[i] > 30):
            print ("100>=",list_int_a[i],"> 30")
        else:
            print (" 30>=",list_int_a[i])
    >007_sample.py
     30>= 0
    100>= 50 > 30
    100>= 100 > 30
    100 < 200

繰り返し(while文): [目次へ]
  • while文もある。
  • list_int_a = [0,50,100,200,400]
    i = 0
    
    while i < 3:
        if list_int_a[i] > 100:
            print ("100 <",list_int_a[i])
        elif (list_int_a[i] <= 100) and (list_int_a[i] > 30):
            print ("100>=",list_int_a[i],"> 30")
        else:
            print (" 30>=",list_int_a[i])
        
        i = i + 1
    >008_sample.py
     30>= 0
    100>= 50 > 30
    100>= 100 > 30

繰り返しの中断(break文): [目次へ]
  • for又はwhileのループから抜ける。lastじゃない(*3)。break。
  • list_int_a = [0,50,100,200,400]
    
    for int_a in list_int_a:
        if int_a == 100:
            print ("100 is found !!")
            break
        else:
            print (int_a, "is not 100 ...")
    >009_sample.py
    0 is not 100 ...
    50 is not 100 ...
    100 is found !!


今回はここまで。そして次回
  • 制御文まできたところで一息入れましょう。初級プログラミングとしては引き続き
    • 文字列/リスト/tuple/dictionaryのデータ型と操作
    • データ入力(stdin)と標準出力(stdout)
    • ファイル入出力
    を扱う予定です。今回を含めて...全2,3回くらいになるかと思います。

  • ちなみに関数/コマンドライン引数/構造化データ/正規表現等は中級以降で扱います。それでは次回。
Notes
  • ある程度大きな書店のプログラミング系本棚を見て、Perlの本は少なくなったと感じています。
  • 多分想像を下回ります。「これって何?」という機能に関する疑問はほとんど無いからです。
  • あれ? lastじゃなかったっけ...? はPerlの人あるあるだと思います。
Copyright(C) 2023 Altmo
本HPについて