Py

Py

使い方のコツ|問い合わせ

繰り返し学んでプログラミングスキルを磨こう!PyQで学習内容を読み返して復習できる機能を追加しました - Python学習チャンネル by PyQ

「未経験からのPython文法」コース Pythonはじめの一歩

5. print()、変数

  • 5-1: print関数の使い方とよくあるエラー

    • 構文エラー
      • プログラムの決まりを守って記述できていない
    • 例外
      • 文法には問題がないが、実行するとエラーが発生する
    • Name error

      • エラーが出た場合、エラーメッセージを詳しく見ると原因がわかります。

        • • 2行目はエラーの発生ファイル名、エラー発生行。

        • ファイル名はprint_name.pyです。画面に表示されていませんが、右側のコードのファイル名です。
          進捗: 0%

        • エラー発生行はline 2とあるので、print_name.pyの2行目です。
          進捗: 0%

        • • 最後の行にはNameError、name 'prant' is not definedと表示されています。

        • 1番目のNameErrorはエラーの種類です。
          進捗: 0%

        • 2番目のname 'prant' is not definedは例外が発生した原因。直訳すると名前prantは定義されていませんです。
          進捗: 0%

      • このエラーの原因はprintを間違って、prantと書いたことです。

    • syntax error
      • SyntaxError: EOL while scanning string literal
      • SyntaxErrorはプログラムの書き方が間違っている場合に発生します。この構文エラーが発生したら、文法的に間違いがないか確認しましょう。
  • 5-2: 変数への代入と利用
  • 5-3: 文字列の結合方法

    • コード

      • course = 'Python'

        文字列と結合して表示する
        print('こんにちは、' + '鈴木さん') # 文字列同士
        print(course + 'コースへようこそ') # 文字列と変数

      • age = 30
        年齢を表示しよう
        str()を用いることにより、数値が代入された変数と文字列を結合できました。
        print(str(age) + '才')

    • TypeError

      • TypeError: can only concatenate str (not "int") to str
        • 文字列(str)への結合(concatenate)は、数値(int)ではなく、文字列(str)でなければなりません。
  • 5-4: 文字列と変数を使ったプログラムを書く演習

6. 計算、if文

  • 6-1: 四則演算と剰余の使い方

      • 商の整数部分
        print(10 // 3)

      • 余り
        print(10 % 3)

  • 6-2: 変数を利用した計算

    • コード

      • 在庫本数
        stock = 97
        配達本数
        delivery = 20

        在庫計算
        new_stock = stock + delivery
        print('現在の在庫は' + str(new_stock) + '本')

        ダース単位の在庫計算
        dozen = new_stock // 12
        print('残り' + str(dozen) + 'ダース')

  • 6-3: if文の基本

    • else

      • 在庫数で注文するかどうかを判定
        stock = 10

        if stock < 10:
        print('注文する')
        else:
        print('注文しない')
        print('現在の在庫は' + str(stock) + '本です')

    • random関数(ランダム関数)

      • import random # 書き換え不可

        stock = 24
        random_used = random.choice([4, 5]) # 書き換え不可

  • 6-4: 比較演算

    • 等しくない
      • xが10と等しくない場合「xは10ではない」と表示
        if x != 10:
  • 6-5: if文でのelifの書き方

    • elif

      • import random # 書き換え不可

        在庫数の確認
        stock = random.choice([8, 10, 12]) # 書き換え不可
        print('stock=' + str(stock))

        if stock < 10:
        print('在庫は10本より少ない')
        elif stock == 10:
        print('在庫は10本')
        elif stock > 10:
        print('在庫は10本より多い')

  • 6-6: 数値の計算、if文を使ったプログラムの演習

7. list, for文

  • リストの作成・追加

    • リストの作成・参照

      • リストnumbers作成
        numbers = [100, 200, 300, 400, 500]

        先頭の要素の表示
        print(numbers[0])
        末尾の要素の表示
        print(numbers[-1])
        末尾から2番目の要素の表示
        print(numbers[-2])

    • リストのスライス

      • リストweekの作成
        week = ['月', '火', '水', '木', '金']

        3番目から4番目までの部分リスト
        print(week[2:4])
        先頭から3番目までの部分リスト
        print(week[:3])
        4番目から末尾までの部分リスト
        print(week[3:])

    • リストの途中に値を追加

      • リストnumbers作成
        numbers = [100, 200, 300, 400, 500]

        要素追加
        numbers.insert(1, 150) # 2番目
        4番目
        numbers.insert(3, 250)
        表示
        print(numbers)

        • 位置は数値で表します。0からはじまり、0は1番目を表し、1は2番目を表します。
    • リストの末尾に値を追加

      • リストfruit作成
        fruit = ['桃', '栗', '柿']

        末尾への梨の追加
        fruit.append('梨')
        表示
        print(fruit)

        • 実行結果
          ['桃', '栗', '柿', '梨']
  • 7-4: リストからの値の削除

    • 末尾の要素の削除

      • リストnumbersの作成
        numbers = [100, 200, 300, 400, 500]

        末尾の要素の削除
        numbers.pop()
        表示
        print(numbers)

        • 実行結果
          [100, 200, 300, 400]

        • リスト.pop()を使うと、リスト末尾の要素を削除

    • 途中の要素の削除

      • リストnumbers作成
        numbers = [100, 200, 300, 400, 500]
        2番目の要素の削除
        numbers.pop(1)
        表示
        print(numbers)

        • 実行結果
          [100, 300, 400, 500]
  • 7-5 リストの値を変更

    • リストnumbers作成
      numbers = [100, 200, 300, 400, 500]
      1番目の要素の変更
      numbers[0] = 50
      表示
      print(numbers)
  • 7-6: リストの繰り返し処理(ループ)を使おう

    • 曜日のリストを表示

      • リストweekの作成
        week = ['月', '火', '水', '木', '金']

        リストweekの内容を1つずつ表示しましょう。
        for day in week:
        print(day)

8. 辞書

  • 健康診断結果を扱うプログラム

    • データをまとめる空の辞書を作る
      health_result = {}

      要素の追加
      health_result['名前'] = '佐藤'
      health_result['年齢'] = 35
      health_result['体重'] = 60
      health_result['身長'] = 170
      health_result['視力'] = 2.0

      身長、体重の表示
      print(health_result['名前'], 'さんの', sep='')
      print('身長は', health_result['身長'], 'cmです', sep='')
      print('体重は', health_result['体重'], 'kgです', sep='')

      • 辞書とはキーと、対応する値を値を持つデータ
  • 初期データをもった辞書の作成

    • データを持つ辞書を作る
      health_result = {"名前" : "佐藤",
      "身長" : 170,
      "体重" : 60}

      表示
      print(health_result)

  • 8-3: 辞書の値の更新方法

    • 値の変更

      • health_result = {'名前': '佐藤', '年齢': 35, '身長': 170, '体重': 60, '視力': 2.0}

        名前を鈴木に変更
        health_result["名前"] = "鈴木"
        表示
        print(health_result)

  • 8-4: 辞書の値の削除

    • health_result = {'名前': '鈴木', '年齢': 35, '身長': 170, '体重': 60}

      年齢を削除
      del health_result["年齢"]

      del health_result["年齢"]
      age = health_result.pop("年齢")
      表示
      print(health_result)
      print(age) # 削除した値を表示

      • 辞書.pop() を利用すると、利用した値を順々に辞書から削除できます。
  • 8-5: 辞書にキーが存在するかを判定しよう

9. 集計

  • 9-4: リストとfor文、辞書を応用して集計しよう

    • 9-4-1 計算を省略 (代入演算子、インクリメントを省略)

      • x = 10
        y = 10

        xを1増加、yを1減少させましょう。
        x +=1 #x= x + 1と同じ
        y -=1
        print('x =', x)
        print('y =', y)

        • -- 実行結果 --
          x = 11
          y = 9
      • 補足

  • 9-5: for文とif文を組み合わせた高度な集計
    • 特筆する問題はなかった
  • 9-6: for文とif文を組み合わせたプログラムの演習
    • 特筆する問題はなかった

10. ファイル読込、文字操作

  • 10-1: ファイルの読み込み方法を学ぼう

    • 10-1-1: ファイルを読み込む

      • ※ここから下に書き写してください
        f = open('input/menu.csv', encoding='UTF-8')
        開いた内容を読み込む
        contents = f.read()
        表示する
        print(contents)
        ファイルを閉じる
        f.close()
    • 10-1-2: withキーワードで開く

      • ※ close() メソッドを書く必要がありません。
        with open('input/menu.csv', encoding="utf-8") as f:
        contents = f.read()
        print(contents)
  • 10-2: for文を使ってファイルを1行ずつ読み込む方法

    • 10-2-1 一行づつ読み込み

      • コード

        • with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          print(row)
      • 解説

        • for 変数 in ファイルオブジェクト: と書くと、ファイル1行分ずつの文字列]に代入
    • 10-2-2 行末の改行を削除

      • list_strip/rstrip/lstrip

      • コード

        • with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          str_row = row.rstrip()
          print(str_row)
      • 解説

        • rstripメソッドについて
          文字列.rstrip() メソッドは文字列の末尾部分に存在する空白文字(半角スペース 、 全角スペース 、 タブ 、 改行 など)を取り去ります。
  • 10-3: 文字列.splitを使った文字列の分割方法

    • 1 問題

      • コード

        • sample = 'a,b,c,d,e'

          sample_list = sample.split(",")

          print(sample_list)

    • 2 問題

      • コード

        • num_string = '100 200 300 400 500'

          nums = num_string.split(" ")

          for x in nums:
          print(x)

    • 3 問題

      • コード

        • with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          row_string = row.rstrip()
          columns = row_string.split(",")
          name = columns[0]
          price = columns1
          print(name + 'は' + price + '円')
      • 結果

        • コロッケ弁当は400円
          シャケ弁当は400円
          焼肉弁当は500円
          焼きそばは300円
          カレーライスは350円
          うな重は700円
          ビビンバ丼は600
      • 解説

        • 文字列の .split() メソッドを使って、メニューファイルの各行のデータを分解しました。
          各行はカンマ区切りの文字列なので、 row_string.split(',') を使って文字列リスト columns に変換しています。
          columns は以下のようなリストになります。
          columns = ["のり弁当", "350"]
          この columns リストから columns[0] や columns10 のように値(メニュー名と価格)を取り出しています。
          name = columns[0]
          price = columns10
  • 10-4: 読み込んだファイルの値をif文で判定しよう

      1. カラムの値を利用した計算

        • コード
        • print('<<2割引デー>>')
          with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          columns = row.rstrip().split(',')
          name = columns[0]
          price = int(columns1)

          二割引きの計算(0.8倍して整数にする)
          new_price = int(price * 0.8)
          print(name, 'は', new_price, '円', sep='')

      • 結果

        • <<2割引デー>>
          唐揚げ弁当は320円
          とんかつ弁当は440円
          ハンバーグ弁当は400円
          のり弁当は280円
          シャケ弁当は320円
          焼肉弁当は400円
          うな重は560円
          ビビンバ丼は480円
      • 解説

        • ファイルから読み出したデータは文字列なので、ファイル内に書かれていた「400」のような数値も "400" のような 数字(string) となります。
          数値として計算するためには、一度 int() 関数を使って「数字(string)」=>「数値(integer)」と変換する必要があります。
          columnsには ["唐揚げ弁当", "400"] のような値が入っているので、 columns16 は文字列の "400" です。
          以下のプログラムではこの「唐揚げ弁当の値段==400」を数値に変換しています。
          price = int(columns16)
          2割引きなので、元の値段に 0.8(= 1 - 0.2) をかけると、値引き後の値段(new_price)になります。
          new_price = int(price 0.8) で int() に再度変換しているのは、数値 0.8 としたことで小数を含む数値(浮動小数点数)にPythonが変換するからです。
          ここでは小数点以下を切り捨てて数値(整数の数値)に変換するために再度 int() を使っています。
          new_price = int(price 0.8)
          コラム(四捨五入)
          new_price = int(price
          0.8) は、小数点以下を切り捨てます。
          小数点第一位で四捨五入をしたい場合は、下記のようにします。
          new_price = int(price * 0.8 + 0.5)
    • 3.丼演習 (ifでorを用いた複数条件指定

      • コード
        • if name == "ビビンバ丼" or name == "うな重":
  • 10-5: ファイルの読み込み、for文、if文や辞書を応用する演習

      1. お弁当の注文数を集計

        • コード
        • orders = {} # この行は直さないでください

          ‘# ファイルinput/lunch.csvを開いて、集計
          with open("input/lunch.csv", encoding="utf-8") as f:
          for row in f:
          row_str = row.rstrip().split(",")
          lunch = row_str1

              if lunch in orders:  
                  orders[lunch] += 1  
              else:  
                  orders[lunch] = 1  

          表示
          for menu_name, count in orders.items():
          print(menu_name + ':' + str(count))

11

  • 11-1: 現在の日付、時刻を取得しよう

      1. datetime
        • コード
        • from datetime import datetime
          now = datetime.now()
          print(now)
      • 期待値
        • 2019-01-10 13:16:48.904193
      • 解説

        • モジュール とは、importして呼び出すだけで便利に使える処理を集めたものです。
        • from datetime import datetime」は datetimeモジュール中のdatetimeクラスのみを利用する場合は、下記のように定義します。これはdatetimeモジュール中のdatetimeクラスを利用するという定義です。
        • importの使い分け

          • モジュールを使う場合、 import モジュール と書くことで利用できるようになります。
            import datetime
            print(datetime.datetime.now()) # 現在時刻表示

          • from モジュール import 対象クラス と書くと、 モジュール.対象クラス と書く代わりに単に対象クラス名をプログラムに書くだけで使えるようになります。
            from datetime import datetime
            print(datetime.now()) # 現在時刻表示
            プログラムの記述量を減らしたい場合は、 from を使うとよいでしょう。

      1. 年月日
        • コード
        • from datetime import datetime
          now = datetime.now()
          print(now.year,now.month,now.day, sep="/")
      1. 時分秒
        • コード
        • now = datetime.now()
          print(now.hour,"時")
          print(now.minute,"分")
          print(now.second,"秒")
  • 11-2: 日時の作成

      1. 指定の日のdatetimeオブジェクトを作成しよう

        • コード
        • from datetime import datetime

          one_day = datetime(2016,1,31)
          print(one_day)

      • 解説
        • datetime(年, 月, 日, 時, 分, 秒)と指定できます。時分秒を省略すると00:00:00となります。
        • datetime(年, 月, 日, 時, 分, 秒)の値の指定順は決まっています。
      1. 指定の日時のdatetimeオブジェクトを作成
        • コード
        • one_datetime = datetime(2016,5,5,14,15,30)
          print(one_datetime)
  • 11-3: 日時を文字列に変換

    • 1. 年月日の文字列

      • コード

        • one_day = datetime(2016, 8, 11)

          str_one_day = f'{one_day:%Y/%m/%d}'
          print(str_one_day)

      • 解説

        • f-stringsは、Python3.6から使えるようになったフォーマット済み文字列リテラル(formatted string literal)です。
          フォーマットは文字列中にフォーマット記号を指定し、一緒にその他の文字列も指定します。
          代表的なフォーマット記号は以下です。
          • %Y: 西暦(4桁)の10進表記を表します。
          • %m: 0埋めした10進数で表記した月。
          • %d: 0埋めした10進数で表記した月中の日にち。
          • %H: 0埋めした10進数で表記した時 (24時間表記)。
          • %M: 0埋めした10進数で表記した分。
          • %S: 0埋めした10進数で表記した秒。

        • その他のフォーマット指定については、「strftime() と strptime() の振る舞い」の表を参照ください。
          以下は、年月日を色々なフォーマットで表しています。
          print(f'{now:%Y/%m/%d}') # -> 2016/01/10
          print(f'{now:%Y-%m-%d}') # -> 2016-01-10
          print(f'{now:%Y年%m月%d日}') # -> 2016年01月10日

      1. 時分秒の文字列を表示

        • コード
        • one_day = datetime(2016, 5, 5, 14, 55, 22)

          str_time = f'{one_day:%H:%M:%S}'
          print(str_time)

      1. 日時の文字列を表示

        • コード
        • one_day = datetime(2015, 12, 31, 23, 55, 2)

          str_datetime = f'{one_day:%Y-%m-%d %H:%M:%S}'
          print(str_datetime)

  • 11-4: 文字列を日時に変換
    リンク: 文字列を日時に変換

      1. 文字列を日付に変換

        • コード

        • str_date = '2016年12月31日'
          one_date = datetime.strptime(str_date, '%Y年%m月%d日')
          print(one_date)

          • strpはstring pointer か?諸説あるらしい
        • 解説

        • • strptime() : 文字列から日時への変換
          文字列を指定したフォーマットで日時に変換します。

        • strftime() と strptime() の振る舞い」の表を参照ください。

    • 2 文字列を日付に変換
      • コード
        • str_day = '2016/01/15 09:15:31'
          one_day = datetime.strptime(str_day, '%Y/%m/%d %H:%M:%S')
          print(one_day)
  • 11-5: 日時の差分(何日前、何日後)を計算

      1. 2日前の日付を表示

        • コード
        • from datetime import datetime
          from datetime import timedelta

          olympic_day = datetime(2020, 7, 24)
          before_2days = olympic_day - timedelta(days=2)
          ‘# 表示
          print(before_2days.date())

      • 解説

        • timedeltaは日付や時間の計算に使います。
          timedelta(days=3)は3日分を表します。nowに足すと3日後、引くと3日前になります。

          • from datetime import datetime, timedelta
            now = datetime.now()

            before_3days = now - timedelta(days=3) # 3日前
            after_3days = now + timedelta(days=3) # 3日後

      1. 20日後の日付

        • コード
        • from datetime import datetime
          from datetime import timedelta

          one_day = datetime(2016, 12, 31)
          after_20days = one_day + timedelta(days=20)
          ‘# 表示
          print(after_20days.date())
          print(after_20days - one_day)
          print(after_20days > one_day)

      • 解説

        • • 日付時刻オブジェクトにtimedeltaオブジェクトを足すと、その時間を足した日付時刻オブジェクトになります。
          ◦ one_day + timedelta(days=20)で、one_dayの20日後になります。
          • 日付時刻オブジェクトから日付時刻オブジェクトを引くと、差はtimedeltaオブジェクトになります。
          ◦ after_20days - one_dayは、20日を表すtimedeltaオブジェクトになります。
          • 日付時刻オブジェクト同士は、数字のように比較できます。
          ◦ after_20daysはone_dayより未来なので、after_20days > one_dayはTrueになります。
          ※ 日付時刻オブジェクト同士の比較演算として、 <, <=, >, >=, ==, != が使えます。

        • timedeltaを利用すると、年や月を気にせずに日付を計算できます。

  • 11-6: 日時の使い方、文字列との変換、日時の比較をする演

12

  • 12-1: open()関数を使ってファイルへ出力しよう

    • 1 ファイルへの書き込み

      • コード

        • ポイント
          • ファイルへの書き込み
            • open(‘...txt’, ‘w’....)
        • with open('output/output.txt', 'w', encoding='utf-8') as f:
          f.write("hello, world\n")
          print('書き込み完了')
      • 解説

        • ファイルを開くモード
          • ファイルを開くときに指定するモードには以下の種類があります。
            • • r: 読み込み専用。省略可能。
            • • w: 書き込みするときに指定。ファイルが存在しない場合、新しいファイルが作られる。
            • • x: ファイルが存在しない場合のみ、ファイルを作成し、書き込む。ファイルが存在する場合は何もしない。
            • • a: 末尾に書き込み。ファイルが存在しない場合はファイルを作成し、書き込む。
    • ループを利用してファイルに出力しよう

      • コード

        • week_duty = ['月曜日は木田',
          '火曜日は西川',
          '水曜日は大村',
          '木曜日は岡田',
          '金曜日は中村']
          with open('output/trash.txt', 'w', encoding='utf-8') as f:
          for item in week_duty:
          f.write(item + '\n')
          print('書き込み完了')

        • ポイント

          • 改行
      • 解説
        • for文 を利用してリストの要素を1行に1要素ずつ書き込んでいます。 write() は print() 関数のように改行文字を行の末尾に自動で追加しないので、改行したい場合は \n を忘れないようにしましょう。
    • 3 辞書からテキストファイルへ書き込み

      • コード

        • ポイント
          • 文字列への変換
            • str(now)
          • 辞書からのfor文でのkey、値取得
            • dictionary.items()
          • 改行
            • ‘\n’
        • stationery = {'ボールペン': 22,
          'ノート': 31,
          'のり': 8,
          'セロハンテープ': 24,
          'ホッチキス': 7
          }

          with open('output/stationery.txt', 'w', encoding='utf-8') as f:
          for key, value in stationery.items():
          f.write(key + 'は' + str(value))
          f.write('\n')

          print('書き込み完了')

      • 解説

        • 辞書.items() を使うと、繰り返しの中で、キーと値のペアを取得できます。キーは変数 key 、値は変数 value に代入されます。
  • 12-2: 日時をファイルへ出力しよう

    • 出勤時刻をファイルに出力しよう (追記)

      • コード

        • ポイント
          • 追記(append)
            • open(‘...txt’, ‘a’...)
        • from datetime import datetime

          now = datetime.now()
          str_now = f'{now:%Y/%m/%d %H:%M}'
          with open('output/work.log', 'a', encoding='utf-8') as f:
          f.write(str_now + " - 出勤\n")
          print('書き込み完了')

      • 解説

        • open(ファイルパス, 'a') と、 open() に 'a' をつけると、ファイルの末尾に追加して書き込みます。
          'w' を指定した場合はファイルの書かれていた内容は上書きされ、消えてしまいます。
    • 2 出退勤時刻をファイルに出力しよう

      • コード

        • ポイント
          • 時刻から時間のみ抜き出す
            • now.hour
        • from datetime import datetime

          now = datetime.now()
          str_now = f'{now:%Y/%m/%d %H:%M}'
          with open('output/attendance.log', 'a', encoding='utf-8') as f:
          if 6 <= now.hour < 14:
          f.write(str_now + " - 出勤\n")
          else:
          f.write(str_now + " - 退勤\n")
          print('書き込み完了')

  • 12-3 追加演習_ 出退勤時刻をファイルに出力するプログラム

    • 1

      • コード

        • from datetime import datetime

          ‘# 現在の時刻を取得し、文字列に変換
          now = datetime.now()
          str_now = f'{now:%Y/%m/%d %H:%M:%S}'

          ‘# 出勤時間か、退勤時間かを判定
          if 7 <= now.hour < 12:
          action = '出勤'
          else:
          action = '退勤'

          ‘# 出力文字列作成
          write_string = str_now + ' - ' + action + '\n'
          print(write_string)

          with open('output/timecard.log', 'a', encoding='utf-8') as f:
          f.write(write_string)

    • 2

      • コード
        • working_day = ['2016-07-11',
          '2016-07-12',
          '2016-07-13',
          '2016-07-14',
          '2016-07-15']
          with open('output/working_days.log', 'w', encoding='utf-8') as f:
          for day in working_day:
          f.write(day)
          f.write('\n')
          print('書き込み完了')

13 はじめの総合演習

  • 13-1: print()、変数の総合演習

    • 1
  • 13-2: 計算とif文の条件分岐を応用した総合演習

    • 2

      • ポイント
        • 商|割り算(小数点以下切り捨て)
          • print(13//5) -> 2
        • 商|割り算(余り)
          • print(13%5)
      • コード

        • import random # 書き換え不可

          ‘# 1ダースの本数
          dozen = 12
          ‘# 注文希望本数
          order = random.choice([144, 145]) # 書き換え不可
          print('注文希望本数:', order, sep='')

          ‘# 注文ダース数計算
          order_dozen = order // dozen
          ‘# 余りの計算
          amari = order % dozen

          ‘# 注文ダース数を表示
          print(order_dozen, 'ダース注文します。', sep='')

          ‘# 余りがある場合はその本数を表示
          if amari != 0:
          print('あと', dozen - amari, '本で、もう1ダース注文できます。', sep='')

  • 13-3: リスト、for文の総合演習

    • 2

      • ポイント
        • リスト操作
          • 末尾に追加
            • duty.append(‘山田’)
          • 挿入
            • duty.insert(2,’中村’)
          • 変更
            • duty1 = ‘西川’
          • 削除
            • duty.pop(0)
      • コード

        • ‘# 当番社員リスト
          duty = ['伊藤', '清水', '遠藤', '川島']

          ‘# 初期状態を表示
          for employee in duty:
          print(employee)

          ‘# 追加(末尾)
          duty.append('山田')
          print('++ 末尾に「山田」を追加 ++')

          ‘# 追加(3番目)
          print('++ 前から3番目に「中村」を追加 ++')
          duty.insert(2,'中村')

          ‘# 変更(2番目)
          print('++ 前から2番目を「西川」に変更 ++')
          duty1='西川'
          ‘# 削除(1番目)
          print('++ 前から1番目の社員を削除 ++')
          duty.pop(0)

    • 3

      • リスト操作
        • 末尾の要素の削除
          • fruit_line.pop()
        • 先頭の果物を取り出して、末尾に移動しました。
          • last_fruit = fruit_line.pop(0)
            fruit_line.append(last_fruit)
  • 13-4: 辞書の総合演習

    • 1 健康診断結果を扱うプログラム

      • ポイント

        • 辞書を作成し、キーと値を追加

          • health_result={}
            ‘# 身長、体重の表示
            health_result['名前']='佐藤'
        • 辞書のprint

          • print(health_result['名前'],'さん(',health_result['年齢'],')の',sep="")
      • コード
        • ‘# 辞書health_resultを作成
          health_result={}
          ‘# 身長、体重の表示
          health_result['名前']='佐藤'
          health_result['年齢']=35
          print(health_result['名前'],'さん(',health_result['年齢'],')の',sep="")
    • 2 文房具の在庫を修正

      • ポイント
        • 辞書の値の書き換え
          • stationery['えんぴつ'] = 20
        • 辞書のキーと値の削除
          • del stationery[‘のり’]
      • コード

        • stationery = {'ボールペン': 22,
          'ノート': 31,
          'のり': 8,
          'えんぴつ': 24}

          ‘# 在庫項目の追加
          stationery['消しゴム'] = 10
          ‘# 在庫の変更
          stationery['えんぴつ'] = 20
          ‘# 在庫項目の削除
          del stationery['のり']

  • 13-5: ファイルの読み込み、for文、if文を応用する総合演習

    • 1 お弁当の注文ファイルの読み込み

      • ポイント

        • ファイルを一行づつ読み込み

          • with open('input/lunch.csv', encoding='utf-8') as file:
            for row in file:
        • 末尾の空白文字を削除

          • columns = row.rstrip().split(',')
      • コード

        • with open('input/lunch.csv', encoding='utf-8') as f:
          for row in f:
          columns = row.rstrip().split(',')
          name = columns[0]
          lunch = columns1

              if lunch == 'コロッケ弁当':  
                  print(name)  
    • 2 会議室予約ファイルの読み込み

      • ポイント
        • リストに存在するか?
          • if name not in book_user:
      • コード
        • book_user = []
          with open('input/room.csv', encoding = 'utf-8') as f:
          for row in f:
          columns = row.rstrip().split(',')
          room = columns[0]
          name = columns1
          if room == '会議室A':
          if name not in book_user:
          book_user.append(name)
  • 13-6: ファイルへの書き込み、読み込みの総合演習

    • 1 果物一覧をファイルに出力しよう

      • ポイント

        • ファイルへの書き込みと改行
          • with open('output/fruit.txt', 'w', encoding = 'utf-8') as f:
            f.write(item +’ \n’)
      • コード

        • fruit_list = ['りんご', 'みかん', 'ぶどう', 'もも', 'バナナ', 'きんかん']
          with open('output/fruit.txt', 'w', encoding = 'utf-8') as f:
          for item in fruit_list:
          f.write(item)
          f.write('\n')
    • 2 条件と一致する行を出力しよう

      • ポイント
        • リストに値を追加
          • row_output.append(row)
      • コード

        • row_output = []

          with open("input/books.csv", encoding = 'utf-8') as f:
          for row in f:
          columns = row.strip().split(",")
          purpose = columns2
          if purpose == "Python-勉強会":
          row_output.append(row)
          with open('output/book_python.csv','w',encoding='utf-8') as fw:
          for row in row_output:
          fw.write(row)

  • 13-7: 日時、文字列との変換の総合演習

    • 1 5日前の日付を表示するプログラム

      • コード

        • from datetime import datetime
          from datetime import timedelta

          ‘# 指定日
          str_date = '2016-10-20'

          ‘#★文字列を 日付へ変換
          base_time = datetime.strptime(str_date, '%Y-%m-%d')
          ’# 5日前
          five_days_ago = base_time - timedelta(days=5)
          ‘# ★文字列に変換
          print_date = f'{five_days_ago:%Y-%m-%d}'
          ’# 表示
          print(print_date)

      1. ファイルを読み込んで日時に変換

        • コード
        • from datetime import datetime

          with open('input/days.txt', encoding='utf-8') as f:
          for row in f:
          'strptimeで文字列を日付に変換。rstripで文末の空白等を削除
          base_date = datetime.strptime(row.rstrip(),'%Y-%m-%d')
          str_date = f'{base_date:%Y/%m/%d}'
          print(str_date)

      1. ファイルを読み込んで、指定の5日間の日付を表示

        • コード
        • from datetime import datetime
          from datetime import timedelta

          ‘# 基準の日付
          str_date = '2016-10-20'
          ‘# 文字列を日付へ変換
          base_day = datetime.strptime(str_date, '%Y-%m-%d')
          ‘# 5日前の日付 (差分)
          five_days_ago = base_day - timedelta(days=5)
          ‘# ファイルinput/days.txtを開く
          with open('input/days.txt', encoding='utf-8') as f:
          for row in f:
          ‘# 文字列を日付へ変換
          day = datetime.strptime(row.rstrip(),'%Y-%m-%d')
          ‘# 日付を比較 ★比較演算子:「以上」
          if five_days_ago <= day < base_day:
          print(f'{day:%Y/%m/%d}')

  • 13-8: ファイル読み込み、for文、if文と辞書を応用した集計の総合演習

      1. お弁当の注文数を集計するプログラム

        • orders = {} # この行は直さないでください

        ‘# ファイルinput/lunch.csvを開いて、集計
        with open('input/lunch.csv',encoding='utf-8') as f:
        for row in f:
        末尾の空白削除 => strip
        columns = row.rstrip().split(',')
        name = columns[0]
        lunch = columns1
        if lunch in orders:
        orders[lunch] += 1
        else:
        orders[lunch] = 1
        ‘# 表示
        print(orders)

      1. 会議室の予約数を集計するプログラム

14 はじめのチャレンジ

    1. 1〜10までの総和
      • ‘# 問題:1〜10まで繰り返して、その合計数を表示して下さい
        sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        ‘#★変数のスコープ、ブロックの外で使うには?
        total = 0
        for item in sample_list:
        ‘#★変数を用いたインクリメント
        total += item
        print(total)
    1. 世界のナベアツ
      • ’# 問題:let's ナベアツ
        sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
        for num in sample_list:
        ’#★数値に"3"が含まれるか判定する
        if num % 3 == 0 or '3' in str(num):
        print("アホ")
        else:
        print(num)
  • 14-3: チャレンジ!ファイル読み込みと日時処理

      1. 今月の予約状況の表示

        • """今月の予約一覧を表示."""

        from datetime import datetime

        now = datetime.now()

        '# ファイルの読み込み
        with open('input/books.csv', encoding='utf-8') as f:
        for row in f:
        data = row.rstrip().split(',')
        book_date = datetime.strptime(data[0], '%Y-%m-%d') '# 利用日
        purpose = data2 '# 会議室の利用目的

            '# 今月分だけ表示(★日付型から年の取得、月の取得)  
            if book_date.year == now.year and book_date.month == now.month:  
                view_date = f'{book_date:%m/%d}'  '# 日付の整形  
                print(view_date + ':' + purpose)  '# 表示  
    • 2 過去100日間の会議室の利用目的別の集計

      • """過去100日間の会議室の利用目的別の集計."""
        from datetime import datetime, timedelta

        PERIOD_DAYS = 100

        ‘# キーに「会議室の利用目的」、バリューに利用回数の合計を入れて計算する
        purpose_count = {}

        now = datetime.now()
        today = datetime(now.year, now.month, now.day) # 本日の0:00:00時点の日付
        agg_since_date = now - timedelta(days=PERIOD_DAYS) # 今から PERIOD_DAYS 前の日時

        ‘# ファイルの読み込み
        with open('./input/books.csv', encoding='utf-8') as f:
        for row in f:
        columns = row.strip().split(',')
        date_str = columns[0] # 日付
        purpose = columns2 # 会議室の利用目的

            reservation_date = datetime.strptime(date_str, '%Y-%m-%d')  

        利用された日付がPERIOD_DAYS前の日時以上、今現在未満であれば集計対象
        if agg_since_date <= reservation_date < today:
        if purpose in purpose_count:
        purpose_count[purpose] += 1
        else:
        purpose_count[purpose] = 1

        ‘# ファイルに書き込み
        with open('./output/count_purpose.csv', 'w', encoding='utf-8') as f:
        for purpose, count in purpose_count.items():
        f.write(purpose + "," + str(count) + "\n")

  • 14-4: チャレンジ!ファイル読み込みと集計処理

15

  • 15-1: おみくじを作ろう

73. Jupyter Notebookの使い方

Jupyter Notebook

  • 対話式にコードを実行できる
  • 実行したコードと実行結果を合わせたファイル、 ノートブック を生成
  • ノートブックファイルはEメール、Dropbox、GitHubなどで共有することにより、コードと実行結果を他者と共有
  • 実行:[Shift]キー+[Enter]
  • Jupyter Notebookprint()関数を書かなくても、セルの一番最後に書いた変数の値を表示します。
  • セルの中でインラインでメソッドのヘルプを確認
    • [Shift]キー+[Tab]キー
      • 2回連続=>詳しい説明
    • 前のクエスチョンのNotebookを取り込んで実行
      • %run 1.ipynb

73-2: Jupyter Notebookでのモジュールの使い方を学ぼう

  • いちどimportしたモジュールは違うセルでも利用できます

73-3: Jupyter Notebookでの関数の使い方を学ぼう

73-4: Jupyter Notebookのメニューの使い方を学ぼう

  • コマンドモードショートカット
    • • 保存(s)
    • • 直下に新規のセルを増やす(b)
    • • セルの切り取り(x)
    • • セルのコピー(c)
    • • セルのペースト(v)
  • 数式の記述
    • • $数式$:インライン数式(文中に埋め込まれます)
      • $$数式$$:ディスプレイ数式(別の行になります)

73-5: Jupyter Notebookのグラフ描画とマジックコマンド

  • 1 グラフを表示

    • %matplotlib inline
      import matplotlib.pyplot as plt
      plt.title('Test Graph') #title
      plt.plot([1,2,3,4]); #折れ線グラフの出力
  • 2 マジックコマンド

    • • %コマンド:ラインマジックコマンドといいます。1行からなるコマンドです。
    • • %%コマンド:セルマジックコマンドといいます。1セルからなるコマンドです。
  • 3 変数保存

    • マジックコマンドで変数保存

      • 変数aをJupyterのDBに保存
        a = 20
        %store a

      • 保存されている変数の一覧
        %store

      • del a #変数aを削除
        try:
        print(a)
        except NameError as e:
        print(e)

      • aを戻す
        %store -r
        print(a)

      • JupyterのDBのデータは、~/.ipython/profile_default/db/autorestoreフォルダに変数名のファイルで保存されます。中味はpickle形式です。

      • pickle形式は、pickleライブラリーでサポートされているPython固有のバイナリー形式です。高速に読み書きできます。

      • Pythonの実行環境と「JupyterのDB」は別々に管理されます。

      • コードのようにdel aとすることで、Pythonの実行環境から変数aを削除します。これにより、変数aが存在しなくなります。ただし、JupyterのDBは無関係なので、%store -rとすることで変数aを再度、利用できるようになります。

      • open関数の'wb'モードと'rb'モード

        • データを単なる数字の連続データとみなしたとき、そのデータのことを、バイナリー形式のデータといいます。コンピューターの内部ではデータを0と1を用いているため、バイナリー(binary)という言い方をします。
        • open関数の第2引数の'wb'は、バイナリーの書き込みモードを指定しています。
        • open関数の第2引数の'rb'は、バイナリーの読み込みモードを指定しています。
        • pickleを使う場合は、バイナリーの指定が必要です。
投稿フッター
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存