質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

4580閲覧

pythonの文字列と数値列の違い

ieyusaku

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/01/02 10:11

0

1

イメージ説明
python入門教室という本の内容で数当てゲームを作る、というやつなんですが

(b[0] < "0") or (b[0] > "9") :

ここら辺に関して質問があります。
最初数の大小を比較するなら数値として入力するのかと思ったんですが""をつけて数値を文字扱いしても<を使えば大小は比較できるってことですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

実は文字列のままでも、一桁なら比較可能です。

Python

1>>> '0' < '1' 2True

内部的には文字コードを比較しています。ASCIIコード表

Python

1>>> ord('0') 248 3>>> ord('1') 449 5>>> ord('0') < ord('1') 6True

二桁以上だと数値のようには比較できません。

Python

1>>> '123' < '9' 2True

辞書を引くように、先頭の文字コードから順に比較するからです。

余談

参考にされているコードは、かなりPythonらしからぬコードです。
どんなときもC流に書くプログラマがたまにいますが、著者がそのような人でないことを祈ります。

まぁ、Cだと思ってみても手本になるようなコードではありませんが。

  • 1文字ずつ比較するならせめてループを使ってほしい
  • continueとbreakを使ってフラグ変数を排除してほしい

書いてみた

ディスるだけだとなんだか卑怯な気がしてきたので。

Python

1while True: 2 src = input('数を入れてね > ') 3 if len(src) != 4: 4 print('4桁の数字を入力してください') 5 continue 6 7 if not src.isdigit(): 8 print('数字ではありません') 9 continue 10 11 break 12 13print(*src, sep='\n') 14# print('\n'.join(src)) でも可

『数字』を半角アラビア数字に限定したいなら、条件部を次のように変えます。

Python

1if not all('0' < d < '9' for d in src): 2 print('数字ではありません') 3 continue

あるいは

Python

1if not re.match(r'[0-9]{4}', src): 2 print('数字ではありません') 3 continue

\d とか str.isdigit だと、実はアラビア数字であるか厳密には判断できません。
teratail - python3 数字かどうか調べたい

趣味の範疇では気にするまでもないことではありますが。

投稿2019/01/02 10:20

編集2019/01/02 14:27
LouiS0616

総合スコア35678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/01/02 13:53 編集

>余談 著者さんがどんな本出してるのか調べてみて、なんか既視感あるなぁと思ったら以前こんなのに回答してました。 https://teratail.com/questions/138485 あとサンプルコードぜんぶ出版社サイトから落とせますけど、けっこう(悪い意味で)面白かったです。長めのコードでインデントの幅がスペ4に統一されてなかったり(スペ2混じったり)。 http://www.sotechsha.co.jp/sp/1159/ でも質問のコードはループに変換され、最終的に正規表現マッチに変換されるっぽいので頑張っています。それでもなんとなく香ばしいですけど。 ……好意的に見て、専門外なんだろうなぁ、という。
LouiS0616

2019/01/02 14:08

コードの改善を中心に学んでいくタイプの書籍なのかな、とぼんやり想像していたら当たりでした。 それでも最後まで isok == False が残っているのは何とも虚しいですけれど。 あと正規表現持ち出すくらいなら str.isdigit でいいじゃん、ってのも。
hayataka2049

2019/01/02 14:50 編集

ほんとなんでisinvalidとかにしなかったんだろうなぁ・・・ 例外処理は入門者には難しいのでカバーしない、便利関数とか便利メソッドの類を使うと入門者には覚えることが多すぎるし先にベーシックな機能で書けるようになってほしい、という制約があると考えると、ギリ擁護できます。 でもその発想で行くなら「(b[0] < "0") or (b[0] > "9")で良い理由」のちゃんとした説明もたいがい入門者向けじゃないし、たぶん説明を省いたからこの質問が投稿されたんでしょうね。駄目じゃん。
LouiS0616

2019/01/02 15:04

そもそも not('0' <= b[0] <= '9') の方が分かり良いような気もしますね。 あるいは b[0] not in '0123456789' とか。
ieyusaku

2019/01/16 12:31

返信遅くなってしまいすいません。 あまりこの本は初心者には良くないということですか? 今「ゼロから作るdeeplearning」の方もやっているのですがそっちだけに専念して勉強した方が良いでしょうか?
LouiS0616

2019/01/16 12:58 編集

とりあえずは今の書籍をやりきることをお勧めします。 正しいことが書いてある書籍が分かり易いとは限りません。 書いてあることが正しいのか、正しいとしてももっと優れた方法は無いのか。etc... そのように、批評的な観点で取り組むことが肝要です。この点では名著も悪書も読み方に違いは無いのかもしれません。 また、Pythonのチュートリアルも目を通しておくと良いでしょう。 https://docs.python.jp/3/tutorial/index.html これは公式のものなので正確で、そして同時にいささか分かりづらいです。
guest

0

b = input(...)

としているので、 b は文字列です。
b[0] も文字列になります。

b[0] < "1" は文字列としての比較です。
b[0] < 1 とすると文字列と整数は比較できないという旨のエラーになります。

"10" < "2" は True ですが、
10 < 2 は False になります。
文字列の比較は辞書順になるからです。

イメージ説明

投稿2019/01/02 10:38

katoy

総合スコア22328

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問