2012-05-29 37 views
24

Như đã đề cập here, bạn có thể sử dụng sao cho giải nén một số không rõ của các biến (như trong các chức năng), nhưng chỉ trong python 3:sao Python giải nén cho phiên bản 2.7

>>> a, *b = (1, 2, 3) 
>>> b 
[2, 3] 
>>> a, *b = (1,) 
>>> b 
[] 

Trong python 2.7, là tốt nhất tôi có thể đưa ra là (không khủng khiếp, nhưng gây phiền nhiễu):

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

có cách nào để nhập khẩu này từ __future__ bộ phận tương tự, hoặc tôi sẽ cần chức năng của riêng tôi để làm rõ độ dài giải nén trong python 2.7?

+4

số Đó là một trong số ít các Py3k * chỉ * tính năng. – JBernardo

+1

Nó được gọi là mở rộng giải nén –

Trả lời

25

trong python 2.X, bạn có thể làm:

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

càng lâu càng c có ít nhất một thành viên nó sẽ làm việc vì nếu c chỉ có 1 điều trong đó c[1:][].

Bạn nên chắc chắn rằng có ít nhất một điều trong c, hoặc nếu không c[0] sẽ tăng ngoại lệ.

Bạn có thể làm một cái gì đó như:

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

Chỉ khi 'c' là một chuỗi. Unpacking làm việc với bất kỳ iterable, do đó, cho một giải pháp đầy đủ, làm 'c = tuple (c)' đầu tiên. Điều này mô phỏng hành vi chính xác, bao gồm cả treo trên vòng lặp vô hạn. Nhưng bạn vẫn phải làm việc chăm chỉ hơn cho 'a, * b, c = range (10)'; nhưng không có cách nào thực sự xung quanh đó. – lvc

+0

@lvc điểm tốt. Tôi đã chỉnh sửa câu trả lời của mình. – Andbdrew

+2

@lvc man, rằng 'a, * b, c = range (10)' là khá thú vị! – Andbdrew

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

cũng là một lựa chọn để xử lý các trường hợp trong đó c là một chuỗi rỗng, mặc dù nó sẽ không phân biệt giữa [Không] và [] về như các bài tập cho a, b. Vì vậy, sử dụng nó cẩn thận, thử/ngoại trừ có lẽ là tốt nhất.

Tôi không thấy sự khác biệt thực sự giữa Python 3 và 2.7 khi xử lý một vùng chứa trống, nhưng điều tốt đẹp về Python 3 ở đây là nó hoạt động với bất kỳ iterable nào.

Điều này hoạt động ở 2,7 nếu bạn biết c là trình tạo.

a,b = c.next(), c 

Nhưng vẻ đẹp đầy giải nén dường như đòi hỏi Python 3.