61484


お疲れ様です。python初心者のものです。  
二次元配列内でソートを行いたく、プログラムを作成したのですが。  
コンパイルした結果が、

[code]

    [<__main__.gate object at 0x7f89dbc994e0>, <__main__.gate object at 0x7f89dbc99518>, <__main__.gate object at 0x7f89dbc99550>, <__main__.gate object at 0x7f89dbc99588>, <__main__.gate object at 0x7f89dbc995c0>, <__main__.gate object at 0x7f89dbc995f8>, <__main__.gate object at 0x7f89dbc99630>]
    
[/code]

となり、値が表示されません。

結果としては、

[code]

    Gate=(gate(0,2),gate(2,4),gate(0,4),gate(0,2),gate(0,4),gate(0,3),gate(0,2))
    
[/code]

と小さい値が左となるようにGateを直したいのですが、コンパイル結果がなぜこうなるかわかりません。  
助力していただけると幸いです。

[code]

    class gate():
        def __init__(self,target,control):
            self.tar = target
            self.con = control
    
    Gate = (gate(2,0), gate(2,4), gate(4,0), gate(0,2), gate(4,0), gate(3,0), gate(0,2))
    
    def sort(Gate):
        gate_sort = []
        for g in Gate:
            if g.tar > g.con:
                gate_sort.append(gate(g.con, g.tar))
            elif g.tar < g.con:
                gate_sort.append(gate(g.tar, g.con))
        return gate_sort
    
    print(sort(Gate))
    
[/code]


CC BY-SA 4.0
2019-12-16T09:15:16.400
61478
2019-12-16T11:23:51.827
2019-12-16T10:06:34.843
19110
34359
question
python python3
二次元配列のリスト内のソート結果が上手く表示されない


`sort` 関数自体は実行されていますが、その実行結果の値が人間に読みやすい形で出力されていないだけです。`gate` クラスを良い感じに `print`
するため、`__str__` メソッドもしくは `__repr__` メソッドを実装する必要があります。

Python の [`print`](https://docs.python.org/ja/3/library/functions.html#print)
は、各オブジェクトを `str` した結果の文字列を出力しようとします。自分で作ったクラスのインスタンスに対して `str` が適用された場合、`str`
はまずそのクラスに `__str__` メソッドが無いか探します。あればそれを使い、無ければ `__repr__`
メソッドが無いか探します。よって、これらを実装する必要があります。

たとえば：

[code]

    class MyClass:
        def __repr__(self):
            return "MyClass()"
        def __str__(self):
            return "MyClass()"
    
    x = MyClass()
    print(x)  # MyClass() と出力されます。
    
[/code]

このことは [`str`
のドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#str)などに書かれています。

> _encoding_ も _errors_ も与えられない場合、 `str(object)` は `object.__str__()`
> の結果を返します。これは "略式の" つまり読み易い _object_ の文字列表現です。文字列オブジェクトに対してはその文字列自体を返します。
> _object_ が `__str__()` メソッドを持たない場合、`str()` は代わりに `repr(object)` の結果を返します。

* * *

その他細かい点：

  * Python のよくある流儀的には、クラスの名前を `Gate` にして変数の名前を `gate` にする方が自然です。参考：[PEP-8](https://pep8-ja.readthedocs.io/ja/latest/#id31)
  * 質問の最初の版で `[<__main__.gate object at 0x7f5710078518>]` と出力されていたのは、`return gate_sort` のインデントがおかしく、`sort` 関数の返すリストの長さが必ず 1 以下になるバグがあったためです。つまりこれは「`gate` クラスのインスタンスをひとつ要素に持つ、長さ 1 のリスト」が返ってきています。
  * 「コンパイル」と「プログラムの実行」を区別してください。おそらく質問者さんが行った動作はコンパイルでは無いです。


CC BY-SA 4.0
2019-12-16T09:38:49.960
61479
2019-12-16T09:38:49.960
19110
61478
answer


参考までに、Python 3.6 において `f-strings`([PEP 498: Literal String
Interpolation](https://www.python.org/dev/peps/pep-0498/))という仕組みが導入されました。

format メソッドを使用する場合は以下の様に記述するかと思いますが、

[code]

    def __repr__(self):
      return 'gate({}, {})'.format(self.tar, self.con)
    
[/code]

f-strings ではブレース対の中に変数名を書くことができる様になりました。

[code]

    def __repr__(self):
      return f'gate({self.tar}, {self.con})'
    
    ## print(Gate) を実行
    Gate = (gate(2,0), gate(2,4), gate(4,0), gate(0,2), gate(4,0), gate(3,0), gate(0,2))
    print(Gate)
    =>
    (gate(2, 0), gate(2, 4), gate(4, 0), gate(0, 2), gate(4, 0), gate(3, 0), gate(0, 2))
    
[/code]


CC BY-SA 4.0
2019-12-16T11:23:51.827
61484
2019-12-16T11:23:51.827
61478
answer