web-dev-qa-db-ja.com

Pythonはどのようにして関数から複数の値を返しますか?

私は次のコードを書きました:

class FigureOut:
   def setName(self, name):
      fullname = name.split()
      self.first_name = fullname[0]
      self.last_name = fullname[1]

   def getName(self):
      return self.first_name, self.last_name

f = FigureOut()
f.setName("Allen Solly")
name = f.getName()
print (name)

次のようになります出力:

('Allen', 'Solly')

Pythonの関数から複数の値が返されるたびに、常に複数の値を複数の値のリストに変換してから関数から返しますか?

全体のプロセスは、複数の値を明示的にlistに変換し、Javaのようにリストを返すのと同じですか? ?

20
User_Targaryen

getNameのreturnステートメントは、複数の要素を指定しているため:

def getName(self):
   return self.first_name, self.last_name

Pythonは、基本的にそれらを含むコンテナオブジェクトを返します。

この場合、カンマ区切り要素セットを返すと、タプルが作成されます。複数の値は、コンテナー内でのみ返されます。

複数の値を返す簡単な関数を使用してみましょう。

def foo(a, b):
    return a, b

Pythonバイトコードの逆アセンブラーである dis.dis を使用して、生成されたバイトコードを確認できます。角括弧なしのコンマ区切り値の場合、次のようになります。

>>> import dis
>>> def foo(a, b):
...     return a,b        
>>> dis.dis(foo)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_Tuple              2
              9 RETURN_VALUE

ご覧のとおり、値はまずLOAD_FASTで内部スタックにロードされ、次に BUILD_Tuple (スタックに配置された以前の2要素を取得)が生成されます。 Pythonは、コンマが存在するため、タプルを作成することを知っています。

または、[]を使用して、リストなどの別の戻り値の型を指定することもできます。この場合、 BUILD_LIST は、同等のタプルと同じセマンティクスに従って発行されます。

>>> def foo_list(a, b):
...     return [a, b]
>>> dis.dis(foo_list)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_LIST               2
              9 RETURN_VALUE

返されるオブジェクトのタイプは、括弧の存在に依存します(タプルの場合、少なくとも1つのコンマがある場合は()を省略できます)。 []はリストと{}セットを作成します。辞書にはkey:valペアが必要です。

要約すると、1つの実際のオブジェクトが返されます。そのオブジェクトがコンテナタイプの場合、返される複数の結果の印象を与える複数の値を含めることができます。通常の方法は、それらを直接解凍することです。

>>> first_name, last_name = f.getName()
>>> print (first_name, last_name)

これとは別に、JavaウェイがPythonに漏れています:-)

Pythonでクラスを作成するときはゲッターを使用しないで、propertiesを使用してください。プロパティは、属性を管理する慣用的な方法です。これらの詳細については、ニースの回答 here を参照してください。

から Python Cookbook v.

def myfun():
    return 1, 2, 3
a, b, c = myfun()

myfun()は複数の値を返すように見えますが、Tupleは実際に作成されています。少し奇妙に見えますが、実際には括弧ではなく、タプルを形成するコンマ

はい、Pythonで行われているのは、複数のコンマ区切り値からタプルへ、またはその逆への内部変換です。

Java には同等のものはありませんが、array 'sまたはCollectionsのようないくつかのListsを使用して、この動作を簡単に作成できます。

private static int[] sumAndRest(int x, int y) {
    int[] toReturn = new int[2];

    toReturn[0] = x + y;
    toReturn[1] = x - y;

    return toReturn;

}

この方法で実行されました:

public static void main(String[] args) {
    int[] results = sumAndRest(10, 5);

    int sum  = results[0];
    int rest = results[1];

    System.out.println("sum = " + sum + "\nrest = " + rest);

}

結果:

sum = 15
rest = 5
18
joc

ここでは、実際にTupleを返しています。

Python 3でこのコードを実行する場合:

def get():
    a = 3
    b = 5
    return a,b
number = get()
print(type(number))
print(number)

出力:

<class 'Tuple'>
(3, 5)

ただし、コード行をreturn [a,b]の代わりにreturn a,bに変更して実行する場合:

def get():
    a = 3
    b = 5
    return [a,b]
number = get()
print(type(number))
print(number)

出力:

<class 'list'>
[3, 5]

複数の値を含む単一のオブジェクトのみを返します。

複数の値を返すためのreturnステートメントの別の代替手段があります。yield(を使用して詳細を確認してください Pythonで「yield」キーワードは何をしますか?

サンプル例:

def get():
    for i in range(5):
        yield i
number = get()
print(type(number))
print(number)
for i in number:
    print(i)

出力:

<class 'generator'>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4
6
Kalpesh Dusane

Python関数は常に一意の値を返します。コンマ演算子はタプルのコンストラクタであるため、self.first_name, self.last_nameはタプルに評価され、そのタプルは関数が返す実際の値です。

3
Goyo

Pythonの関数から複数の値が返されるたびに、常に複数の値を複数の値のlistに変換してから関数から返しますか? ?

名前を追加して、関数から返される結果を出力するだけです。結果のタイプは「Tuple」です。

  class FigureOut:
   first_name = None
   last_name = None
   def setName(self, name):
      fullname = name.split()
      self.first_name = fullname[0]
      self.last_name = fullname[1]
      self.special_name = fullname[2]
   def getName(self):
      return self.first_name, self.last_name, self.special_name

f = FigureOut()
f.setName("Allen Solly Jun")
name = f.getName()
print type(name)


ファーストクラス関数」について聞いたことがあるかどうかわかりません。 Pythonは ' first class function 'を持つ言語です

私の答えがお役に立てば幸いです。ハッピーコーディング。

2
Junsuk Park

here も言及されているため、これを使用できます:

import collections
Point = collections.namedtuple('Point', ['x', 'y'])
p = Point(1, y=2)
>>> p.x, p.y
1 2
>>> p[0], p[1]
1 2
0
Ghazal