3

私はこのサイトと python を初めて使用するので、必要な情報をすべて提供できることを願っています。私はすでにこの質問を検索しましたが、どの解決策もうまくいかないようです。

テキストを読み取り、それに含まれる桁数を返す関数を作成しようとしています。例えば:

"It is 2012" は、"Text has 4 digits" を返す必要があります

数字がない場合は、次のような別のメッセージを返す必要があります。

"It is Monday" は、"Text does not contain digits" を返す必要があります

だから私はこれを書いた:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit() == False:
            print ("Text does not contain digits")

        else:
            sum += 1


    print("Text has", sum, "digit(s)")


txt = str(input("Write some text: "))
(CountNumbers(txt))

機能は問題ないように見えますが、印刷は間違っています。たとえば、次のようになります。

Write some text: 65
Text has 2 digit(s) #this is ok, but...

テキストのみを入力する場合:

Write some text: sd 
Text does not contain digits
Text does not contain digits
Text does not contain digits
Text has 0 digit(s)

テキストと数字を入力すると(ただし、テキストが最初に):

Write some text: sd 564
Text does not contain digits
Text does not contain digits
Text does not contain digits
Text has 3 digit(s)

エラーがブロックにあることはわかっていますが (私はそう思います)、return を使用すると、テキストの読み取りが完了する前に停止するため、方法がわかりません。私は約20以上の異なることを試しました。助けてください!

ありがとうございました !!

PS IDLE (Python Shell) ウィンドウだけでなく、.py として機能させるには、これが必要です。そのため、このようなブロックを記述しています。

4

4 に答える 4

4

問題は、数字以外の文字に遭遇するたびに「テキストに数字が含まれていません」というメッセージを出力していることです。文字数がわかっている場合は、その print ステートメントをループの後に移動してみてください。

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit():
            sum += 1

    if sum > 0:   
        print("Text has", sum, "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
(CountNumbers(txt))

編集:優れた Python コードに向けたさらにいくつかのポイント:

  • 質問のコメントに記載されているように、慣例により、Python の関数/メソッドはアンダースコアを付けた小文字で名前が付けられcount_numbersますCountNumbers
  • ペダンティック モード: 数字ではなく、文字列内の数字を数えているためcount_digits、わかりやすくするために実際に名前を付ける必要があります。
  • sumという組み込みの Python 関数があります。同じ名前の変数を持つことによってこの関数を隠すことは、悪い習慣と考えられています。sum変数の名前をcount.
  • 関数呼び出しを括弧で囲む必要はありません (IMHO の見栄えを悪くすることを除けば、害はありません)。

これらの変更により、コードは次のようになります。

def count_digits(txt):
    count = 0

    for n in txt:
        if n.isdigit():
            count += 1

    if count > 0:   
        print("Text has", count, "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
count_digits(txt)
于 2012-12-17T20:33:41.257 に答える
2

コードの問題を解決しました:

def CountNumbers(txt):
    sum = 0

    for n in txt:
        if n.isdigit():
            sum += 1

    if sum:
        print("Text has", sum, "digit(s)")
    else:
        print ("Text does not contain digits")


CountNumbers(input("Write some text: "))
于 2012-12-17T20:33:38.190 に答える
1

早期の返品はまったく問題なく、コードを大幅に簡素化できます。

def CountNumbers(txt):
    for n in txt:
        if not n.isdigit():
            print ("Text does not contain digits")
            return

    print("Text has", len(txt), "digit(s)")

txt = str(input("Write some text: "))
(CountNumbers(txt))

この関数は、数字以外の文字が現れるとすぐに戻るか、入力文字列 (数字だけで構成されています) の長さを出力します

次のような「世代式」でそれを書くこともできます。

def CountNumbers(txt):
    if all(char.isdigit() for char in txt):
        print("Text has", len(txt), "digit(s)")
    else:
        print ("Text does not contain digits")

txt = str(input("Write some text: "))
(CountNumbers(txt))

現在、Python 関数はより一般的に値を返し、呼び出し元のコードがそれに基づいて動作できるようにします。このバージョンは文字列を返し、プログラムの「メイン」部分が結果を出力できるようにします。また、関数の名前をすべて小文字に変更します (Python は通常、クラスに大文字の名前を使用します)。

def countnumbers(txt):
    if all(char.isdigit() for char in txt):
        return "Text has %d digit(s)" % len(txt)
    else:
        return "Text does not contain digits"

txt = str(input("Write some text: "))
print(countnumbers(txt))

うーん、ぼろぼろじゃない!しかし、Python には次のような気の利いた条件式もあります。

def countnumbers(txt):
    return ("Text has %d digit(s)" % len(txt)
        if all(char.isdigit() for char in txt)
        else "Text does not contain digits")

txt = str(input("Write some text: "))
print(countnumbers(txt))

最後に、それを適切なモジュールにして、他のコードで使用できるようにすることもできます。プログラムのインタラクティブな部分を次のようにラップすると、コマンド ライン スクリプトのように実行している場合にのみ実行されますが、モジュールとしてインポートしている場合は実行されません。

def countnumbers(txt):
    return ("Text has %d digit(s)" % len(txt)
        if all(char.isdigit() for char in txt)
        else "Text does not contain digits")

if __name__ == '__main__':
    txt = str(input("Write some text: "))
    print(countnumbers(txt))

私がその関数を本番システムの一部として書いていたとしたら、それはそれがどのように見えるかにかなり近いです. ロジックは最初の試行と同じであることに注意してください。最大の違いは、このバージョンでは Python がほとんどの作業を行えることです。

于 2012-12-17T21:18:19.633 に答える
0

オリジナルを少しパイソン風に作り直したもの。個人的には、「リスト内包表記」形式の方が読みやすいと思います (入れ子になっている場合を除く)。

def count_digits(txt):
    count = len([c for c in txt if c.isdigit()])

    if count > 0:
        print ("Text has", count, "digit(s)")
    else:
        print ("Text does not contain digits")
于 2012-12-17T21:31:38.827 に答える