

[Python3チュートリアル](https://docs.python.org/ja/3/tutorial/index.html)を勉強中のプログラミング初心者です。  
過去に同内容の質問がなかったため投稿させていただきます。  
チュートリアル[7.1.3.
文字列の手作業でのフォーマット](https://docs.python.org/ja/3/tutorial/inputoutput.html#manual-
string-formatting)に出てくる以下の例題がよく理解できずに困っています。

[code]

    for x in range(1, 11):
         print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
         # Note use of 'end' on previous line
         print(repr(x*x*x).rjust(4))
    
    # 出力結果
     1   1    1
     2   4    8
     3   9   27
     4  16   64
     5  25  125
     6  36  216
     7  49  343
     8  64  512
     9  81  729
    10 100 1000
    
[/code]

reprやrjustの特徴含め、色々と調べてみましたがコード全体の意味がよく分かりません。  
回答をお待ちしております。どうぞよろしくお願い致します。


CC BY-SA 4.0
2019-04-08T13:10:20.593
54023
2019-04-09T01:01:45.767
2019-04-09T01:01:45.767
19110
32840
question
python python3
Python3 repr, rjust等の使い方について


コード全体の意味がよく分からない時は、コードを分割しながら動作を調べることで意味を理解できるかもしれません。

チュートリアルがここまで進んでいるならば`for`と`range`はご存知かと思いますので、説明は省略します。

[code]

    for x in range(1, 11): print(x) #変数xに1から10までintを入れてループを回す
    
[/code]

次に[str.rjust](https://docs.python.org/ja/3/library/stdtypes.html#str.rjust)は説明文の通り、文字列を右寄せして表示します。  
また、`print`はカンマ区切りで複数の引数を持つことができます。

[code]

    print("a")
    #a
    print("a".rjust(3))
    #  a
    print("a", "b".rjust(3), "c")
    #a   b c
    
[/code]

チュートリアルの「各カラムの間のスペース一個分は～」という注記は、"b c"のスペースが自動的に挿入される理由の説明です。

さて[repr](https://docs.python.org/ja/3/library/functions.html#repr)を使う理由は、`repr`がなければ`str.rjust`が使えないからです。  
変数`x`には`range`から作られたint型の整数が小さい順に入りますが、`rjust`はstr型の文字列のみに対応しており、intに対して使うと`SyntaxError`という「そんな関数ないです」エラーが発生します。  
int型を`repr`でstr型に変換することで`str.rjust`が使えるようになります。

[code]

    "1".rjust(3)
    #'  1'
    repr(1).rjust(3)
    #'  1'
    1.rjust(3)
    #SyntaxError: invalid syntax
    
[/code]

ちなみに`repr(x)`を`str(x)`に書き換えても正常に動作しますが、かえって[難しくなる](https://stackoverflow.com/a/2626364)ので今は大体同じものだと思っていただいて大丈夫です。

`x*x`はxの自乗、`x*x*x`はxの三乗です。  
2の自乗、三乗は4,8になるので、[2]しか入っていない配列でチュートリアルに近いコードを実行してみます。  
`end=' '`がないと、改行が入ってしまいました。  
これは`print`の`end=' '`が指定されていない場合、自動的に`end='\n'`の改行が補完されるからです。

[code]

    for x in [2]:
        print(repr(x).rjust(2), repr(x*x).rjust(3))
        print(repr(x*x*x).rjust(4))
    # 2   4
    #   8
    
    for x in [2]:
        print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
        print(repr(x*x*x).rjust(4))
    # 2   4    8
    
    for x in [2]:
        print(repr(x).rjust(2), repr(x*x).rjust(3), end='終わり')
        print(repr(x*x*x).rjust(4))
    # 2   4終わり   8
    
[/code]

以上の特徴が分かれば、このコード全体の意味は[7.1.2. 文字列の format()
メソッド](https://docs.python.org/ja/3/tutorial/inputoutput.html#the-string-
format-method)と同様の文字列整形を`repr`や`rjust`を使って実現していることが見えてくるのではないでしょうか。


CC BY-SA 4.0
2019-04-09T00:48:25.393
54029
2019-04-09T00:48:25.393
9820
54023
answer