質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

89.99%

Python の基本的な文法(for 文)について

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,093

kogemochi

score 8

Python の初心者向けのドキュメントを読んでいて、わからないところがあったので質問させていただきます。ちなみにそれは、まだ通読していません。

読んでいたドキュメントの中に、サンプルプログラムとして以下のようなものがありました。

def reverse(s):
    s2 = ``
    for c in s:
        s2 = c + s2
    return s2

これは reverse('文字列') を打ち込んだとき、打ち込んだ文字列を逆の順序で並べ替えたものを出力するときのプログラムとのことでした。

ここで for 文を始める前に

s2 = ``

とすることには、どんな意味がありますか。

また数字の列を与えて、それを並べ替えるにはどうしたらよいですか。123456789のような数列の並べ替えと、[12, 23, 56]の並べ替えの、両方が知りたいです。

よろしくお願いします。

追記:皆さん回答ありがとうございます。

1つめの質問については3つのキーワード、最初は空白、変数の初期化、インタプリタに変数の存在を教える、ということでだいたい理解できました。

しかし2つめの、「数列を表示したい」という意図が伝わっていないみたいなので、自分の考えを書きたいと思います。

Python では、データのタイプによって、''で囲んだり[]で囲んだりするものだと、自分は認識していました。

他のドキュメントを見ていると、[]の中には、コンマで区切って数字や文字を入れているのを見たことがあった(x = [, , , ]とかして、append() で加えたりしていた)ので、「数字は[]で囲む」と思っていたのです。しかしよく見てみると、[]の中には '文字列' や False などの真理値が入っていたので、どうも数字だけ入れるわけではないみたいです。

そこで2つめに質問したかったのは、[12, 23, 56]と入力すれば[56, 23, 12]と返ってくる、123456789と打てば987654321と返ってくるにはどうしたらよいのか、ということでした。なぜ[12, 23, 56]を並べ替えたいのかというと、必要性からではなく、ドキュメントで見てなんとなく知りたいなーと思ったからです。

ここに書かれている方法で、123…と連続した文字列は逆に並べ替えられるのがわかったし、[12, 23, 56]の方もできそうなので、試してみたいと思います。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

pythonは簡単に実行できるので、実際にやってみると理解が深まりますよ。
以下は、変数の状態遷移を表示してみた例です。

def reverse(s):
    s2 = ""
    for c in s:
        wk = s2
        s2 = c + s2
        print "s2:%7s <= c(%c) + s2(%s) " % (s2, c, wk)
    return s2

s = "abcdefg"
print reverse(s)

s2 が空の状態から徐々に先頭に付け足されて行くのが分かります。

$python sample1.py
s2:      a <= c(a) + s2() 
s2:     ba <= c(b) + s2(a) 
s2:    cba <= c(c) + s2(ba) 
s2:   dcba <= c(d) + s2(cba) 
s2:  edcba <= c(e) + s2(dcba) 
s2: fedcba <= c(f) + s2(edcba) 
s2:gfedcba <= c(g) + s2(fedcba) 
gfedcba

def reverse(a):
    a2 = []
    for n in a:
        wk = list(a2) # copy list
        a2.insert(0, n)
        print "a2:%18s <= n(%d) + a2:%s" % (a2, n, wk)
    return a2

a = [12, 23, 34, 45]
print reverse(a)

$python sample2.py
a2:              [12] <= n(12) + a2:[]
a2:          [23, 12] <= n(23) + a2:[12]
a2:      [34, 23, 12] <= n(34) + a2:[23, 12]
a2:  [45, 34, 23, 12] <= n(45) + a2:[34, 23, 12]
[45, 34, 23, 12]

こちらも一緒で、a2が空の状態から、先頭に追加されて行くのが分かります。
先ほどとの違いはリストを使用しているところです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

とすることには、どんな意味がありますか。 
forの中で、元の文字列を左から1文字ずつ取り出して(つまり右の方があと)、それを順に左からつなぎ合わせることで、逆順に並び替えています。最初の物をつなぐ前の結果は空文字列ですね。
ループ1回ごとに c と s2 がいまどういう内容なのかをよく考えると分かると思います。

また数字の列を与えて、それを並べ替えるにはどうしたらよいですか。
数字を文字列に直せば後は同じです。

123456789のような数列の並べ替えと、[12, 23, 56]の並べ替えの、両方が知りたいです。 
これはちょっと意味がわかりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

s2 = ''
変数s2を文字列型(str)で初期化しています。

print reverse(['12','23','56',])
文字列の配列で与えてあげる必要があるとおもいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

お邪魔します。

まず質問の1つめ s2 = `` ですが、これはs2という変数が文字列型だよ、とインタプリタに教えてあげる役割があります。
そうしなければ、ループの1回目のs2 = c + s2 でエラーが発生すると思います。
これは存在しない変数と文字列cを加算することができないからです。

※補足です。pythonは強い型付けの言語でかつ、動的型付け言語です。型を宣言せずとも推論によって型を決定することができ、かつ一度初期化された変数の型は厳密に決まっているのでタイプセーフに実装する必要があります。
参考リンク:「型」に関して

題意を誤解しているかもしれませんが、数列のソートのサンプルです。

#①数列の並べ替え、単純に入力を逆順にする
def reverse(numlist):
    numlist.reverse()
    return numlist

#②数列の並べ替え、値の大小を比較する
def reverse(numlist):
    return sorted(numlist, reverse=True)

123456789のような数列の並べ替えと、[12, 23, 56]の並べ替えの、両方が知りたいです。 
ですが、違いがよくわかりませんでした。二つづつ区切られているものは、各要素もソートする必要があるのでしょうか?
123456789は[1,2,3,4,5,6,7,8,9]として入力を受ければよく、文字列"123456789"を受けるなら一旦シーケンスとしてリストに変換してから渡してはどうでしょう?
s = "123456789"
numlist = [int(x) for x in s]
などとしてから渡してやればいいと思います。

以上参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

 s2 = `` とすることには、どんな意味がありますか。
この行を削除するとどうなるでしょう。
s2 = c + s2 の部分でエラーになります。(s2 が未定義)
宣言をするとしたら何らかの値を設定する必要があります。
どんな値にするかは、メソッドの機能に依存します。ここでは "" にするのが適切です。
(s2 = s とすれば、 回文文字列が返るような動作になります。
  "123" --> "123321"
)
整数、配列の reverse 処理についは以下のいコードを書いてみました。
わからない部分があれば、書籍、web で調べてみてください。
(それでわからなければ、コメントで不明点を質問してください)
# coding: utf-8

def reverse(s):
    s2 = ""
    for c in s:
        s2 = c + s2
    return s2

def reverse_i(val):
  s = str(val)       # 整数を文字列に変換
  rstr = reverse(s)  # 文字列として逆順にする。
  return int(rstr)   # 文字列を整数に変換

def reverse_array(ary):
    ans = []
    for item in ary:
        ans = [item] + ans
    return ans

print "--- 自作メソッドで処理"
print reverse("123")
print reverse_i(123)
print reverse_array([12, 34, 56])

print "--- 標準関数で処理"
print reverse("123")
print int(reverse(str(123)))
print [12, 34, 56][::-1]
実行結果
--- 自作メソッドで処理
321
321
[56, 34, 12]
--- 標準関数で処理
321
321
[56, 34, 12]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる