SORU
10 Aralık 2008, ÇARŞAMBA


Nasıl Python ile birden fazla değer geri dönmek istiyorsun?

Bunu destekleyen dillerde birden çok değer döndürmek için kurallı yolu sık sık tupling.

Seçenek: bir demet Kullanarak

Düşünün bu önemsiz bir örnek:

def f(x):
  y0 = x   1
  y1 = x * 3
  y2 = y0 ** y3
  return (y0,y1,y2)

Ancak, bu hızlı bir şekilde değerleri artar iade sayısı gibi sorunlu olur. Eğer dört ya da beş değerler döndürmek için ne yapmalı? Tabii, onları tupling devam edebilirsin, ama kolay olan unutmak olur. Ayrıca çirkin onları almak istediğiniz her yerde onları açmak için.

Seçenek: sözlük kullanımı

Bir sonraki mantıklı adım bir tür tanıtmak gibi görünüyor 'rekor gösterim'. Python, bunu yapmak için bariz bir şekilde dict.

Aşağıdakileri göz önünde bulundurun:

def g(x):
  y0 = x   1
  y1 = x * 3
  y2 = y0 ** y3
  return {'y0':y0, 'y1':y1 ,'y2':y2 }

(Düzenle - açık, y0, y1 ve y2 olmak için sadece soyut tanımlayıcılar olarak ifade edilir. Olarak, pratikte anlamlı tanımlayıcıları kullanmak istiyorum) işaret etti

Şimdi, döndürülen nesnenin belirli bir üye projesi biz sağlayacak bir mekanizma var. Örneğin,

result['y0']

Seçenek: bir sınıf Kullanarak

Ancak, başka bir seçenek yoktur. Özel bir yapı gelebilirdik yerine. Python bağlamında bu oyuna getirdim, ama diğer diller için de geçerlidir eminim. Eğer çalışıyor olsaydın gerçekten, C bu çok iyi tek seçenek olabilir. Buraya:

class ReturnValue(object):
  def __init__(self, y0, y1, y2):
     self.y0 = y0
     self.y1 = y1
     self.y2 = y2

def g(x):
  y0 = x   1
  y1 = x * 3
  y2 = y0 ** y3
  return ReturnValue(y0, y1, y2)

Python belki de { y0, y1, y2 } tesisat - açısından çok benzer önceki iki iç girişler olmuyor ReturnValue __dict__.

Ek bir özellik, küçük nesneleri, __slots__ öznitelik için Python tarafından sağlanan rağmen. Sınıf olarak ifade edilebilir:

class ReturnValue(object):
  __slots__ = ["y0", "y1", "y2"]
  def __init__(y0, y1, y2):
     self.y0 = y0
     self.y1 = y1
     self.y2 = y2

Python Reference Manual:

__slots__ bildirimi her örneği örnek değişkenler ve saklı bir dizi sadece yeterli alan her değişken için bir değer alır. Alanı __dict__ Her örnek için oluşturulmadı çünkü kaydedilir.

Seçenek: bir liste Kullanarak

Gözden kaçan bence sadece bir öneri Bill Kertenkele gelir:

def h(x):
  result = [x   1]
  result.append(x * 3)
  result.append(y0 ** y3)
  return result

Bu benim en sevdiğim yöntem olsa da. Haskell maruz tarafından kusurlu olduğumu sanıyorum, ama tipi karma listeler fikri beni hep rahatsız hissettim. Bu örnekte listesi-karma yazın, ama makul olabilir. Liste bu şekilde kullanılması gerçekten demet ilişkin bir şey söylemem mümkün olduğunca elde değil. Python listeleri ve dizilerini arasındaki tek fark listeleri mutable, dizilerini değil kanalı bulunurken olmasıdır. Ben şahsen fonksiyonel programlama kuralları taşımak eğilimindedir: aynı türdeki öğeleri ve önceden belirlenmiş türler öğeleri sabit bir sayı dizilerini herhangi bir sayı için kullanmak listeler.

Soru

Uzun önsözünden sonra, kaçınılmaz soru geliyor. Yöntem (sizce) en iyi olan?

Genellikle daha az set-up çalışma gerektirir çünkü sözlük yollardan ben de geçmek buldum. Tür bir bakış açısıyla ancak, bu bir sözlüğü temsil ne kafa karıştırıcı önlemek yardımcı olabilir beri sınıf yol gitmekten daha iyi olabilir. Diğer taraftan, bazı Python topluluk hissediyorum implied interfaces should be preferred to explicit interfaces, hangi noktada bu tür bir nesne değil mi alakalı olduğuna göre temelde güvenerek sözleşme aynı öznitelik hep aynı anlam.

Nasıl- - Python içinde birden çok değer döndürmek?

CEVAP
10 Aralık 2008, ÇARŞAMBA


Named tuples bu amaçla 2.6 eklendi. Ayrıca benzer yerleşik bir örneğin os.stat bkz.

>>> 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007
  • Techmoan

    Techmoan

    31 Mayıs 2009