2012-05-29 22 views
24

olarak here, sadece python 3'te ancak, (fonksiyonlar gibi) değişkenlerin bilinmeyen sayıda açmak için yıldız kullanabilirsiniz sözü:Python yıldızı versiyonu için açma 2.7

piton 2.7, en iyi olarak
>>> a, *b = (1, 2, 3) 
>>> b 
[2, 3] 
>>> a, *b = (1,) 
>>> b 
[] 

Ben (korkunç, ama rahatsız edici değil) 'dir elde edebilirsiniz:

c = (1, 2, 3) 
a, b = c[0], c[1:] if len(c) > 1 else [] 

__future__ gibi bölümünden bu aktarmak için bir yol var mı, yoksa bilinmeyen uzunlukta piton 2.7 açtıktan yapmak için kendi fonksiyonunu ihtiyacım olacak?

+4

sayılı gerektirecek gibi görünüyor. – JBernardo

+1

Bu, genişletilmiş paket açma –

cevap

25

piton 2.x içinde, yapabileceğiniz:

c = (1, 2, 3) 
a, b = c[0], c[1:] 

sürece cc sadece c[1:][] olduğu içinde 1 şey varsa bunun nedeni çalışacak en az bir üyesi olduğu gibi.

Muhtemelen c içinde en az bir şey olduğundan emin olmalısınız, aksi halde c[0] bir istisna oluşturacaktır. o [] açısından [Hiçbiri] ayırt ve olmasa da

try: 
    c = tuple(c) 
    a, b = c[0], c[1:] 
except TypeError, IndexError: 
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it. 
    # do something else 
    pass 
+3

olarak adlandırılır. Sadece "c" bir sıra ise. Paket açma herhangi bir yinelenebilir ile çalışır, bu nedenle tam bir çözüm için, ilk önce 'c = tuple (c)' yapın. Bu, sonsuz yinelenenlere asılı da dahil olmak üzere, davranışı tam olarak öykünür. Ama yine de 'a, * b, c = range (10) 'için daha fazla çalışmak zorundasın; ama bunun etrafında gerçek bir yolu yok. – lvc

+0

@lvc iyi nokta. Cevabımı düzenledim. – Andbdrew

+2

@lvc man, bu 'a, * b, c = range (10)' oldukça havalı! – Andbdrew

2
(a,b) = (None, []) if not len(c) else (c[0], c[1:]) 

, ayrıca c boş dizisidir talebi işleme için bir seçenektir:

Sen gibi bir şey yapabileceğini a'ya atamalar olarak, b. Bu yüzden dikkatli kullanın, deneyin/hariç muhtemelen en iyisidir.

Boş bir kabı ele alırken Python 3 ile 2,7 arasında gerçek bir fark göremiyorum, ancak burada Python 3 ile ilgili güzel olan şey, herhangi bir yinelenebilirlik ile çalışıyor.

Bu, c'nin bir jeneratör olduğunu biliyorsanız, 2.7'de çalışır.

a,b = c.next(), c 

Ama veri açma dolu güzellik birkaç Py3k * Yalnızca * özellikler biri Python 3.