プログラミング初学者の発見と成長の記録です。
受け取った文字列を操作するコードを書いた過程で学んだことをメモします。
取り組んだ課題はこちらです。
ユーザーから入力された文字列を受け取り、以下を実行するプログラムを書いてください。
- 文字数を表示する
- 大文字に変換して表示する
- 小文字に変換して表示する
- 文字列が空だった場合は「何も入力されていません」と表示する
💡今回学べたこと
- 異なるデータ型は比較できない
- Pythonの真偽値判定の挙動が思っていたのと違った
- 組み込み関数
len()
は、要素のサイズ(要素数や文字数)を取得できる - 組み込み型
str
のメソッド、upper
とlower
で大文字小文字を変換できる - 組み込み関数
input()
は、ユーザからの入力を受け取る対話型インターフェースを提供する。戻り値は「文字列」として返ってくる
今回の記事では、タイトルにもある通り、Pythonの真偽値判定を中心に扱います。
文字列型(str)と数値型(int)は直接比較できない
# ユーザーからの入力を文字列として受け取る
user_input = input("任意の文字列を入力してください")
# エラー発生箇所: 文字列と整数を比較している
if user_input > 0:
print(f"{user_input}は、{len(user_input)}文字です") # 文字数をカウント
print(user_input.upper()) # 大文字に変換
print(user_input.lower()) # 小文字に変換
# 入力が空の場合は「何も入力されていません」と表示する
else:
print("何も入力されていません")
上記コードでTypeErrorが発生
# TypeError: '>' not supported between instances of 'str' and 'int'
if文ヘッダーの箇所で、文字列と整数を比較演算してしまっていることが原因
「異なるデータ型の比較はできない」
冷静に考えれば分かるし、座学で学んで頭でわかったつもりでも、いざコードを書くとやってしまった。
解決していきます。
シンプルに真偽値で判定する方法
# 改善案1: 真偽値判定を利用
if user_input: # 入力があればTrue、空文字ならFalseを返す
print(f"{user_input}は、{len(user_input)}文字です")
else:
print("何も入力されていません")
これはシンプルで驚きました。
後述する方法よりも、Pythonicな書き方となります。
文字列の長さで空文字をチェックする方法
# 改善案2: 文字列の長さを使って判定
if len(user_input) > 0: # 0より大きければTrue、0ならFalse
print(f"{user_input}は、{len(user_input)}文字です")
else:
print("何も入力されていません")
数字同士に揃えたのでエラーが解消されています。
Pythonの真偽値判定
Pythonでは、変数やリストが空か否かで自動的に真偽を判定します。
- 何かが入っている →True
- 空っぽ →False
例:- 空の文字列、リスト、辞書、など
- 数値の0
- None
確認してみる
以下の条件がどう評価されるか確認し、理由を添えました。
print(bool("")) # False <--文字列が空なので
print(bool("a")) # True <--文字列に値があるので
print(bool(0)) # False <--0なので
print(bool([])) # False <--空のリストなので
print(bool(["a"])) # True <--リストに値があるので
おわりに
『独習Python』では論理型について下記の説明がなされています。
論理型は、組み込み型の中でも最も単純な型で、
真(正しい)か偽(間違い)か、いずれかの状態しか持ちません。
この説明を読んで「単純=わかりやすい」ではないんだなと思いました。
しかし、一度わかってしまうと下記コードをすっきりスマートに読めるようになりました。
if my_list:
print("リストに要素が入っていますよ!")
今後のためのメモ
- データ型を意識してコードを書く(比較演算だけでなく、算術演算子の場合も振る舞いが変わるため。)
- 値が空かどうか判定するときは、今回学んだbool型のしくみを理解してコードを書く
参考資料