1

右端の 2 文字を先頭に移動した文字列のコピーを返す関数を作成する必要があります。これが私のコードです:

def go_right(mystr):
    if mystr >= 2:
        for i in range(len(mystr)):
                 a = mystr[-2:] + mystr[:-2]
        return a

上記のコードは正常に動作しますが、これを実行できない理由がわかりません。

def go_right(mystr):
        if mystr >= 2:
            for i in range(len(mystr)-2):
                     a = mystr[-2:] + mystr
            return a

上記の関数を使用して hello を渡すと、単純に "lohello" が返されます。-2 が mystr に影響を与えないように見えるのはなぜですか? 最後の2文字を除くすべての文字を反復処理することになっていると思いましたか? 誰かが私のためにこれを明確にするのを助けることができれば、私はそれを感謝します.

4

4 に答える 4

2

def go_right(mystr):
    if mystr >= 2:
        for i in range(len(mystr)):
                 a = mystr[-2:] + mystr[:-2]
        return a

変数iは使用されず、mystr は変更されません。len( mystr a = mystr[-2:] + mystr[:-2]) 回実行され、同じことを何度も繰り返します。

したがって、for ループの長さを変更しても何も変わらないことは当然です。なぜなら、for ループの存在は何もしないからです。

あなたの方法はと同等です

def go_right(mystr):
    if mystr >= 2:
        a = mystr[-2:] + mystr[:-2]
    return a

そして、このコードにはまだエラーがあります。mystr >= 2 の代わりに、次のように len(mystr) >= 2 を意味します。

def go_right(mystr):
    if len(mystr) >= 2:
        a = mystr[-2:] + mystr[:-2]
    return a

(文字列と数値を比較するセマンティクスは、常に false と比較することです。たとえば、"a" >= 2is True)

ただし、mystr の長さが 0 または 1 の場合、「UnboundLocalError: ローカル変数 'a' が代入前に参照されました」というエラーが発生するようになりました。これを解決する 1 つの方法は次のとおりです。

def go_right(mystr):
    if len(mystr) >= 2:
        return mystr[-2:] + mystr[:-2]
    return mystr
于 2013-04-19T00:21:11.373 に答える
0

ここに論理的な間違いがあります:

for i in range(len(mystr)):
    a = mystr[-2:] + mystr[:-2]

aforlen(mystr)回に新しい値を割り当てています。実際に行う必要があるのは、電話をかけることだけです

return mystr[:-2] + mystr[:-2]

インデックスに注意してくださいi。代わりにスライス表記を使用しているため、リスト要素にアクセスするためにそれを使用していません。

詳細については、この質問を参照してください。

于 2013-04-19T00:26:10.227 に答える
0

これにループを使用している理由について少し混乱しています...どちらの場合も、ループは実際には何もしていません。ただし、質問に答えると、mystr のすべてを mystr[-2:] に追加しているために発生します。ループを実行しても mystr は変更されないため、これは理にかなっています。

于 2013-04-19T00:22:12.570 に答える
0

次のようにコードを大幅に簡素化することもできます。

def go_right(mystr):
    return mystr[-2:] + mystr[:-2]

長さが 0、1、または 2 の入力は、変更されずに返されます。

于 2013-04-19T01:03:47.160 に答える