プログラミング入門I
2025.01.20
文字列1

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回は久しぶりに解答用紙を使用しない人が出てきてしまいました.どうしてなのか不思議ですが,注意しましょう.

    解答用紙不使用: b2417

    以下は例によって問題のあるプログラムの例です.参考にしてください.

    st= 'NTCEBMZAGH'
    

    なぜか文字列を決め打ちする人が何人かいました.問題文には「今回の演習問題 ii. をスライスを利用して2重の反復処理を使用しないで実現できるよう変更しましょう.」と書いてあるので,条件はそのまま引き継がれるはずなのですが,なんでランダムな文字列でないという解釈をする人がいるのか謎です.

    for i in range(10):
        print(' ' * i, end='')
    
        for j in range(10):
            print(st[(i + j) % 10], end='')
    
        print()
    

    演習問題そのままを出している人も複数いました.そのままコピペすればいい問題なんて出ると思うのがこれもまた謎です.

    for i in range(10):
           space = ' ' * i
           row = (st * 2)[i:i + 10]
           print(space + row)
    

    文字列を2回繰り返すようにしてその一部を表示するという方法はダメですね.元々の演習問題のときにもそういう操作を行っていません.

    st += st
    
    for i in range(10):
        print(f'{sp * i}{st[i:i + 10]}')
    

    これも同じで,文字列を繰り返してごまかそうとしています.

    for i in range(0,10):
        print(sp*i,end='')
        print(f'{(st*(i+1))[i:i+10]}')
    

    またも元の文字列を繰り返してごまかしている例です.

    for i in range(10):
        print(f'{sp * i} {st[i % 10:]}{st[:i % 10]}')
    

    剰余は使用しないと言っていましたけどね.

    for i in range(0, 10):
        print(sp * i, end = '')
        print(s[i:10],s[0:i])
    

    print の中でオブジェクトをカンマ , で列挙すると間にスペースが自動で入ります.なので,出翼が以下のようになってしまいます.文字列は加算演算子 + で連結できるとヒントとして書いていたのですが.

    OJUVBXLFZR 
     JUVBXLFZR O
      UVBXLFZR OJ
       VBXLFZR OJU
        BXLFZR OJUV
         XLFZR OJUVB
          LFZR OJUVBX
           FZR OJUVBXL
            ZR OJUVBXLF
             R OJUVBXLFZ
    

    st = ''
    sp='          '
    for _ in range(10):
        st += chr(random.randint(65, 90))
    for i in range(10):
        print(sp[0:i],end='')
        print(st[i-1:11],end='')
        print(st[0:i-1])
    

    スペースの方も長い文字列を用意してスライスで表示していますが,そこは特に求めていませんでした.文字数数えて入力するのも面倒ですし.

    for j in range(10):
        print('  ' * j + st[j:] + st[:j])
    

    スペースが2個分入っているので,下のように出力がずれています.自分で気づくと思うのですが,直していないのはなぜでしょうか?

    BYQDELSNBE
      YQDELSNBEB
        QDELSNBEBY
          DELSNBEBYQ
            ELSNBEBYQD
              LSNBEBYQDE
                SNBEBYQDEL
                  NBEBYQDELS
                    BEBYQDELSN
                      EBYQDELSNB
    

    st=''
    sp=' '
    
    for _ in range(10):
        st+=chr(random.randint(65,90))
    s1=st
    

    どうして文字列オブジェクトの名前を変更しないといけないのでしょうか.無駄な変数の定義はメモリを無駄に使ってしまいます.

    def generate_pattern(string):
        length = len(string)
        for i in range(length):
            print(" " * i + string[i:] + string[:i])
    numbers = ("NTCEBMZAGH")
    generate_pattern(numbers)
    

    またまた def を使った関数形式のものが出てきましたね.そこまで理解できているのならば,変な文字列定義などしないと思いますが.

    以下は終盤になってもまだ出てくる絶対にやっちゃダメ!な例です.何度も言いますが,こんな面倒なことが必要なものは私の授業では絶対に扱いません!

    add=0
    empty=''
    for i in range(0,9):
        if i == 0:
            empty = ''
        elif i == 1:
            empty = ' '
        elif i == 2:
            empty = '  '
        elif i == 3:
            empty = '   '
        elif i == 4:
            empty = '    '
        elif i == 5:
            empty = '     '
        elif i == 6:
            empty = '      '
        elif i == 7:
            empty = '       '
        elif i == 8:
            empty = '        '
        elif i == 9:
            empty = '         '
            
        i += add
        
        print(f'{empty}',end='')        
        print(f'{s1[i:9]}',end='')
        print(f'{s1[0:i]}')
    else:
        print()
    

    data = """NTCEBMZAGH
    TCEBMZAGHN
    CEBMZAGHNT
    EBMZAGHNTC
    BMZAGHNTCE
    MZAGHNTCEB
    ZAGHNTCEBM
    AGHNTCEBMZ
    GHNTCEBMZA
    HNTCEBMZAG"""
    
    i = 0
    start = 0
    while start < len(data):
        end = start
        while end < len(data) and data[end] != "\n":
            end += 1
            
        print(" " * i + data[start:end])
    
        start = end + 1
        i += 1
    

  3. 前回の復習

    文字列について学習しました.文字列は個々の文字が順番に並んでいる特殊なデータ形式(プログラミング入門IIで扱うリストなど配列形式)で,インデックスにより個々の文字にアクセスできます.また,インデックスを使ってスライスという方法を使うと,文字列の切り出しなどが行えます.

  4. 文字列その2

    1. 文字列の操作
      1. 探索
      2. in や not in 演算子を用いて,文字列の中に特定の文字列があるかどうかを判定したり,find 系メソッドによりさらに詳しい文字列に関する探索が可能になります.find などはメソッドなので,ピリオドでつなげて操作を行います.

        str.find('ABC')
        

        教科書にもあるように文字列 str の中に文字列 ABC が含まれているかどうかを調べます.詳しくは演習問題で確認しましょう.

      3. 連結,分割,置換,除去
      4. 文字列を操作するメソッドはたくさんあります.教科書に出ている join などのメソッドを演習問題で確認しましょう.また,文字列はリストの一種ですので,教科書 p.72 で出てきた sorted 関数も活躍します.

      5. その他のメソッド
      6. 大文字から小文字に変換するなどの文字種の変更を行うメソッドも用意されています.これまで数値としての文字コードに32に加えることで大文字を小文字に変換するなどしていましたが,upper メソッドを使用することで同じような操作が可能です.

    2. 書式化
      1. % 演算子
      2. 他の言語でも必ず用意されている % 記号を用いた表現です.Python ではあまり使用しないようですが,それには % の使い方が他の言語に比べて面倒なことがあるのかもしれません.

      3. format メソッド
      4. % 記法が面倒なため用意されていた format メソッドですが,記述が長くなる傾向にありますので,現時点では f 文字列が主流になったので,使う意味はもうほとんど無いようです.

      5. f 文字列
      6. これまでさんざん使ってきた f 文字列ですが,この機会に教科書の List 6-17 をしっかり確認して今後も自由に使えるようになりましょう.

  5. 演習

    今回の演習問題です.

  6. 本日のまとめ

  7. 宿題

    宿題が公開されるのは明日火曜日10:00の予定で,締切りは翌月曜日2729日の10:00です.レポート提出システムを使用します.

  8. 確認テスト

    いよいよ最後となりましたので,授業の終わりに確認テストを実施します.


目次ページに戻る