カテゴリー

  • プログラミング
  • 英語学習
  • 海外
  • キャリア
  • Kredo
Kredoオンラインキャンプ
KredoIT留学
無料カウンセリングはこちら
Kredoオンラインキャンプ体験談
KredoIT留学体験談
外貨を稼ぐ!海外フリーランス無料セミナー
未経験から即戦力ITグローバル人材 無料セミナー
Kredo Blog 英語・IT・AIで、人生の選択肢を広げる。
無料ウェビナー参加 ↗ 無料カウンセリング予約無料相談↗
MENU
EXPLORE KREDO BLOG

知りたいことから、世界が広がる。

ブログTOP ↗
留学・セブSTUDY & LIFE
留学・セブの記事をすべて読む ↗ 海外留学→海外移住→海外就職→
英語学習ENGLISH
英語学習の記事をすべて読む ↗ 英語学習法→英語フレーズ→
IT・AITECH & CREATIVITY
IT・AIの記事をすべて読む ↗ プログラミング学習→プログラミング知識→AI・テクノロジー→デザイン→
キャリアYOUR NEXT CHAPTER
キャリアの記事をすべて読む ↗ 転職情報→キャリアデザイン→
KredoOUR SCHOOL
Kredoの記事をすべて読む ↗ ニュース・キャンペーン→セブ島情報→インタビュー→
STUDENT DIARIES留学生のリアルな日記noteの体験記を読む ↗YouTube・Instagramで留学を知る ↗
記事を探す ブログTOP
留学・セブ
STUDY & LIFEセブで学ぶ。海外で暮らす。留学の準備から、現地の毎日まで。
留学・セブを知るすべての記事 ↗
海外留学費用・期間・学校選びを知る↗海外移住海外で暮らすためのヒント↗海外就職世界で働く選択肢を探す↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
英語学習
ENGLISH英語が、世界を近くする。学び方と、今日から使える英語。
英語学習を知るすべての記事 ↗
英語学習法自分に合った学び方を見つける↗英語フレーズ会話で使える表現を読む↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
IT・AI
TECH & CREATIVITYつくる力を、次の一歩に。プログラミングとAIをもっと身近に。
IT・AIを知るすべての記事 ↗
プログラミング学習はじめ方・学び方を知る↗プログラミング知識仕組みやスキルを深める↗AI・テクノロジーAIの活かし方と最新の話題↗デザイン伝わるものづくりのヒント↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
キャリア
YOUR NEXT CHAPTER学びの先の、働き方。転職・海外就職・これからのキャリア。
キャリアを知るすべての記事 ↗
転職情報次の仕事へ向かう準備↗キャリアデザイン自分らしい働き方を考える↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
Kredo
OUR SCHOOLKredoを、もっと知る。学校のこと、セブのこと、学ぶ人のこと。
Kredoを知るすべての記事 ↗
ニュース・キャンペーンKredoからのお知らせ↗セブ島情報現地の暮らしを知る↗インタビュー受講生・卒業生の声を読む↗
FROM CEBU / note留学生の、
リアルな毎日。
写真とことばで読む留学日記日記を読む ↗
留学日記 ↗

ENGLISH · IT · AI / STUDY IN CEBU

学ぶって、冒険だ。

英語・IT・AIで、人生の選択肢を広げよう。

留学の無料相談へ ↗Kredo Blogを読む →
JAPAN✈CEBU
Kredoで、講師と一緒に英語とITを学ぶ受講生
LEARN SOMETHING NEW.
セブの海を望む場所で学ぶ日常
HELLO, NEW WORLD.
  • TOP
  • プログラミング
  • Web・プログラミング(学習)
  • Pythonサンプルコード20選|実行結果・改造練習と安全な試し方

Pythonサンプルコード20選|実行結果・改造練習と安全な試し方

アバター画像
Kredo編集部
公開日:2023.04.20
更新日:2026.10.23
Web・プログラミング(学習) |
木製の机で練習用の表とノートを広げ、鉛筆で行を確かめるPython学習の写真風イメージ

こんにちは、Kredo Blog編集部です。Pythonを入れてみたものの、「次は何を作ればいい?」「コピーしたコードが動いたけれど、どこを変えればいい?」と迷っていませんか。

最初は、文字を表示する2行で十分です。そこから点数の分岐、ゲーム、CSVの集計へと進めば、入力したものがどう処理され、どこへ結果が出るのかを一つずつつかめます。この記事では従来の20例を、実行結果と改造練習付きで紹介します。

ファイルを作る例は本物のデータから切り離した新規フォルダで、Webの例は自分のパソコン内で試します。まず1本を選び、予想してから動かしてみましょう。

新規CTA

このページの読み方

  • まず1本を動かす
  • 20例の選び方
  • 基本の文法8例
  • ゲーム2例
  • 自動化5例
  • Web3例
  • データ分析2例
  • 4つの改造練習
  • 公開サイト9選
  • 使う前の確認
  • 英語で検証を伝える
  • よくある質問

Pythonサンプルコードの動かし方|まず1本を保存して実行する

sample.pyを保存し、Pythonで実行して表示結果を確認する3段階

Python未導入なら、まずMacでPythonを導入する方法またはPython公式ダウンロードを確認してください。以下は導入後の手順です。OSで使える起動コマンドが違うため、最初にバージョンを確かめます。

# macOS / Linux
python3 --version
# Windows
py --version

エディタで新しいファイルを作り、次の2行を貼り付けてUTF-8のsample.pyとして保存します。端末では、そのファイルを保存したフォルダへ移動してから実行します。拡張子がsample.py.txtになっていないことも確認しましょう。

print("Hello, Python!")
print("こんにちは、Python!")
# macOS / Linux
python3 -B sample.py
# Windows
py -B sample.py

この記事の長い例は、引数の受付や安全なファイル作成の共通部品も含みます。20例・入力データ・4問と解答・検証ログの教材ZIPを新しい空フォルダへ展開し、その中で各ファイルを1本ずつ実行すると再現できます。11・12・15・16・20は同梱のpractice.pyも必要です。コードだけを抜き出して実データの場所へ持ち込まないでください。

追加ライブラリは15・17・18・19・20で使います。16のhttp.serverは標準ライブラリです。必要な例の分だけ、専用の仮想環境へ導入します。以下は新しい空フォルダへ展開した直後の手順です。.venvが既にある場所では実行せず、別の新しい展開先を選んでください。仮想環境は依存関係を分けるもので、ファイル操作を無害化する仕組みではありません。

# macOS / Linux:教材を展開したフォルダで
python3 -B -m venv .venv
.venv/bin/python -m pip install openpyxl Flask beautifulsoup4 pandas matplotlib

# Windows:教材を展開したフォルダで
py -m venv .venv
.venv\Scripts\python.exe -m pip install openpyxl Flask beautifulsoup4 pandas matplotlib

以下のpython3を、仮想環境を使う場合は.venv/bin/python、Windowsでは.venv\Scripts\python.exeへ読み替えます。標準ライブラリだけならWindowsのpyでも実行できます。依存パッケージをインターネットから取得する操作と、教材コードの実行は別です。外部Web取得の任意版だけはrequestsも必要です。

2026年10月8日JSTの検証環境はPython 3.12.14、Linux。openpyxl 3.1.5、Flask 3.1.3、Beautiful Soup 4.15.0、pandas 2.2.3、matplotlib 3.10.8を使用しました。各コードの結果は教材内のログに記録しています。Linuxでの実行検証であり、macOS・Windowsの実機操作、Excelでの再計算は未確認です。ゲームはqまたはCtrl+C、Webサーバーは起動した端末でCtrl+Cを使って止めます。

Pythonサンプルコード20選|目的と作用先で選ぶ

最初のおすすめは1→3→6です。画面へ表示するだけの例で流れをつかんだら、興味のある用途へ進みます。「動くか」だけでなく、どこへ作用するかも見て選んでください。

例と目的 追加導入 入力・作用先
1. 文字を表示する(Hello World) 標準のみ 画面表示
2. 変数で消費税を計算する 標準のみ 画面表示
3. if文で点数を評価する 標準のみ 画面表示
4. for文で九九の表を作る 標準のみ 画面表示
5. while文でカウントダウンする 標準のみ 画面表示
6. リストで平均点を出す 標準のみ 画面表示
7. 辞書で英単語帳を作る 標準のみ 画面表示
8. 関数でBMIを計算する 標準のみ 画面表示
9. 数当てゲーム 標準のみ キーボード入力・画面表示
10. じゃんけん 標準のみ キーボード入力・画面表示
11. CSVファイルの売上を商品ごとに集計する 標準のみ 指定した新規練習フォルダのみ変更
12. フォルダ内のファイル名を連番に変える 標準のみ 指定した新規練習フォルダのみ変更
13. 英文の単語の出現回数を数える 標準のみ 画面表示
14. 今日の日付と、来年の元日までの日数を出す 標準のみ 画面表示
15. Excelファイルを作る(openpyxl) openpyxl 指定した新規練習フォルダのみ変更
16. 自分のパソコンでWebサーバーを動かす(http.server) 標準のみ 教材HTML作成・ローカル待受け
17. Flaskで入力フォームのあるWebサイトを作る Flask ローカル待受け・フォーム入力
18. Webページのタイトルとリンクを取得する(requests・Beautiful Soup) Beautiful Soup(任意版requests) 同梱HTML読取(任意版だけ外部通信)
19. pandasで表を集計する pandas 画面表示
20. matplotlibで折れ線グラフを作る matplotlib 指定した新規練習フォルダのみ変更

初心者向けの簡単なプログラム例|基本の文法8例

ifやforの中は、半角スペース4つで字下げします。基本例は値を1か所だけ変えると、原因と結果を追いやすくなります。

1. 文字を表示する(Hello World)

printは、かっこの中の文字を画面に出します。まずは2行とも表示できれば成功です。引用符は文字の範囲を示す記号なので、全角の引用符に置き換えないでください。

保存するファイル:01_hello.py。

def main():
    print("Hello, Python!")
    print("こんにちは、Python!")

if __name__ == '__main__':
    main()
python3 -B 01_hello.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

Hello, Python!
こんにちは、Python!

Pythonの部分を自分の好きな言葉に変え、変えた1行だけが出力で変わるか確かめましょう。

2. 変数で消費税を計算する

1200円に10%を掛け、税額120円と合計1320円を出す例です。priceは金額、tax_rateは割合を入れる変数です。

保存するファイル:02_tax.py。

"""架空の買い物による計算練習。実務の税処理は扱いません。"""
from decimal import Decimal, ROUND_DOWN

def total_price(price, tax_rate):
    if price < 0 or not tax_rate.is_finite() or tax_rate < 0:
        raise ValueError('価格・税率は0以上の有限値にしてください')
    tax = int((Decimal(price) * tax_rate).quantize(Decimal('1'), rounding=ROUND_DOWN))
    return tax, price + tax

def main():
    price = 1200
    tax_rate = Decimal('0.10')
    tax, total = total_price(price, tax_rate)
    print(f'税抜価格:{price}円')
    print(f'消費税:{tax}円')
    print(f'税込価格:{total}円')

if __name__ == '__main__':
    main()
python3 -B 02_tax.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

税抜価格:1200円
消費税:120円
税込価格:1320円

これは構文を学ぶための架空の計算です。Decimalで小数を10進数として扱い、ROUND_DOWNで1円未満を切り捨てます。実務では端数処理や税の適用条件が異なるため、そのまま使いません。まずpriceだけを2000に変えて2200円になるか試します。

3. if文で点数を評価する

条件は上から調べ、最初に当てはまった枝だけを実行します。80以上を先に書くから、80点がBにならずAになります。

保存するファイル:03_grade.py。

import argparse

def grade(score):
    if not 0 <= score <= 100:
        raise ValueError('点数は0〜100の整数です')
    if score >= 80:
        return 'A'
    elif score >= 60:
        return 'B'
    return 'C'

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--score', type=int, default=78)
    args = parser.parse_args()
    print(f'評価:{grade(args.score)}')

if __name__ == '__main__':
    try:
        main()
    except ValueError as error:
        raise SystemExit(f'停止:{error}')
python3 -B 03_grade.py --score 78

確認用の実行結果(乱数の例は上記seedを指定した場合):

評価:B

59・60・79・80を入れた結果を、実行前にメモしましょう。0〜100の整数だけを受け付ける仕様にしています。範囲外をCに紛れ込ませないことも、この例の練習です。

4. for文で九九の表を作る

外側のforで段を選び、内側のforで1〜9を掛けます。range(1, 10)の10は含みません。:3は幅3文字で右寄せする表示指定です。

保存するファイル:04_times_table.py。

def main():
    for i in range(1, 10):
        row = ''
        for j in range(1, 10):
            row += f'{i * j:3}'
        print(row)

if __name__ == '__main__':
    main()
python3 -B 04_times_table.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81

内側だけrange(1, 6)にすると列は5つ、行は9つです。両方を変えた場合と比べてみましょう。

5. while文でカウントダウンする

whileは条件が真の間、処理を繰り返します。count -= 1があるので、5から1まで表示した後に止まります。

保存するファイル:05_countdown.py。

def countdown(count):
    if count < 0:
        raise ValueError('回数は0以上にしてください')
    while count > 0:
        print(count)
        count -= 1
    print('スタート!')

if __name__ == '__main__':
    countdown(5)
python3 -B 05_countdown.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

5
4
3
2
1
スタート!

countを3に変えると3・2・1になります。減らす行を消すと終了条件へ近づかず、繰り返しが終わりません。誤って続き過ぎたら端末でCtrl+Cを押して停止します。

6. リストで平均点を出す

5人分の点数は合計399点、平均79.8点です。lenで人数、sumで合計を求め、人数で割ります。

保存するファイル:06_scores.py。

def show_scores(scores):
    if not scores:
        print('点数がありません')
        return
    print(f'人数:{len(scores)}人')
    print(f'合計:{sum(scores)}点')
    print(f'平均:{sum(scores) / len(scores):.1f}点')
    print(f'最高点:{max(scores)}点')
    print(f'最低点:{min(scores)}点')

if __name__ == '__main__':
    show_scores([72, 85, 90, 64, 88])
python3 -B 06_scores.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

人数:5人
合計:399点
平均:79.8点
最高点:90点
最低点:64点

空のリストには平均も最高点もありません。この例では空なら説明して処理を終えます。0点の人が1人いる場合と、誰もいない場合を区別しましょう。

7. 辞書で英単語帳を作る

辞書は英単語と日本語訳の対応表です。itemsで組を取り出し、getで未登録の単語にも説明を返します。

保存するファイル:07_dictionary.py。

def main():
    words = {'apple': 'りんご', 'book': '本', 'cat': 'ねこ'}
    for english, japanese in words.items():
        print(f'{english}:{japanese}')
    print(words.get('dog', '登録されていません'))

if __name__ == '__main__':
    main()
python3 -B 07_dictionary.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

apple:りんご
book:本
cat:ねこ
登録されていません

dogを辞書に追加してから再実行しましょう。辞書は挿入順で表示され、アルファベット順に自動整列するわけではありません。

8. 関数でBMIを計算する

同じ計算を繰り返し使うために、身長と体重を受け取る関数にまとめます。170cmと65kgなら、計算値を小数第1位まで表示して22.5です。

保存するファイル:08_bmi.py。

"""関数の練習用の架空値です。健康判定・診断はしません。"""
import math

def calc_bmi(height_cm, weight_kg):
    if not all(math.isfinite(x) and x > 0 for x in (height_cm, weight_kg)):
        raise ValueError('身長・体重は0より大きい有限値にしてください')
    height_m = height_cm / 100
    return weight_kg / (height_m ** 2)

if __name__ == '__main__':
    print(f'BMI:{calc_bmi(170, 65):.1f}')
python3 -B 08_bmi.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

BMI:22.5

身長0では割り算ができないため、0以下の入力を拒否します。関数と単位換算を学ぶ例であり、健康状態や体格を判定するための教材ではありません。

Pythonで作る簡単なゲーム|入力と分岐の2例

qは終了、空欄や文字は再入力、範囲内の半角数字は正解と比較する分岐

9. 数当てゲーム

入力は前後の空白を取り除いた後、半角数字だけで書いた1〜100を受け付けます。qで終了できます。有効な数だけを試行回数に数え、正解の乱数はゲーム開始時に1回決めます。

保存するファイル:09_guess_number.py。

import argparse
import random

def parse_guess(text):
    text = text.strip()
    if text.lower() == 'q':
        return None
    # この教材はASCIIの0〜9だけを受け付けます。符号、小数、全角数字は不可。
    if not text or any(ch not in '0123456789' for ch in text):
        raise ValueError('半角数字で入力してください(終了はq)')
    try:
        guess = int(text)
    except ValueError as error:
        raise ValueError('数が長すぎます') from error
    if not 1 <= guess <= 100:
        raise ValueError('1〜100の範囲で入力してください')
    return guess

def play(answer, input_fn=input):
    tries = 0
    print('1〜100の数を当ててください(終了はq)')
    while True:
        try:
            text = input_fn('数を入力:')
        except (EOFError, KeyboardInterrupt):
            print('\n終了しました')
            return
        try:
            guess = parse_guess(text)
        except ValueError as error:
            print(error)
            continue
        if guess is None:
            print('終了しました')
            return
        tries += 1
        if guess < answer:
            print('もっと大きいです')
        elif guess > answer:
            print('もっと小さいです')
        else:
            print(f'正解!{tries}回で当たりました')
            return

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--seed', type=int, help='検証時のみ乱数を固定する値')
    args = parser.parse_args()
    play(random.Random(args.seed).randint(1, 100))

if __name__ == '__main__':
    main()
python3 -B 09_guess_number.py --seed 7

確認用の実行結果(乱数の例は上記seedを指定した場合):

1〜100の数を当ててください(終了はq)
数を入力:もっと小さいです
数を入力:もっと大きいです
数を入力:正解!3回で当たりました

isdigitだけでは、²のようにintへ変換できない数字文字も通ります。この教材はASCII制限と変換失敗の処理を別に確認します。0、101、空入力、²、qで試し、無効な入力で回数が増えないことも見てください。

上のログでは50→25→42の順に入力しました。検証はパイプ入力なので、入力文字そのものは出力ログに表示されません。手元で対話入力すると、入力した数も端末に見えます。

入力 扱い 試行回数
空入力 / ² / abc 半角数字で入力し直す 増やさない
0 / 101 範囲外なので再入力 増やさない
50 空白を除去し50として比較 1増える
q 終了する 増やさない

仕様の根拠:Pythonのisdigitとint。ASCIIだけを受け付けるのは、この教材で決めた入力ルールです。

10. じゃんけん

0をグー、1をチョキ、2をパーに対応させます。(自分−相手)%3が0ならあいこ、2なら勝ち、1なら負けです。

保存するファイル:10_rock_paper_scissors.py。

import argparse
import random

HANDS = ['グー', 'チョキ', 'パー']

def judge(player, computer):
    if player not in (0, 1, 2) or computer not in (0, 1, 2):
        raise ValueError('手は0・1・2のいずれかです')
    result = (player - computer) % 3
    if result == 0:
        return 'あいこです'
    elif result == 2:
        return 'あなたの勝ち!'
    return 'あなたの負け…'

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--seed', type=int, help='検証時のみ乱数を固定する値')
    args = parser.parse_args()
    print('0:グー 1:チョキ 2:パー')
    try:
        text = input('番号を入力:').strip()
    except (EOFError, KeyboardInterrupt):
        print('\n終了しました')
        return
    if text not in ('0', '1', '2'):
        print('0・1・2のどれかを入力してください')
        return
    player = int(text)
    computer = random.Random(args.seed).randint(0, 2)
    print(f'あなた:{HANDS[player]} コンピューター:{HANDS[computer]}')
    print(judge(player, computer))

if __name__ == '__main__':
    main()
python3 -B 10_rock_paper_scissors.py --seed 7

確認用の実行結果(乱数の例は上記seedを指定した場合):

0:グー 1:チョキ 2:パー
番号を入力:あなた:グー コンピューター:チョキ
あなたの勝ち!

乱数なので毎回同じ相手の手になるとは限りません。下の9通りの表と照らすと、1回勝てたことだけでは勝敗式全体を検証できないとわかります。

上のログは0(グー)を入力した場合です。seed7で相手はチョキになります。通常の遊びでは--seedを外してください。

あなた\相手 グー チョキ パー
グー あいこ 勝ち 負け
チョキ 負け あいこ 勝ち
パー 勝ち 負け あいこ

仕事の自動化に使えるPython|練習データで試す5例

会社のCSVや写真フォルダでは試しません。--workdirで選ぶフォルダは、まだ存在しない名前にします。同名フォルダがあったら空でも停止するので、やり直しでは別の名前を選びます。

4行のCSVを商品別にまとめ、600円、150円、250円、合計1000円となる比較図

11. CSVファイルの売上を商品ごとに集計する

4行の架空の売上を商品名でまとめます。同じノートの300円が2行あるので600円、ペン150円、ファイル250円、合計1000円です。入力CSVと結果CSVは別のファイルにします。

保存するファイル:11_csv_totals.py。同梱ファイル一式を使います。

import argparse
import csv
from pathlib import Path
from practice import create_practice, run

FIXTURES = Path(__file__).resolve().parent / 'fixtures'

def aggregate(file):
    reader = csv.DictReader(file)
    if reader.fieldnames != ['日付', '商品', '金額']:
        raise ValueError('見出しは 日付,商品,金額 の順にしてください')
    totals = {}
    for row in reader:
        line = reader.line_num
        if None in row or any(value is None for value in row.values()):
            raise ValueError(f'{line}行目:列数が合いません')
        item = row['商品'].strip()
        amount = row['金額'].strip()
        if not item or not amount or any(c not in '0123456789' for c in amount):
            raise ValueError(f'{line}行目:商品名と0以上の整数金額が必要です')
        try:
            value = int(amount)
        except ValueError as error:
            raise ValueError(f'{line}行目:金額が長すぎます') from error
        totals[item] = totals.get(item, 0) + value
    return totals

def create_report(workdir, extra_row=False):
    folder = create_practice(workdir, 11)
    source = FIXTURES / ('sales_extra.csv' if extra_row else 'sales.csv')
    with (folder / 'sales.csv').open('xb') as target:
        target.write(source.read_bytes())
    with (folder / 'sales.csv').open(newline='', encoding='utf-8') as f:
        totals = aggregate(f)
    # 入力を変更せず別ファイルへ。xモードは同名出力があれば停止します。
    with (folder / 'totals.csv').open('x', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['商品', '合計金額'])
        writer.writerows(totals.items())
        writer.writerow(['合計', sum(totals.values())])
    for item, amount in totals.items():
        print(f'{item}:{amount}円')
    print(f'合計:{sum(totals.values())}円')
    print('保存:指定した練習フォルダの totals.csv')
    return folder

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--workdir', required=True, help='まだ存在しない練習フォルダ')
    parser.add_argument('--extra-row', action='store_true', help='演習B用の450円を含む架空入力')
    args = parser.parse_args()
    create_report(args.workdir, args.extra_row)

if __name__ == '__main__':
    run(main)
python3 -B 11_csv_totals.py --workdir practice11

確認用の実行結果(乱数の例は上記seedを指定した場合):

ノート:600円
ペン:150円
ファイル:250円
合計:1000円
保存:指定した練習フォルダの totals.csv

同名の練習フォルダや出力がある場合は停止します。金額が空欄の行は0円とみなさず、行番号付きのエラーにします。まず入力をそのまま保ち、別名の練習データでノート450円を追加してみましょう。

集計を業務の形に発展させるならPythonでCSVを集計する業務実践へ進みます。CSVの引用符・改行はCSVの読み書きでつまずく原因と対処で詳しく学べます。この例のCSVはUTF-8、金額は0以上の整数という限定した仕様です。

12. フォルダ内のファイル名を連番に変える

対象は指定した練習フォルダ内のphotosに教材が作るbeach.jpg・cafe.jpg・sunset.jpgの3つだけです。中身は0バイトのダミーで、写真画像を生成するコードではありません。名前を変える前に、予定を3行表示して確かめます。

保存するファイル:12_rename_files.py。同梱ファイル一式を使います。

"""0バイトのダミー3個だけを改名。本物の写真フォルダには使用しません。"""
import argparse
import os
from practice import create_practice, check_practice, save_text_new, run, MARKER

SOURCES = ['beach.jpg', 'cafe.jpg', 'sunset.jpg']
TARGETS = [f'cebu_{i:03}.jpg' for i in range(1, 4)]

def prepare(workdir):
    folder = create_practice(workdir, 12)
    photos = folder / 'photos'
    photos.mkdir()
    for name in SOURCES:
        with (photos / name).open('xb'):
            pass
    print('0バイトのダミーファイルを3個作りました(画像データではありません)')
    return folder

def plan(workdir):
    folder = check_practice(workdir, 12)
    if (folder / '.applied').exists():
        raise ValueError('実行済みです。2回目は変更せず停止します')
    if {p.name for p in folder.iterdir()} != {MARKER, 'photos'}:
        raise ValueError('練習フォルダに予定外の項目があります')
    photos = folder / 'photos'
    if photos.is_symlink() or not photos.is_dir():
        raise ValueError('photosは教材専用の通常フォルダにしてください')
    names = {p.name for p in photos.iterdir()}
    if any((photos / name).exists() or (photos / name).is_symlink() for name in TARGETS):
        raise ValueError('変更先または実行済みの印があります。上書きせず停止します')
    if names != set(SOURCES):
        raise ValueError('ダミー3個以外のファイルがあります。停止します')
    for name in SOURCES:
        file = photos / name
        if file.is_symlink() or not file.is_file() or file.stat().st_size != 0:
            raise ValueError('0バイトのダミーファイル以外には触れません')
    return photos, list(zip(SOURCES, TARGETS))

def rename(workdir, apply=False):
    folder, changes = plan(workdir)
    for old, new in changes:
        print(f'{old} → {new}')
    if not apply:
        print('予定のみ:ファイル名は変更していません')
        return
    # 新名を排他的に作るためhard linkを使用。既存名を置換するrenameは使いません。
    # 共有・同期フォルダや同時編集は対象外。非対応FSでは停止し、元名を残します。
    created = []
    try:
        for old, new in changes:
            os.link(folder / old, folder / new, follow_symlinks=False)
            created.append(folder / new)
    except OSError:
        for new in created:
            new.unlink()
        raise
    for old, _ in changes:
        (folder / old).unlink()
    save_text_new(folder.parent / '.applied', 'done\n')
    print('実行完了:3個の名前を変更しました')

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--workdir', required=True)
    actions = parser.add_mutually_exclusive_group()
    actions.add_argument('--prepare', action='store_true')
    actions.add_argument('--apply', action='store_true')
    args = parser.parse_args()
    if args.prepare:
        prepare(args.workdir)
    else:
        rename(args.workdir, apply=args.apply)

if __name__ == '__main__':
    run(main)
python3 -B 12_rename_files.py --workdir practice12 --prepare
python3 -B 12_rename_files.py --workdir practice12
python3 -B 12_rename_files.py --workdir practice12 --apply

確認用の実行結果(乱数の例は上記seedを指定した場合):

0バイトのダミーファイルを3個作りました(画像データではありません)

【予定表示】
beach.jpg → cebu_001.jpg
cafe.jpg → cebu_002.jpg
sunset.jpg → cebu_003.jpg
予定のみ:ファイル名は変更していません

【明示実行】
beach.jpg → cebu_001.jpg
cafe.jpg → cebu_002.jpg
sunset.jpg → cebu_003.jpg
実行完了:3個の名前を変更しました

prepareで新規領域を作る→dry-runで予定を見る→applyで実行する順です。既存cebu_001.jpgがあれば停止します。予定を見ている間にファイルを増減しないでください。本物の写真フォルダを指定して一括処理する用途には拡張していません。

Path.renameはOSによって既存の変更先を置き換える場合があります。この教材は同名を排他的に作れるos.linkで新名を作り、成功後に元名を削除します。そのためハードリンク対応のローカルファイルシステムに限定されます。非対応なら停止します。共有・同期フォルダ、他の人やプログラムとの同時操作は対象外です。途中失敗は一括取消しを保証しないため、エラーが出たらまずフォルダの状態を確認してください。

実行前と予定表示後は元名3つ、実行後はcebu_001から003の3つとなった検証結果

13. 英文の単語の出現回数を数える

英文を小文字にし、ピリオドとカンマを取り除いて、空白で区切ります。Counterで数えるとpythonとisが3回ずつになります。

保存するファイル:13_word_count.py。

from collections import Counter

TEXT = """Python is easy to read.
Python is used for web apps, data analysis and AI.
Learning Python is fun."""

def main():
    words = TEXT.lower().replace('.', '').replace(',', '').split()
    for word, count in Counter(words).most_common(3):
        print(f'{word}:{count}回')

if __name__ == '__main__':
    main()
python3 -B 13_word_count.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

python:3回
is:3回
easy:1回

同数なら最初に登場した単語が先に出ます。この短い例は英語一般の単語解析器ではなく、ハイフン・アポストロフィー・疑問符などは別途扱う必要があります。Pythonを1つ足した時の変化を確かめましょう。

14. 今日の日付と、来年の元日までの日数を出す

日付同士を引くと日数を求められます。date.todayは実行した端末の今日を使うため、この記事を読む日によって結果は変わります。

保存するファイル:14_days_left.py。

import argparse
from datetime import date

def describe(today):
    new_year = date(today.year + 1, 1, 1)
    days_left = (new_year - today).days
    weekdays = ['月', '火', '水', '木', '金', '土', '日']
    print(f'今日は{today:%Y年%m月%d日}({weekdays[today.weekday()]})です')
    print(f'来年の元日まで、あと{days_left}日です')

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--today', type=date.fromisoformat, help='検証用の日付 YYYY-MM-DD')
    args = parser.parse_args()
    describe(args.today or date.today())

if __name__ == '__main__':
    main()
python3 -B 14_days_left.py --today 2026-10-08

確認用の実行結果(乱数の例は上記seedを指定した場合):

今日は2026年10月08日(木)です
来年の元日まで、あと85日です

再現用の日付を指定できる形にしました。2026-10-08から2027-01-01までは85日です。この値は開始日を含めて両端を数える日数ではありません。12月31日と、うるう年の2月末も試しましょう。

15. Excelファイルを作る(openpyxl)

openpyxlで売上シートを作り、D2〜D4に掛け算、D5にSUMの式を書き込みます。数式が保存されたことと、表計算ソフトで計算されたことは別です。

保存するファイル:15_excel_formulas.py。同梱ファイル一式を使います。

import argparse
from openpyxl import Workbook, load_workbook
from practice import create_practice, run

ITEMS = [('ノート', 300, 4), ('ペン', 150, 10), ('ファイル', 250, 6)]

def create_excel(workdir):
    folder = create_practice(workdir, 15)
    wb = Workbook()
    ws = wb.active
    ws.title = '売上'
    ws.append(['商品', '単価', '数量', '金額'])
    for row, (name, price, quantity) in enumerate(ITEMS, start=2):
        ws.append([name, price, quantity, f'=B{row}*C{row}'])
    ws.append(['合計', '', '', '=SUM(D2:D4)'])
    with (folder / 'sales.xlsx').open('xb') as f:
        wb.save(f)
    wb.close()
    # 数式の保存を検査。openpyxl自体は数式を計算しません。
    formulas = load_workbook(folder / 'sales.xlsx', data_only=False)
    cached = load_workbook(folder / 'sales.xlsx', data_only=True)
    print('作成:指定した練習フォルダの sales.xlsx')
    print(f'保存されたD5の式:{formulas.active["D5"].value}')
    print(f'未計算のD5キャッシュ:{cached.active["D5"].value}')
    print(f'Pythonで別途検算した合計:{sum(p * q for _, p, q in ITEMS)}円')
    formulas.close()
    cached.close()
    return folder

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--workdir', required=True)
    args = parser.parse_args()
    create_excel(args.workdir)

if __name__ == '__main__':
    run(main)
python3 -B 15_excel_formulas.py --workdir practice15

確認用の実行結果(乱数の例は上記seedを指定した場合):

作成:指定した練習フォルダの sales.xlsx
保存されたD5の式:=SUM(D2:D4)
未計算のD5キャッシュ:None
Pythonで別途検算した合計:4200円

openpyxlは数式を計算しません。教材の検証はD2が=B2*C2、D5が=SUM(D2:D4)であることを読み戻すところまでです。Excelなどで再計算したときの期待値は1200・1500・1500、合計4200ですが、Excel実機での再計算は今回未確認です。

根拠:openpyxlの数式の説明。data_only=Trueで読んだ値がNoneでも、「式の保存に失敗した」とは限りません。表計算ソフトによる計算済みキャッシュがまだない状態を区別します。

PythonでWebを学ぶ|自分のパソコン内で試す3例

専用フォルダのHTMLと自分のブラウザが127.0.0.1でつながり、Ctrl+Cで止める概念図

16. 自分のパソコンでWebサーバーを動かす(http.server)

http.serverは練習フォルダのHTMLをブラウザへ返す簡単なサーバーです。公開するディレクトリと、待ち受けるアドレスを明示します。教材は127.0.0.1だけで待ち受けます。

保存するファイル:16_local_server.py。同梱ファイル一式を使います。

"""自分のPCの127.0.0.1で、同梱HTML一枚だけを確認します。本番用ではありません。"""
import argparse
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
from urllib.parse import urlsplit
from practice import create_practice, check_practice, run, MARKER

FIXTURE = Path(__file__).resolve().parent / 'fixtures' / 'index.html'

def prepare(workdir):
    folder = create_practice(workdir, 16)
    with (folder / 'index.html').open('xb') as f:
        f.write(FIXTURE.read_bytes())
    print('公開用の新規練習フォルダと index.html を作りました')
    return folder

def make_server(workdir, port=8000):
    folder = check_practice(workdir, 16)
    page = folder / 'index.html'
    if {p.name for p in folder.iterdir()} != {MARKER, 'index.html'} or page.is_symlink():
        raise ValueError('教材HTML以外やシンボリックリンクがあるため停止します')
    content = page.read_bytes()
    class Handler(BaseHTTPRequestHandler):
        def do_GET(self):
            if urlsplit(self.path).path not in ('/', '/index.html'):
                self.send_error(404)
                return
            self.send_response(200)
            self.send_header('Content-Type', 'text/html; charset=utf-8')
            self.send_header('Content-Length', str(len(content)))
            self.end_headers()
            self.wfile.write(content)
    return ThreadingHTTPServer(('127.0.0.1', port), Handler)

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--workdir', required=True)
    actions = parser.add_mutually_exclusive_group(required=True)
    actions.add_argument('--prepare', action='store_true')
    actions.add_argument('--serve', action='store_true')
    parser.add_argument('--port', type=int, default=8000)
    args = parser.parse_args()
    if args.prepare:
        prepare(args.workdir)
        return
    if not 0 <= args.port <= 65535:
        raise ValueError('ポートは0〜65535です(0は空きポートの自動選択)')
    with make_server(args.workdir, args.port) as server:
        print(f'確認URL:http://127.0.0.1:{server.server_port}/', flush=True)
        print('停止:この端末でCtrl+C。本番公開には使わないでください', flush=True)
        try:
            server.serve_forever(poll_interval=0.1)
        except KeyboardInterrupt:
            print('停止しました')

if __name__ == '__main__':
    run(main)
python3 -B 16_local_server.py --workdir practice16 --prepare
python3 -B 16_local_server.py --workdir practice16 --serve

確認用の実行結果(乱数の例は上記seedを指定した場合):

公開用の新規練習フォルダと index.html を作りました
確認URL:http://127.0.0.1:8000/
停止:この端末でCtrl+C。本番公開には使わないでください
停止しました

起動している端末を閉じず、自分のブラウザでhttp://127.0.0.1:8000/を開きます。終了はCtrl+C。ポート使用中なら既存プロセスを勝手に止めず、教材側のポートを変更してください。非本番用であり、ローカル限定でも秘密情報や外部を指すシンボリックリンクは入れません。

仕組みを短いコマンドで試す場合は、prepareで作った練習用フォルダに限り、次の標準コマンドも使えます。上のサーバーと同時には起動しません。ZIP版はHTML1枚だけを返す限定実装、こちらは指定フォルダのファイルを配信する標準サーバーです。

python3 -B -m http.server 8000 --bind 127.0.0.1 --directory practice16

標準コマンドでは管理用ファイルも含め、指定フォルダ内のファイルが配信対象になります。秘密情報を入れず、シンボリックリンクも置きません。公式資料では、bind未指定時は全インターフェースで待ち受けることと、本番用途を推奨しないことを説明しています。

17. Flaskで入力フォームのあるWebサイトを作る

フォームから受け取ったnameを、HTML本文へ差し込む前にescapeで変換します。空の名前はゲストにします。<script>などの文字が入力されても、そのままタグとして実行されないことを確認します。

保存するファイル:17_flask_greeting.py。

import argparse
from flask import Flask, request
from markupsafe import escape

app = Flask(__name__)

@app.route('/')
def index():
    return """<!doctype html><html lang="ja"><meta charset="utf-8">
    <h1>Pythonで作ったWebサイト</h1>
    <form action="/hello"><input type="text" name="name" placeholder="架空の名前を入力">
    <button type="submit">送信</button></form></html>"""

@app.route('/hello')
def hello():
    name = request.args.get('name', '').strip() or 'ゲスト'
    return f"<p>{escape(name)}さん、こんにちは!</p><a href='/'>戻る</a>"

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--port', type=int, default=5000)
    args = parser.parse_args()
    # 開発サーバー自体が本番用ではありません。debugを切っても公開用にはなりません。
    app.run(host='127.0.0.1', port=args.port, debug=False, use_reloader=False)

if __name__ == '__main__':
    main()
python3 -B 17_flask_greeting.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

 * Serving Flask app '17_flask_greeting'
 * Debug mode: off

localhostの開発用教材です。debug=FalseにしてもFlaskの開発サーバーが本番向けになるわけではありません。認証・保存・クラウド公開は行いません。ここでのescapeはHTML本文の文脈向けであり、あらゆる入力対策を代替するものではありません。

ブラウザでhttp://127.0.0.1:5000/を開きます。根拠:Flask公式Quickstart。使い終わったら端末でCtrl+Cを押します。

18. Webページのタイトルとリンクを取得する(requests・Beautiful Soup)

最初は同梱の独自HTMLを読み、Beautiful Soupでタイトルとリンクを取り出します。これならインターネットの応答やページ変更に左右されず、同じ答えを確かめられます。

保存するファイル:18_parse_html.py。同梱ファイル一式を使います。

"""同梱HTMLだけを読みます。外部サイトへの通信はありません。"""
import argparse
from pathlib import Path
from bs4 import BeautifulSoup

def extract(text):
    soup = BeautifulSoup(text, 'html.parser')
    title = soup.title.get_text(strip=True) if soup.title else '(titleなし)'
    links = [(a.get_text(strip=True), a.get('href') or '(hrefなし)') for a in soup.find_all('a')]
    return title, links

def show(text):
    title, links = extract(text)
    print(f'タイトル:{title}')
    for label, href in links:
        print(f'リンク:{label} {href}')

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--no-title', action='store_true', help='欠損値のある同梱HTMLを読む')
    args = parser.parse_args()
    name = 'no_title.html' if args.no_title else 'index.html'
    path = Path(__file__).resolve().parent / 'fixtures' / name
    show(path.read_text(encoding='utf-8'))

if __name__ == '__main__':
    main()
python3 -B 18_parse_html.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

タイトル:ローカルPython教材
リンク:学習ガイド /guide
リンク:リンク先のない見本 (hrefなし)

titleがなければ「(titleなし)」、hrefのないa要素は「(hrefなし)」と表示します。外部取得版は別ファイルです。requestsのtimeoutとraise_for_statusを使いますが、アクセス許可や相手サイトの規約・負荷にも配慮し、外部通信を初回練習の必須条件にしません。

欠損データの確認はpython3 -B 18_parse_html.py --no-titleで行えます。任意の外部取得はoptional_external_fetch.pyに分離しています。requestsのtimeoutは応答がない状態を制限するもので、ダウンロード全体の完了時間を保証する値ではありません。外部ページの最新文面は期待結果に固定していません。

データ分析のPythonサンプル|表とグラフを照合する2例

例19と20は同じ架空データを使います。表で数値を確かめてから図にすると、見た目だけで判断する誤りを減らせます。

19. pandasで表を集計する

7〜9月の店舗別の売上をpandasのDataFrameにまとめます。groupbyで店舗ごとに合計し、pivotで月を行、店舗を列に並べ替えます。架空の売上の単位は万円です。

保存するファイル:19_pandas_summary.py。同梱ファイル一式を使います。

from pathlib import Path
import pandas as pd

def summarize():
    path = Path(__file__).resolve().parent / 'fixtures' / 'shop_sales.csv'
    df = pd.read_csv(path)
    totals = df.groupby('店舗', sort=True)['売上'].sum()
    table = df.pivot(index='月', columns='店舗', values='売上')
    print(totals)
    print()
    print(table)
    return totals, table

if __name__ == '__main__':
    summarize()
python3 -B 19_pandas_summary.py

確認用の実行結果(乱数の例は上記seedを指定した場合):

店舗
A店    390
B店    330
Name: 売上, dtype: int64

店舗   A店   B店
月           
7月  120   95
8月  140  110
9月  130  125

A店は120+140+130=390万円、B店は95+110+125=330万円です。表示の空白やdtypeの文字列が環境で違っても、まず数値と行・列の対応を比べます。月×店舗が重複するとpivotはそのままでは作れません。

20. matplotlibで折れ線グラフを作る

例19と同じ6個の数値から、2店舗の折れ線を描きます。縦軸の1は1万円です。凡例Shop A/Shop Bと各系列の対応、点の位置を元の表と照らしましょう。

保存するファイル:20_plot_sales.py。同梱ファイル一式を使います。

import argparse
import os
from tempfile import TemporaryDirectory
from practice import create_practice, run

MONTHS = ['Jul', 'Aug', 'Sep']
SALES_A = [120, 140, 130]
SALES_B = [95, 110, 125]

def make_plot(workdir):
    folder = create_practice(workdir, 20)
    # フォントキャッシュも一時フォルダに限定。終了時に片付けます。
    with TemporaryDirectory(prefix='kredo-mpl-') as config:
        previous = os.environ.get('MPLCONFIGDIR')
        os.environ['MPLCONFIGDIR'] = config
        try:
            import matplotlib
            matplotlib.use('Agg')
            import matplotlib.pyplot as plt
            fig, ax = plt.subplots(figsize=(6.4, 4.2))
            ax.plot(MONTHS, SALES_A, marker='o', label='Shop A')
            ax.plot(MONTHS, SALES_B, marker='s', linestyle='--', label='Shop B')
            ax.set_title('Monthly Sales (fictional data)')
            ax.set_ylabel('Sales (10,000 JPY)')
            ax.set_xlabel('Month')
            ax.legend()
            ax.grid(alpha=0.2)
            fig.tight_layout()
            with (folder / 'sales.png').open('xb') as file:
                fig.savefig(file, format='png', dpi=140)
            plt.close(fig)
        finally:
            if previous is None:
                os.environ.pop('MPLCONFIGDIR', None)
            else:
                os.environ['MPLCONFIGDIR'] = previous
    print('保存:指定した練習フォルダの sales.png')
    print('架空データ・単位:万円。A店合計390、B店合計330')
    return folder

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--workdir', required=True)
    args = parser.parse_args()
    make_plot(args.workdir)

if __name__ == '__main__':
    run(main)
python3 -B 20_plot_sales.py --workdir practice20

確認用の実行結果(乱数の例は上記seedを指定した場合):

保存:指定した練習フォルダの sales.png
架空データ・単位:万円。A店合計390、B店合計330

新しい練習フォルダ内だけにPNGを保存し、既存ファイルには上書きしません。グラフは実データの傾向を説明するためのもので、線が上がった理由までこの6件だけから判断することはできません。

7〜9月、A店120・140・130万円、B店95・110・125万円を描いた実際の折れ線グラフ
ファイル操作の共通部品 practice.py を読む

教材ZIPでは各サンプルと同じフォルダにあります。新規フォルダだけを作り、別教材やシンボリックリンクを誤って使わないための部品です。端末引数や補助関数がまだ難しければ、先に例1〜8に戻っても大丈夫です。

"""教材の新規フォルダを扱う共通部品。各コードと同じ場所に置いてください。"""
from pathlib import Path
import json

MARKER = '.kredo-practice.json'

def reject_symlinks(path):
    path = Path(path).absolute()
    if any(part.is_symlink() for part in (path, *path.parents)):
        raise ValueError('シンボリックリンクを含むパスでは実行しません')
    return path

def create_practice(path, example):
    path = reject_symlinks(path)
    # 親フォルダは既存、練習フォルダ自体は必ず新規。既存時は空でも停止。
    path.mkdir(mode=0o700, parents=False, exist_ok=False)
    with (path / MARKER).open('x', encoding='utf-8') as f:
        json.dump({'example': example, 'format': 1}, f)
    return path

def check_practice(path, example):
    path = reject_symlinks(path)
    marker = path / MARKER
    if not path.is_dir() or marker.is_symlink():
        raise ValueError('教材で作成した練習フォルダが必要です')
    try:
        data = json.loads(marker.read_text(encoding='utf-8'))
    except (OSError, ValueError) as error:
        raise ValueError('練習フォルダの印が読めません') from error
    if data != {'example': example, 'format': 1}:
        raise ValueError('別の教材の練習フォルダです')
    return path

def save_text_new(path, text):
    with Path(path).open('x', encoding='utf-8', newline='') as f:
        f.write(text)

def run(main):
    try:
        main()
    except (OSError, ValueError) as error:
        raise SystemExit(f'停止:{error}')

予想してから変更する|4つの改造練習と答え合わせ

いきなり解答を開かず、「変えるもの・予想・実測・理由」を1行ずつ書きます。出力が違ったら、複数箇所を同時に直さず、入力と実行したファイルから確かめましょう。

練習 自分で変えるもの 確かめること
A 分岐 例3に59 / 60 / 79 / 80を渡す 境界でどの枝へ入る?
B 集計 ノート450円の1行を追加する 入力を保持して1450円になる?
C ファイル 予定を見てから明示実行する dry-runで本当に名前が残る?
D 英語×IT 実測したBの検証メモを書く 未確認のことまで書いていない?

A. 60点と80点の境界を確かめる

python3 -B 03_grade.py --score 59
python3 -B 03_grade.py --score 60
python3 -B 03_grade.py --score 79
python3 -B 03_grade.py --score 80
Aの解答と間違えやすい理由

C / B / B / Aです。score >= 60を先に判定すると80もそこでBになり、後の80点条件へ届きません。さらに-1と101を渡し、範囲外が評価されずに停止することを確かめます。

B. ノート450円を追加し、入力と出力を分ける

同梱のfixtures/sales_extra.csvには元の4行と追加の1行を収録しています。先に自分で合計を予想してから、別の未存在フォルダで実行します。

python3 -B 11_csv_totals.py --workdir practice11_extra --extra-row
Bの解答と入力エラーの扱い

ノート1050円・ペン150円・ファイル250円、合計1450円です。元のsales.csvを結果で上書きせず、totals.csvへ書き出します。金額空欄は0円ではありません。テストの空欄ケースは3行目のエラーとして止まります。引用符で囲まれた改行などがあると、CSVの物理行番号とレコード数は一致しないことにも注意します。

C. 予定と実行後のファイル数を比べる

例12を新規のpractice12_exerciseでprepareし、--applyなしで予定を出します。その時点の.jpgは元名3個です。確認後だけ--applyを付けて実行してください。同じapplyを2回実行するとどうなるかも予想します。

Cの解答と停止する条件

予定はbeach→cebu_001、cafe→cebu_002、sunset→cebu_003の3行。実行前とdry-run後は元名のまま、実行後の.jpgは新名3個だけです。既存cebu_001.jpg、予期しないファイル、同名の作業フォルダ、2回目のapplyは停止します。衝突を別番号へ送る従来の工夫は、今回は「意図しない既存データへ触れない」ため、教材全体を止める仕様へ厳格化しました。

D. 実測したことだけを3行の英語で伝える

Bを自分の環境で実行できたら、次の型に沿って書きます。まだ実行していないなら1450円を実測したとは書かず、I have not run it yet.と区別してください。

Dの解答例(Bを実測した場合)
I changed the input by adding one notebook sale of 450 yen.
With five sales rows as input, the result was 1450 yen.
I have not checked real company data.

Pythonのソースコードが公開されているサイト9選

まず公式資料で書き方を確認し、用途に合う小さな例を選びます。第三者の記事や公開リポジトリは、公開されているだけで安全性・正確さ・再利用許可が保証されるわけではありません。

Python公式チュートリアル

条件分岐・リスト・関数の意味を、公式の説明と短いコードで確認できます。

Python超入門部

基本文法からデータ解析やWebなどのテーマを探す入口です。選んだ記事の使用バージョンを確認します。

DX/AI研究所「Pythonのコード12選」

既存記事で案内していたサンプル集です。今回の確認では応答を取得できなかったため、現行本文や掲載例数を再確認できていません。閲覧できない場合は上の公式チュートリアルから進めます。

ビジPy「Beautiful Soupの使い方」

例18の続きとして、HTMLから要素を選ぶ書き方を読み比べる用途に使えます。

GAMMASOFT「Pythonによる自動化プログラムの事例」

Excelやファイル操作など、仕事の自動化の具体例を探せます。実ファイルで動かす前に、変更範囲を読んで練習領域で試します。

Django公式チュートリアル

投票アプリを作りながらWebの構成を学ぶ公式教材です。使用するDjangoのバージョンに合わせて資料を選びます。

Pyxel

レトロな2Dゲーム向けのエンジンです。日本語READMEやサンプル、ライセンスを確認してから始めます。

Qiita

実装例やエラー対処を探せる投稿サービスです。投稿日・更新日・環境・コメントを確認し、重要な仕様は公式資料で照合します。

GitHub

公開プロジェクトのコードを読めます。最初はREADMEとexamplesなどの小さな例、依存関係、LICENSE、実行手順を確認します。

確認時点:2026年10月8日JST。リンク先の内容やURLは変わることがあります。Djangoのstableリンクは今回の取得で応答を得られず、公式のバージョン別チュートリアルで教材の存在を確認しました。9サイトすべての現行本文を確認できた、という意味ではありません。

サンプルコードを使う前の確認リスト

  • 実行するファイル名と、使っているPythonのバージョンを確かめた
  • 入力・出力・通信先を読んだ。わからない削除や送信処理を実行しない
  • 本物のデータではなく、教材の新しい練習領域を選んだ
  • 必要なライブラリだけを専用環境へ導入した
  • 出力先が既にある場合の動作と、終了方法を確認した
  • 公開コードの利用条件を、個別のLICENSEや案内で確認した

自力で書く練習を増やすならPythonの練習問題と学習サイト、教材選びならPythonの独学に役立つブログ・サイトへ進んでください。この記事は20の小さな用途の入口として使えます。

英語がわかるとPythonの検証を伝えやすくなる

printは表示する、returnは返す、most_commonはよく出てくるもの、という手掛かりになります。ただし名前だけで動作を決めつけず、引数と公式の説明も読みます。練習Dのように「何を変え、どの入力で何が出たか」を短く書けると、自分の確認範囲を人に伝えやすくなります。

Kredoは、累計3,000名の卒業生を輩出し、英語×IT・AIを通じてグローバルに活躍・就職する人材を育成してきました(2026年10月6日、学校運営者提供)。今回のようなコードの実行と説明を、学習の次の一歩にしてみてください。コースや期間についてはKredo IT留学の無料カウンセリング、全体像はIT留学の費用・学び方・選び方で確認できます。

あわせて読みたい記事

Pythonの独学に役立つブログ・サイト8選|初心者の使い分けと進め方
Pythonの独学に役立つブログ・サイト8選|初心者の使い分けと進め方
2023-04-20

Pythonのサンプルコードについてよくある質問

コピーしたのにエラーになります。

実行したファイル名、エラーの最後の行、行番号を確認します。IndentationErrorなら字下げ、ModuleNotFoundErrorなら同じPythonへライブラリを導入したかを見ます。ファイル系はpractice.pyとfixturesも必要です。停止:と出た場合は、安全のために既存フォルダや想定外入力を拒否している可能性があります。

python3・python・pyはどう使い分けますか?

利用できる起動コマンドは環境で異なります。--versionで確認し、インストールにもその実行ファイルの-m pipを使います。仮想環境のPythonを明示すると、導入先と実行先を合わせられます。

スマホでも動かせますか?

文字表示などはPython実行アプリやオンライン環境で試せる場合があります。ただし、この教材のローカルファイル操作とサーバーはパソコン向けです。クラウド環境の127.0.0.1が、手元のスマホを指すとは限りません。

このWebサンプルをそのまま公開できますか?

今回は学習用のローカル確認までです。http.serverやFlaskの開発サーバーを本番公開用とみなさず、公開時はサーバー構成やセキュリティを別に学びます。

公開ソースは自由に使えますか?

個別の利用条件を確認してください。公開されていることと、改変・再配布・商用利用の許可があることは別です。READMEだけでなくLICENSEや依存ライブラリの条件も確認します。

スマホでの学習方法はPythonの学習アプリも参考にしてください。

主要な仕様の一次資料
  • Python:openのw/xモード
  • Python:CSV
  • Python:Path.rename
  • Python:仮想環境venv
  • Requests:タイムアウト
  • Beautiful Soup:要素の取得
  • pandas:groupby
  • pandas:pivot
  • Matplotlib:savefig

まとめ|1本動かし、1か所変え、結果を説明しよう

最初の目標は、20個すべてを急いで実行することではありません。気になる1本で入力と出力を確かめ、1か所だけ変えて結果を説明できれば前進です。ファイルの変更やサーバーの待受けも、作用する範囲を自分で選べるようにしてから試しましょう。

英語でIT・AIを学べるKredo

英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?

当メディアを運営しているKredoは、英語×ITをオンラインで学ぶ「Kredoオンラインキャンプ」と、フィリピンのセブ島で英語とIT・AIを学ぶ「KredoIT留学」「KredoAI留学」を提供しています。これまでの卒業生は3,000名以上。卒業生の多くが、国内外のIT企業への転職、フリーランスなどへのキャリアチェンジを実現しています。これからの時代に必要な英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?

\ セブ島でIT×英語を学ぶ /IT留学の無料カウンセリングを予約する
\ オンラインでIT✕英語を学ぶ / Kredoオンラインキャンプの詳細をみる >>
  • ツイート
  • シェア
  • はてな
  • ポケット
この記事を書いた人
アバター画像
Kredo編集部

Kredo編集部です!プログラミング、英語学習、キャリア、Kredo情報を発信していきます。

関連記事

  • PCとスマートフォンで自分たちのWeb作品を確かめる学習者の生成イラスト
    Web・プログラミング(学習)

    プログラミング合宿で何を作る?初心者の成果物・事前準備・復習計画

    2026.10.26
  • sort()は元のリストを並べ替えて戻り値がNone、sorted()は元のデータを残して新しいリストを返す比較図
    Web・プログラミング(学習)

    Pythonのsortとsortedの違い|英語の公式仕様で元データ・戻り値を確認

    2026.10.08
  • 机の上で色分けした注文カードと明細カードを並べ、結合後のカードを見比べる学習イメージ
    Web・プログラミング(学習)

    SQLのJOINで行数・合計が増える原因は?1対多と直し方を図解

  • 追加した項目の動きをノートで整理する学習者の写真イメージ
    プログラミング Web・プログラミング(学習)

    JavaScriptのイベント委譲とは?追加したボタンが動く仕組みを実験

    2026.10.06
新規CTA
KREDO JAPAN株式会社

\ SNSで留学の様子を更新中! /

  • Instagram
  • LINE
  • X
  • YouTube
©KREDO JAPAN Inc. 2024 All rights reserved.
Kredoのサービス
セブ島で学びたい方はこちら KredoIT留学
自宅で学びたい方はこちら Kredo Online 英語×アプリ開発コース
運営会社 会社概要 採用情報 お問い合わせ
利用規約 プライバシーポリシー 特定商品取引に基づく表示 資料請求