他の回答者の方がおっしゃっているように、直接のエラー箇所はformat{ans}
の部分で、if ans==True:ではなくif ans:としないと無限ループになります。
エラーの原因と正しく動くコードはもう上がっているので、補足的な情報を。
まず大前提として、pythonのオブジェクトは何でもbool型(TrueかFalseのどちらか)に変換できます。
例
python
1>>> bool("hoge")
2True
3>>> bool(1024)
4True
ifなどの条件に書いたときには、この変換が行われてbool型になります。
ではどんな風に変換されるのか? ドキュメントに書いてあります。
どのようなオブジェクトでも真理値として判定でき、 if
や while
の条件あるいは以下のブール演算の被演算子として使えます。
オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが __bool__()
メソッドを定義していて、それが False
を返す場合、または __len__()
メソッドを定義していて、それが 0
を返す場合は偽と判定されます。 主な組み込みオブジェクトで偽と判定されるものを次に示します:
偽であると定義されている定数: None
と False
- 数値型におけるゼロ:
0
, 0.0
, 0j
, Decimal(0)
, Fraction(0, 1)
- 空のシーケンスまたはコレクション:
''
, ()
, []
, {}
, set()
, range(0)
ブール値の結果を返す演算および組み込み関数は、特に注釈のない限り常に偽値として 0
または False
を返し、真値として 1
または True
を返します。 (重要な例外: ブール演算 or
および and
は常に被演算子のうちの一つを返します。)
4. 組み込み型 — Python 3.6.5 ドキュメント 4.1. 真理値判定
重要なのは、
オブジェクトは、デフォルトでは真と判定されます
というところと
主な組み込みオブジェクトで偽と判定されるものを次に示します:
(中略)
- 空のシーケンスまたはコレクション:
''
, ()
, []
, {}
, set()
, range(0)
というところです。
空文字列がFalse
と判定される(逆にそれ以外の文字列はTrue
判定になる)性質を利用して、ちゃんと入力してくれるまでループするという動作を実現している訳ですね。
とはいえ、これを使うのはトリッキーなので、個人的にはこう書く方が好きです。
python
1while True:
2 ans = input("ニックネームを入力してください: ")
3 if ans != "":
4 print("あなたの名前は{}ですね".format(ans))
5 break
6 else:
7 print("入力してください")
8
追記
「トリッキーなので、個人的にはこう書く方が好き」と書いてしまいましたが、if ans:
のような書き方は公式スタイルガイドで推奨されているようです。逆に、if ans == "":
のような書き方は推奨されないとのことです。ご指摘くださったfaoさんありがとうございました。
シーケンス (文字列, リスト, タプル) については、 空のシーケンスが False であることを利用しましょう。:
python
1良い: if not seq:
2 if seq:
3
4悪い: if len(seq):
5 if not len(seq):
はじめに — pep8-ja 1.0 ドキュメント プログラミングに関する推奨事項