Python初級プログラミング(2)
2023/07/30
Pythonは全てオブジェクト
  • Pythonは従来のプログラミング言語であれば「変数」と呼んでいたものも全てオブジェクトです。よってデータに対して行いたい大抵の処理はメソッドが用意されています。

  • メソッドは公式ドキュメント(*1)に書かれていますが、今回はよく使いそうなものをピックアップします。またPythonは全てがオブジェクトなので、操作についてはメソッドだけでなく演算子を便利に使えるものも多いです。

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

文字列の連結: [目次へ]
  • 文字列(str)もオブジェクトのため、演算子はオーバーロードによって直感的に実装される。連結は「+」でOK。
  • str_a = "東京都"
    str_b = "中央区"
    str_c = str_a + str_b # 連結
    
    print (str_c)
    
    >010_sample.py
    東京都中央区
    

文字列のindexとiterator: [目次へ]
  • 文字列(str)は、文字のリストだから添字(index)が使える。
  • str_a = "0123456789" # 1byte系
    str_b = "0123456789" # 2byte系
    
    print (str_a[4])   # 4   普通に指定
    print (str_a[-1])  # 9   -は末尾からの指定になる
    print (str_a[5:8]) # 567 スライス:最後の[8]は取り出されない点注意
    print (str_a[:3])  # 012 スライス:先頭から指定インデックスまで:最後の[3]は取り出されない
    print (str_a[7:])  # 789 スライス:指定インデックスから最後まで
    
    # 2byte文字も1文字として処理する
    print (str_b[4])   # 4     普通に指定
    print (str_b[-1])  # 9     -は末尾からの指定になる
    print (str_b[5:8]) # 567 スライス:最後の[8]は取り出されない点注意
    print (str_b[:3])  # 012 スライス:先頭から指定インデックスまで:最後の[3]は取り出されない
    print (str_b[7:])  # 789 スライス:指定インデックスから最後まで
    
    >011_sample.py4
    9
    567
    012
    789
    4
    9
    567
    012
    789
    
  • 文字列(str)は、文字のリストだからiteratorとすれば、文字単位でデータが戻る。
  • str_b = "0123" # 2byte系
    
    for ch_b in str_b:
        print (ch_b)
    
    >012_sample.py
    0
    1
    2
    3
    

文字列のメソッド:大文字/小文字変換:upper(),lower(): [目次へ]
  • 大文字変換/小文字変換のメソッド。全てのstrメソッド処理結果は新しいstrオブジェクトとして戻る(*2)
  • str_a = "aBcDeFg" # 大文字小文字混在
    
    print (str_a.upper()) # 大文字変換
    print (str_a.lower()) # 小文字変換
    print (str_a)         # 元のデータは不変
    
    >013_sample.py
    ABCDEFG
    abcdefg
    aBcDeFg
    

文字列のメソッド:検索:in,find(),rfind(): [目次へ]
  • 検索文字列の存在判定はin演算子が適用できる。インデックス位置取得はfind()/rfind()メソッド使用。
  • in演算子は以後説明予定のリスト(list)や辞書(dictionary)でも使用できる
  • find()/rfind()で検索文字列が見つからない場合「-1」が戻る。
  • str_a = "領域0:領域1:領域2"
    
    if ":" in str_a: # ":" を含むかどうかの判定は in 演算子
        print ("str_a has ':'");
    else:
        print ("stra_a does not have ':'");
    
    print (str_a.find(":"))             # 前方からのインデックス位置
    print (str_a[0 : str_a.find(":")])  # スライスに利用できる
    
    print (str_a.rfind(":"))            # 後方からのインデックス位置
    print (str_a[str_a.rfind(":")+1 :]) # スライスに利用
    
    >014_sample.py
    str_a has ':'
    3
    領域0
    7
    領域2

文字列のメソッド:置換:replace(): [目次へ]
  • 文字置換のメソッドはreplace()。
  • 置換の回数を第3引数で指定できる。
  • str_a = "領域0:領域1:領域2"
    
    print (str_a.replace(":","_"));   # 全て置換
    print (str_a.replace(":","_",1)); # 最初だけ置換
    
    >015_sample.py
    領域0_領域1_領域2
    領域0_領域1:領域2
    

文字列のメソッド:リスト化:split(): [目次へ]
  • デリミタ文字列を指定して分割/リスト化する
  • str_a = "領域0:領域1:領域2"
    
    list_b = str_a.split(':')
    
    for str_c in list_b:
        print (str_c)
    
    >016_sample.py
    領域0
    領域1
    領域2
    


リストの作成とindex: [目次へ]
  • 要素をコンマで区切りつつ[]で囲むとリストになる。前回説明済み。
  • 数値も文字列も混在できる。要素に型の制限無し。
  • 添字(index)の扱いは、文字列のindexで説明したものと同じ。と言うか、文字列が文字のリスト。
  • list_a = [0,1,"2:文字列",3,4]
    
    print (list_a)
    print (list_a[1])
    print (list_a[0:2])
    print (list_a[:3])
    print (list_a[2:])
    
    >017_sample.py
    [0, 1, '2:文字列', 3, 4]
    1
    [0, 1]
    [0, 1, '2:文字列']
    ['2:文字列', 3, 4]
    

リストのメソッド:コピー:copy(): [目次へ]
  • リストはデータ領域を指すリファレンス。Pythonは全てオブジェクトなのでデータ名はリファレンス。
  • よってリスト等の可変(mutable)データを複製するには、copy()メソッドで別領域にデータをコピーする。
  • ちなみに文字列,数値等の不変(immutable)オブジェクトは代入演算子(=)が暗黙のcopy(*3)になっている。
  • list_a = [0,1,"2:文字列",3,4]
    print ('list_a =',list_a)
    
    list_b = list_a            # list_bはlist_aの「別名」になるだけ
    list_a[3] = "変更"
    print ('list_a =',list_a)  # list_aは当然変わる
    print ('list_b =',list_b)  # list_bも変わる。単なる別名だから
    
    list_c = list_a.copy()     # copyメソッドでデータを別領域にコピー
    list_a[3] = "再変更"       # 再度list_a変更
    print ('list_a =',list_a)  # list_aは当然変わる
    print ('list_b =',list_b)  # list_bも変わる。単なる別名だから
    print ('list_c =',list_c)  # list_cはcopy時から変わらない
    
    >018_sample.py
    list_a = [0, 1, '2:文字列', 3, 4]
    list_a = [0, 1, '2:文字列', '変更', 4]
    list_b = [0, 1, '2:文字列', '変更', 4]
    list_a = [0, 1, '2:文字列', '再変更', 4]
    list_b = [0, 1, '2:文字列', '再変更', 4]
    list_c = [0, 1, '2:文字列', '変更', 4]
    

リストのメソッド:追加:append(): [目次へ]
  • の追加にはappend()メソッドを使用。
  • 値追加には演算子(+/+=)も使える。この場合リストも追加できる。
    • iterableを要素に分解して追加するので、文字列は「文字単位」で追加されてしまう点注意。
       list_a += 'abcd' → ['a', 'b', 'c', 'd']
       list_a.append('abcd') → ['abcd']
    list_a = [0,1,2,3]
    list_b = [4,5,6,7]
    print ('list_a =',list_a)
    print ('list_b =',list_b)
    
    list_a.append('A') # appendメソッドによる値追加
    list_b += 'B'      # +=(累積演算子)による値追加
    
    list_a += list_b          # 累積演算子でリストも追加できる(ここは値コピー)
    list_b += 'C'             # list_bを変更
    print ('list_a =',list_a) # list_bの変更は反映されない
    
    >019_sample.py
    list_a = [0, 1, 2, 3]
    list_b = [4, 5, 6, 7]
    list_a = [0, 1, 2, 3, 'A', 4, 5, 6, 7, 'B']
    

リストのメソッド:挿入:insert(): [目次へ]
  • リストの途中に値を挿入できる。insert()メソッド使用。
  • リストの途中にリストを挿入できる。表現としてindexスライスを利用する(*4)
  • list_a = [0,1,2,3]
    list_b = ['A','B','C']
    print ('list_a =',list_a)
    print ('list_b =',list_b)
    
    list_a.insert(2,'D')      # [2]に'D'を「挿入」
    print ('list_a =',list_a)
    
    list_a[1:1] = list_b      # [1]にlist_bを「挿入」
    print ('list_a =',list_a)
    
    >020_sample.py
    list_a = [0, 1, 2, 3]
    list_b = ['A', 'B', 'C']
    list_a = [0, 1, 'D', 2, 3]
    list_a = [0, 'A', 'B', 'C', 1, 'D', 2, 3]
    

リストのメソッド:削除:clear(): [目次へ]
  • clear()メソッドで全てのデータを削除する。
  • indexスライスで空リスト[]を渡すことで部分削除できる
  • list_a = [0,1,2,3,4]
    print(list_a)
    
    list_a[2:4] = []  # indexスライスを利用した部分削除
                      # スライス表現では最後(この場合[4])が対象外になる点は変わらず
    print(list_a)
    
    list_a.clear()    # clear()メソッドによる全削除
    print(list_a)
    
    >021_sample.py
    [0, 1, 2, 3, 4]
    [0, 1, 4]
    []
    

リスト要素数取得:len(): [目次へ]
  • 要素数の取得「関数」。文字列(文字のリスト)に適用すれば文字数。
  • loopではiteratorの使用が原則なので、len()を使う前に少し考えるべき。
  • list_a = [0,1,2,3,4]
    print(list_a,'=',len(list_a)) # list_a 要素数
    
    str_b = "0123あいうえ"
    print(str_b,'=',len(str_b))   # 文字列にも使える
    
    >022_sample.py
    [0, 1, 2, 3, 4] = 5
    0123あいうえ = 8
    

リストの文字列化:join(): [目次へ]
  • 指定デリミタでリスト要素を結合した文字列を戻す。
  • Pythonでは文字列リテラルですらオブジェクトなんだと思わされる。
  • list_a = ["あ","い","う","え","お"]
    print ("list_a = ",list_a);
    
    print ("結合:", ''.join(list_a))  # ''は空文字→結果として結合(concat)
    print ("コンマ区切り:", ','.join(list_a)) # ','で結合→CSV
    print ("タブ区切り:", "\t".join(list_a))  # \tはタブのエスケープシーケンス
    print ("改行:", "\n".join(list_a))  # \nは改行のエスケープシーケンス
    
    >023_sample.py
    list_a =  ['あ', 'い', 'う', 'え', 'お']
    結合: あいうえお
    コンマ区切り: あ,い,う,え,お
    タブ区切り: あ        い      う      え      お
    改行: あ
    い
    う
    え
    お
    


そして次回は
  • 文字列とリストの話でだいぶ書いたので、今回はここで終わりたいと思います。

  • ここまで書いてきて思ったのは、PythonはPerlに比べて日本語/マルチバイト文字が扱いやすいです。内部文字コードがUTF-8であることは他言語も共通として、出力をOS側のコンソールコードに変換してくれるので、処理の煩わしさがありません。主言語の乗り換えが頭にちらつき始めました。

  • 次回はタプルと辞書データ...ハッシュデータを扱う予定です
Notes
  • Pythonをインストールするとローカルにもドキュメントが置かれます。
  • 文字列(str)は不変(immutable)オブジェクトだからです。数値(int,float,double)も同じ。
  • Pythonコーディングの重要なポイントです。だからloopはiterator推奨になります。
  • スライスではなくindexを指定すると多重化リストとなります。
Copyright(C) 2023 Altmo
本HPについて