プログラミング入門I
1月22日の提出状況
時間はたっぷりとあったと思うのですが,実行時にエラーが出るものがありました.残念です. error: prog1 問題のあるプログラムも少なくて,以下のようにちょっと特殊なものが少しでてきただけでした.
a = list(st)
print(f'Before sort: {st}')
print(f'After sort: {a}')
なぜか文字列をリストにしているだけなので,当然以下のように表示されますよね.
Before sort: LbEjj After sort: ['L', 'b', 'E', 'j', 'j'] |
s1 = '' for _ in range(5): s1 += chr(random.randint(65, 90) + random.randint(0, 1) * 32) s2 = sorted(s1) s3 = ''.join(s2) print(f'Before sort: {s1}') print(f'After sort: {s3}') |
これまでも何度も警告していますが,変数の無駄遣いですよね.
for _ in range(5): st += chr(random.randint(97, 122)) |
大文字小文字混合にしてないです.演習問題でも扱ったので,コピペだけでできたはずなんですが.
for _ in range(5): st += chr(random.randint(65,90) + random.randint(0, 1)) print(f'Before sort: {"".join(sorted(st))}') print(f'After sort: {st}') |
なぜソート前の方がソートされる?
for i in range(5): a = random.randint(65,90) num1 = random.randint(0,1) if num1 == 0: a += 32 alp +=chr(a) |
大文字小文字混合については複数回演習で扱ったのですが?
before = [chr(random.randint(65, 90) + random.randint(0,1) * 32) for _ in range(5)] before_string = ''.join(before) |
なぜまだ授業で扱っていない内包表記でリストを作ってから文字列にわざわざ直すんでしょうか?基本的には各回の授業で演習問題に進度に応じて,また,教科書の記述を参考に自分で考える作業を放棄してネット検索で対処しようとしてきたということなんでしょうね.別に授業を受けなくても,自分で習得することも可能なので,授業は時間の無駄でしたかね.
問題の実施例の先頭が小文字の場合の例ですが,オリジナルの文字列の先頭が大文字のものでした.間違えました.すみませんでした.ただ,その混乱はなくちゃんとプログラムもできていたようなので,安心しました.
で,今回はエラーもなくだいたいいい感じでしたが,一人だけただの解答用紙そのままをアップロードした人がいました.ファイル選択を間違えましたかね.残念です.
素の解答用紙提出: b2226
以下は例によって問題のあるプログラムの例です.参考にしてください.
first=st[0] if ord(first)<=90: print(f' Upper: {st.upper()}') else: print(f' Lower: {st.lower()}') |
先頭の文字が大文字か小文字かの判定で,文字コードの数値を利用している人が多く見られました.教科書の p.153 (旧版では p.151) の Table 6-2 にせっかく文字種判定のメソッドが載っているのですから,そちらを使ってほしかったところです.
for _ in range(1): st += chr(random.randint(65, 90) + random.randint(0, 1) * 32) for _ in range(29): mk += chr(random.randint(65, 90) + random.randint(0, 1) * 32) if st == (97, 122): print(f'Original: {st}', end ='') print(f'{mk}') print(f'Lower: {st}', end = '') print(f'{mk}'.lower()) else: print(f'Original: {st}', end ='') print(f'{mk}') print(f'Upper: {st}', end = '') print(f'{mk}'.upper()) |
先頭の文字と残りの文字を分けて生成する段階ですでにダメですが,また以降の処理も変なので,結局下のような表示になりますね.
Original: sppDqrhHsuKQbVuwBgGSVGJRvnGwuM Upper: sPPDQRHHSUKQBVUWBGGSVGJRVNGWUM |
if chr(65) <= s1[0] <= chr(90): print(f' Upper: {s1.upper()}') else: print(f' Lower: {s1.lower()}') |
文字コードの数値で判定するといっても,左側の比較演算子は不要ですよね.
if ord(st[0]) % 65 < 32: print(' Upper: ', end = '') print(f'{st}'.upper()) else: print(' Lower: ', end = '') print(f'{st}'.lower()) |
数値で比較すること自体がどうかなと思うところですが,さらに剰余まで入れてややこしくする必要がありますかね.
print(f'Original: {s}') if s[:1] == chr(random.randint(65,90)): print(str.capitalize(s)) else: print(str.upper(s)) |
Original を表示する部分を独立させたがために結局2行目の表示ができないというのではよくないですね.
Original: CTpfSqSTSPsroEKjomVILqpQRNRetz CTPFSQSTSPSROEKJOMVILQPQRNRETZ |
if str.isupper(letter2): print(f'Upper : { str.upper(letter)}') if str.islower(letter2): print(f'Lower : {str.lower(letter)}') else: print() |
ずいぶん前の if 文のところで説明しましたが,必ずどちらかの処理を行う場合は if if とするのではなく,if else で処理を書いてください.
s = '' x = chr(random.randint(65, 90) + random.randint(0, 1) * 32) y = chr(random.randint(97,122)) print(f'Original: {x}', end = '') for _ in range(29): s += chr(random.randint(65, 90) + random.randint(0, 1) * 32) print(f'{s}') if x > y: print(f' Lower: {x}{s.lower()}') else: print(f' Lower: {x}{s.upper()}') |
これも先頭の文字だけ別に生成してごまかそうとしているのですが,さらに先頭が大文字か小文字かではなく,特定の文字よりも大きいかどうかで判定しているので,処理は正しくなりません.例えば,x が 'h' で,y が 'z' だった場合には以下のようになります.
Original: hUppdmAhYZHaxrwOvibgDZKfcWBMir Lower: hUPPDMAHYZHAXRWOVIBGDZKFCWBMIR |
target = alphabet[0].upper() if alphabet[0] == target: print(f' Upper: {alphabet.upper()}') else: print(f' Lower: {alphabet.lower()}') |
変数の無駄遣いですね.変数 target は別に無くても処理は書けます.
if st[0].islower(): lst = st.lower() print(f' Lower: {lst}') else: ust = st.upper() print(f' Upper: {ust}') |
同じくこちらも変数の無駄遣いです.変数 lst と ust は不要です.
if random_string[0].islower(): result_string = random_string.lower() else: result_string = random_string.upper() print(f'Original: {random_string}') print(f' Upper: {result_string}') |
Upper 決め打ちはまずいですね.下のようなことになります.
Original: tomkDgnowCZCxWhrJRHZuwlOQwWjjr Upper: tomkdgnowczcxwhrjrhzuwloqwwjjr |
if st[0].isupper()==True: print(f' Upper: {st}'.upper()) else: print(f' Lower: {st}'.lower()) |
f 文字列全体に upper メソッドや lower メソッドを作用させているので,生成文字列以外の部分も変更してしまいます.
Original: NKfuwTftKxfnHcezCpzhmIaidlxIWL UPPER: NKFUWTFTKXFNHCEZCPZHMIAIDLXIWL |
print(f'Original: {st}') print(f'Original: {st2}') |
なんで両方とも Original なんでしょうかね.
Original: RSaqidDPYxsuZbYEPscpAPmHwVthTe Original: RSAQIDDPYXSUZBYEPSCPAPMHWVTHTE |