プログラミング入門II
2024.06.19
モジュール

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    今回はエラーになるプログラムの提出が無かったので,そこは良かったです.今後もこの調子で行きましょう.ただし,恐れていたやっちゃダメなものはたくさん出てきてしまいました.ちょっと残念です.

    出力時番号なし: b2272

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

    score1 = list(filter(lambda n: n >= 90 , lst))
    print(f'S:{len(score1):3}')
    
    a = 90
    b = 65
    for _ in range(4):
        score = list(filter(lambda n: a > n >= a - 10 , lst))
        print(f'{b:c}:{len(score):3}')
        a -= 10
        b += 1
    

    評価の S だけ別処理にしているので,ソースに重複がありますよね.ここもすっきりまとめてください.

    lst=[random.randint(50,100) for _ in range(100)]
    eva=['S','A','B','C','D']
    s=[i for i in range(90,101)]
    a=[i for i in range(80,90)]
    b=[i for i in range(70,80)]
    c=[i for i in range(60,70)]
    d=[i for i in range(0,60)]
    
    sta=[s,a,b,c,d]
    
    for i in range(5):
        evalu=list(filter(lambda n: n in sta[i],lst))
        print(f'{eva[i]}: {len(evalu)}')
    

    ただ並んでいるだけの自然数をわざわざ発生させる必要があるのでしょうか?

    for i in range(100, 50, -10):
        score1 = list(filter(lambda n: i - 10 <= n < i , lst))
        score2 = list(map(lambda n: n // n, score1))
    
        if i == 100:
            lst_100 = list(filter(lambda n: n == 100 , lst))
            count_100 = list(map(lambda n: n // n, lst_100))
            print(f'{chr(grade)}: ', end = '')
            grade = 65
        else:
            count_100 = []
            print(f'{chr(grade)}: ', end = '')
            grade += 1
    
        print(f'{sum(score2) + sum(count_100)}')
    

    100 だけ分ける処理も無駄ですよね.

    def evaluate(n):
        if n >= 90: return 'S'
        elif n >= 80: return 'A'
        elif n >= 70: return 'B'
        elif n >= 60: return 'C'
        else: return 'D'
    

    今回 def で関数を定義する必要がない課題を出したつもりでした.

    for i in range(5):
        lst = list(filter(lambda n: n >= m, sc))
        m -= 10
        if m == 80:
            print(f'{va[i]}: {len(lst)}')
        else:
            nlst = list(filter(lambda n: n >= m + 20, sc))
            print(f'{va[i]}: {len(lst) - len(nlst)}')
    else:
        print()
    

    これも処理が重複していますよね.

    def generated_scores(num_scores, min_score=50, max_score=100):
        return [random.randint(min_score, max_score) for _ in range(num_scores)]
    
    def count_grades(scores):
        grade_boundaries = {
            'S': lambda x: x >= 90,
            'A': lambda x: 80 <= x < 90,
            'B': lambda x: 70 <= x < 80,
            'C': lambda x: 60 <= x < 70,
            'D': lambda x: x < 60}
    
        grade_counts = {grade: len(list(filter(criteria, scores))) for grade, criteria in grade_boundaries.items()}
        return grade_counts
    
    def main():
        num_scores = 100
        scores = generated_scores(num_scores)
        grade_counts = count_grades(scores)
        
        print("Generated Scores:", scores)
        print("Grade Counts:", grade_counts)
    
    main()
    

    なんかオサレなソースですが,こんなことを教えてはいないので,どこから拾ってきたのでしょうか?んで,出力は下のようにいい加減.

    Generated Scores: [94, 74, 54, 91, 75, 57, 62, 83, 60, 59, 99, 50, 51, 84, 81, 81, 68, 74, 60, 85, 87, 81, 78, 72, 50, 64, 55, 76, 83, 99, 98, 55, 98, 67, 98, 93, 55, 71, 74, 100, 66, 85, 53, 63, 59, 88, 88, 62, 93, 89, 77, 91, 65, 94, 61, 78, 89, 88, 79, 77, 58, 74, 61, 76, 85, 57, 61, 59, 84, 66, 100, 75, 99, 53, 97, 79, 65, 59, 70, 96, 84, 87, 86, 96, 54, 81, 54, 57, 61, 84, 82, 64, 73, 70, 60, 68, 58, 54, 52, 78]
    Grade Counts: {'S': 17, 'A': 22, 'B': 20, 'C': 19, 'D': 22}

    そして今回も出てきてしまいました絶対やっちゃダメ!なやつ.皆さん,場合分けが好きですね.こうしなくていいように,ヒントをつけていたつもりだったんですが...

    def S(score):
        return score >= 90
    def A(score):
        return 80 <= score < 90
    def B(score):
        return 70 <= score < 80
    def C(score):
        return 60 <= score < 70
    def D(score):
        return 50 <= score < 60
    
    print(*scores)
    print()
    print(f"S:", len(list(filter(S, scores))))
    print(f"A:", len(list(filter(A, scores))))
    print(f"B:", len(list(filter(B, scores))))
    print(f"C:", len(list(filter(C, scores))))
    print(f"D:", len(list(filter(D, scores))))
    

    num = [
        ('S', lambda score: score >= 90),
        ('A', lambda score: 80 <= score < 90),
        ('B', lambda score: 70 <= score < 80),
        ('C', lambda score: 60 <= score < 70),
        ('D', lambda score: score < 60)
    ]
    
    
    n_counts = {
        'S': len(list(filter(num[0][1], scores))),
        'A': len(list(filter(num[1][1], scores))),
        'B': len(list(filter(num[2][1], scores))),
        'C': len(list(filter(num[3][1], scores))),
        'D': len(list(filter(num[4][1], scores)))
    }
    
    
    print(f"S: {n_counts['S']}")
    print(f"A: {n_counts['A']}")
    print(f"B: {n_counts['B']}")
    print(f"C: {n_counts['C']}")
    print(f"D: {n_counts['D']}")
    

    s = list(filter(lambda i: i >= 90, num))
    a = list(filter(lambda i: i >= 80 and i < 90, num))
    b = list(filter(lambda i: i >= 70 and i < 80, num))
    c = list(filter(lambda i: i >= 60 and i < 70, num))
    d = list(filter(lambda i: i < 60, num))
    
    print()
    
    print(f'S: {len(s)}')
    print(f'A: {len(a)}')
    print(f'B: {len(b)}')
    print(f'C: {len(c)}')
    print(f'D: {len(d)}')
    

  3. 前回の復習

    関数についていろいろと学習しました.特に,教科書の p.286 にあるラムダ式について,演習問題や宿題を通していろいろと実習しました.また,map 関数や filter 関数などとラムダ式を組み合わせることで反復処理を使用しない方法もあることがわかったかと思います.

  4. モジュール

    今回はモジュールです.教科書にあるように自分で作成した関数を別ファイルとして用意しておいて,他のファイルとしてある Python スクリプトから呼び出すようにしたものがモジュールです.複数人で開発を担当する場合や,スクリプトをスッキリさせる場合など,実際のプログラミングでは必須のものですので,この機会に試しておきましょう.

    なお,今回は教科書 p.300 にあるモジュール検索パスについては,特に意識しなくてもいいように,カレントディレクトリにモジュールを置いておく単純なものとします.また,パッケージについては省略します.

  5. 演習

    今回の演習問題です.

  6. 宿題

    いつものようにレポート提出システムを利用します.授業当日の18:00から閲覧可能で,締切りは翌週月曜日の10:00です.

  7. 次回の予習範囲

    次回も引き続きモジュールを扱いますので,予習をしてきてください.


目次ページに戻る