プログラミング入門I
2025.12.15
文字列1
授業の最初に多重の反復処理に関する確認テストを行います.
今回もエラーになるものが無かったことは良かったのですが,print 文の中で文字の桁数をしている方法を未だに理解できていない人が複数人いたのは残念です.演習問題で何度も何度も何度も何度も何度もやっているのに,ですね. 以下は例によって問題のあるプログラムの例です.参考にしてください.
print(f'{random.randint(start, end):.6f}', end=' ')
この前の確認テストのときもそうだったのですが,なんで整数なのに書式指定子に浮動小数点を指定するのでしょうか?結果は当然,以下のように題意を全く無視視しています.
10.000000 94.000000 59.000000 81.000000 59.000000 850.000000 606.000000 196.000000 479.000000 107.000000 7157.000000 6753.000000 2042.000000 8774.000000 7654.000000 49094.000000 19511.000000 72469.000000 31423.000000 68593.000000 690094.000000 582500.000000 341815.000000 867029.000000 885542.000000 |
print(n, end=" ")
|
こちらは書式指定子が無いので,以下のように左揃えになってしまっています.
20 55 65 72 71 170 262 758 887 388 8717 3610 8698 8797 2146 28721 82434 53651 67899 10962 534268 545717 579073 310309 530646 |
for i in range(5):
for j in range(5):
for k in range(6-(i+2)):
print(' ',end='')
for k in range(i+2):
print(random.randint(1,9),end='')
print(' ',end='')
print()
|
上のものはスペースを入れて右側で揃うようにしていますが,こちらも文字数を書式指定子で指定しておけばこんなことは不要です.教科書の p.158 をもう一度見直してください.
for i in range(2, 7):
start = 10 * (i - 1)
end = 10 * i - 1
for _ in range(5):
num = random.randint(start, end)
print(f"{num:>6}", end=" ")
print()
|
べき乗の記号は ** なのですが,上の例はただの積 * になっていますので,桁ではなく単純に10の位の数字が下のように1ずつ大きくなっているだけです.
12 11 11 18 18
26 29 25 28 24
31 33 35 39 31
40 41 49 48 46
58 53 57 51 54
|
num1 = 10
num2 = 99
for i in range(5):
for j in range(1,6):
num3 = random.randint(num1,num2)
print(f'{num3:6}',end= ' ')
else:
print()
num1 *= 10
num2 *= 10
num2 += 9
|
結果は間違っていないのですが,変数を num1 と num2 の2つ使用しています.変数の無駄遣いですね.
で,今回久しぶりに絶対にやっちゃダメ!なものが出てきました.2重の for 文なので,それをまず理解しましょう.
for _ in range(5):
print(f'{random.randint(10, 99):7d}', end=' ')
print()
for _ in range(5):
print(f'{random.randint(100, 999):7d}', end=' ')
print()
for _ in range(5):
print(f'{random.randint(1000, 9999):7d}', end=' ')
print()
for _ in range(5):
print(f'{random.randint(10000, 99999):7d}', end=' ')
print()
for _ in range(5):
print(f'{random.randint(100000, 999999):7d}', end=' ')
print()
|
多重の for 文について再度学習しました.さまざまなデータを今後学習するリストに保存したり,リストから読み出したりする際に必須の処理ですので,しっかりと復習もしておきましょう.今後も引き続き使用していきます.
変数名などで文字の並んだものをこれまで使用してきましたが,値として文字の並びを持つものが文字列です.文字が1文字であっても Python は文字列として扱うことになっています.
インデックス
文字列のそれぞれの文字には順番に応じて番号が振られており,それをインデックスと言います.先頭を 0 番としそれ以降 1, 2, 3, … と続きます.また,末尾の文字から順番に数えていきたいときには -1, -2, -3 … のように負の数で表現します.このインデックスは反復処理などで文字列を扱う際に重要です.
s = 'python' print(s[1]) |
上のようにすると,文字列 'python' の2文字目の y が出力されます.このようにインデックスは [ ] で指定します.
len 関数
len(str) は文字列 str の文字数を返す関数ですが,この例で str は文字列オブジェクトの変数名であり,値の方の文字数を返すことはわかるとおもいます.
スライス
スライスは Python に特徴的な操作で文字列の中から任意の文字を取り出すことができます.教科書 p.139にスライスで文字を抽出する際の例がありますので,ぜひ見ておいてください.
次回以降も使用する処理としてはランダムな文字からなる文字列の生成です.以下のように,類纂代入演算子 += と反復処理を利用して任意の長さの文字列を作ることができます.
s = ''
for _ in range(5):
s += chr(random.randint(97, 122))
|
上の例はアルファベットの小文字をランダムに5個並べた文字列の生成の例です.
文字列に対してさまざまな操作を行うメソッドが用意されています.今回はその一部(replace, strip, upper)を使用します.
ここまで f 文字列を多く利用してきましたが,他にも % 記法や format メソッドがあります.こちらは必要に応じて使用しましょう.
今回の演習問題です.
文字列に関するいくつかの操作を学習しました.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは22日の13:00です.Moodle を使用します.
次回も引き続き教科書のp.134-162の範囲を学習しますので,予習をしてきてください.