プログラミング入門I
2025.01.20
文字列1
なぜか文字列を決め打ちする人が何人かいました.問題文には「今回の演習問題 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
|
文字列について学習しました.文字列は個々の文字が順番に並んでいる特殊なデータ形式(プログラミング入門IIで扱うリストなど配列形式)で,インデックスにより個々の文字にアクセスできます.また,インデックスを使ってスライスという方法を使うと,文字列の切り出しなどが行えます.
in や not in 演算子を用いて,文字列の中に特定の文字列があるかどうかを判定したり,find 系メソッドによりさらに詳しい文字列に関する探索が可能になります.find などはメソッドなので,ピリオドでつなげて操作を行います.
str.find('ABC')
|
教科書にもあるように文字列 str の中に文字列 ABC が含まれているかどうかを調べます.詳しくは演習問題で確認しましょう.
文字列を操作するメソッドはたくさんあります.教科書に出ている join などのメソッドを演習問題で確認しましょう.また,文字列はリストの一種ですので,教科書 p.72 で出てきた sorted 関数も活躍します.
大文字から小文字に変換するなどの文字種の変更を行うメソッドも用意されています.これまで数値としての文字コードに32に加えることで大文字を小文字に変換するなどしていましたが,upper メソッドを使用することで同じような操作が可能です.
他の言語でも必ず用意されている % 記号を用いた表現です.Python ではあまり使用しないようですが,それには % の使い方が他の言語に比べて面倒なことがあるのかもしれません.
% 記法が面倒なため用意されていた format メソッドですが,記述が長くなる傾向にありますので,現時点では f 文字列が主流になったので,使う意味はもうほとんど無いようです.
これまでさんざん使ってきた f 文字列ですが,この機会に教科書の List 6-17 をしっかり確認して今後も自由に使えるようになりましょう.
今回の演習問題です.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは翌月曜日2729日の10:00です.レポート提出システムを使用します.
いよいよ最後となりましたので,授業の終わりに確認テストを実施します.