0

機能は以下。while ループと if ステートメントを使用してより多くの練習をしたいので、これには while ループを使用し、メソッドは使用したくありません。

def remove_leading_zeros(s):
'''(str) -> str
Return s, but without any extra leading zeros
e.g. given "007", return "7"
Precondition: Each character of s is a number.
'''
i = 0
r = ''
while i < len(s):
    if s[i] != '0':
        r = r + s[i]
    i += 1
return r

したがって、 とremove_leading_zeros('0001950')入力すると、出力が になります'1950'
ただし、上記の関数では、すべてのゼロを省略しているようです。先頭のゼロのみを省略する関数を作成するには、何を変更すればよいですか?

も試しr = r + s[i:]たので、ゼロ以外が検出されるとすぐに、その後すべてが返されますが、それだけでループを終了する方法がわかりません。

解決しました。助けてくれたすべてに感謝します!

4

5 に答える 5

1

最初の非ゼロに遭遇した後、文字がゼロであるかどうかのチェックを停止するように更新できます (現在、ゼロ以外の数値を見つけた後でもチェックしています)。たとえば、次のことができます。

def remove_leading_zeros(s):
    i = 0
    while i < len(s):
        if s[i] == '0':
            # do nothing
            i += 1
        else:
            return s[i:]

これをテストしたところ、うまくいくようでした。これらの線に沿った何かがうまくいくはずです。アイデアは、ゼロ以外の最初の数値をヒットした後、何もチェックするのをやめて、残っているものを返すだけだということです。

編集:元の回答でいくつかのバグを修正しました。

于 2013-06-17T01:44:07.903 に答える
1

ブール変数を追加して、最初のゼロ以外の数字がまだ検出されているかどうかを示し、rそこからのみ追加できます。

def remove_leading_zeros(s):
    i = 0
    r = ''
    started = False
    while i < len(s):
        if started or s[i] != '0' or i + 1 == len(s):
            started = True
            r = r + s[i]
        i += 1
    return r

は、の代わりに が返されることを確認するi + 1 == len(s)ための、 のエッジ ケースの追加チェックです。remove_leading_zeros('000')'0'''

于 2013-06-17T01:44:40.093 に答える
0

まだ誰も言及していないことの 1 つは、関数から戻る準備ができていないときにループを早期に終了する方法ですbreak。ステートメントを使用します。このようなもの:

while True:  # A common way to write an "infinite" loop
    print("Doing some work...")
    result = do_something()
    if result is None:  # Or whatever other signal means "we're finished here"
        break  # The next thing printed will be "We're done!"
    print("Going through the loop again...")
print("We're done!")

それがどのように機能するか見てください。breakステートメントはループを中断し、ループの後の次のステートメント (この場合は関数呼び出し) でプログラム フローを再開しますprint("We're done!")

continue残りのステートメントをスキップして、再びループの先頭に直接ジャンプするステートメントもあります。break上記のループがcontinue代わりに だった場合、結果を取得すると呼び出しNoneがスキップされ、print("Going through the loop again...")直接 に戻りprint("Doing some work...")ます。もちろん、ループを終了する方法はなく、実際は無限ループになり、Bad Thing™ になります。

についてもう 1 つcontinue: ループを使用している場合、 (名前が示すように) ループ内の次の項目にfor進みます。

for i in range(10):
    if (i % 2) == 0:
        continue
    print(i)  # Will print 1, 3, 5, 7 and 9

これら 2 つのツールcontinuebreakは、多くのループ処理を容易にします。

于 2013-06-17T04:46:20.293 に答える