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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

5回答

4214閲覧

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

kogemochi

総合スコア9

Python

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

0グッド

0クリップ

投稿2015/05/17 09:44

編集2015/05/17 11:21

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]の方もできそうなので、試してみたいと思います。

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

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

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

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

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

guest

回答5

0

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

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

lang

1# coding: utf-8 2 3def reverse(s): 4 s2 = "" 5 for c in s: 6 s2 = c + s2 7 return s2 8 9def reverse_i(val): 10 s = str(val) # 整数を文字列に変換 11 rstr = reverse(s) # 文字列として逆順にする。 12 return int(rstr) # 文字列を整数に変換 13 14def reverse_array(ary): 15 ans = [] 16 for item in ary: 17 ans = [item] + ans 18 return ans 19 20print "--- 自作メソッドで処理" 21print reverse("123") 22print reverse_i(123) 23print reverse_array([12, 34, 56]) 24 25print "--- 標準関数で処理" 26print reverse("123") 27print int(reverse(str(123))) 28print [12, 34, 56][::-1]

実行結果

--- 自作メソッドで処理 321 321 [56, 34, 12] --- 標準関数で処理 321 321 [56, 34, 12]

投稿2015/05/17 11:17

katoy

総合スコア22324

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

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

0

ベストアンサー

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

lang

1def reverse(s): 2 s2 = "" 3 for c in s: 4 wk = s2 5 s2 = c + s2 6 print "s2:%7s <= c(%c) + s2(%s) " % (s2, c, wk) 7 return s2 8 9s = "abcdefg" 10print 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

lang

1def reverse(a): 2 a2 = [] 3 for n in a: 4 wk = list(a2) # copy list 5 a2.insert(0, n) 6 print "a2:%18s <= n(%d) + a2:%s" % (a2, n, wk) 7 return a2 8 9a = [12, 23, 34, 45] 10print 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が空の状態から、先頭に追加されて行くのが分かります。
先ほどとの違いはリストを使用しているところです。

投稿2015/05/17 11:00

編集2015/05/17 11:03
9walk

総合スコア55

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

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

0

お邪魔します。

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

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

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

lang

1#①数列の並べ替え、単純に入力を逆順にする 2def reverse(numlist): 3 numlist.reverse() 4 return numlist 5 6#②数列の並べ替え、値の大小を比較する 7def reverse(numlist): 8 return sorted(numlist, reverse=True) 9

123456789のような数列の並べ替えと、[12, 23, 56]の並べ替えの、両方が知りたいです。

ですが、違いがよくわかりませんでした。二つづつ区切られているものは、各要素もソートする必要があるのでしょうか?
123456789は[1,2,3,4,5,6,7,8,9]として入力を受ければよく、文字列"123456789"を受けるなら一旦シーケンスとしてリストに変換してから渡してはどうでしょう?

lang

1s = "123456789" 2numlist = [int(x) for x in s]

などとしてから渡してやればいいと思います。

以上参考まで。

投稿2015/05/17 10:39

ShinpeiYamamoto

総合スコア540

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

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

0

lang

1s2 = ''

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

lang

1print reverse(['12','23','56',])

文字列の配列で与えてあげる必要があるとおもいます。

投稿2015/05/17 10:28

samusko

総合スコア7

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

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

0

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

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

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

数字を文字列に直せば後は同じです。

123456789のような数列の並べ替えと、[12, 23, 56]の並べ替えの、両方が知りたいです。

これはちょっと意味がわかりません。

投稿2015/05/17 10:18

otn

総合スコア84529

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問