2010-06-04 21 views
111

Mỗi ngày tôi yêu python ngày càng nhiều.cách nhiệt đới để làm điều gì đó N lần mà không có biến chỉ mục?

Hôm nay, tôi đã viết một số mã như:

for i in xrange(N): 
    do_something() 

tôi phải làm một cái gì đó N lần. Nhưng mỗi lần không phụ thuộc vào giá trị của i (biến chỉ mục). Tôi nhận ra rằng tôi đang tạo một biến mà tôi chưa bao giờ sử dụng (i), và tôi nghĩ "Có một cách thức sâu sắc hơn để làm điều này mà không cần biến chỉ số vô dụng đó."

Vì vậy ... câu hỏi đặt ra là: bạn có biết cách làm nhiệm vụ đơn giản này theo cách đẹp hơn (pythonic) không?

+0

Tôi nghĩ rằng tôi đã nhìn thấy câu hỏi này ở đâu đó trước đây ... và quên câu trả lời. – mpen

+7

Tôi chỉ biết về biến _, nhưng nếu không tôi sẽ xem xét cách bạn đang làm nó Pythonic. Tôi không nghĩ rằng tôi đã từng nhìn thấy một vòng lặp đơn giản cho thực hiện bất kỳ cách nào khác, ít nhất là trong python. Mặc dù tôi chắc chắn rằng có những trường hợp sử dụng cụ thể mà bạn nhìn vào nó và nói "Đợi đã, nó trông khủng khiếp" - nhưng nói chung, xrange là cách ưa thích (theo như tôi đã thấy). –

+0

Có thể trùng lặp của [Có thể thực hiện một Python cho vòng lặp phạm vi mà không có biến lặp không?] (Http://stackoverflow.com/questions/818828/is-it-possible-to-implement-a-python-for- range-loop-without-an-iterator-variable) –

Trả lời

77

Một cách tiếp cận nhanh hơn một chút so với vòng lặp trên xrange(N) là:

import itertools 

for _ in itertools.repeat(None, N): 
    do_something() 
+1

Nhanh hơn bao nhiêu? Vẫn còn một sự khác biệt trong Python 3.1? –

+13

@Hamish: Bài kiểm tra của tôi với 2.6 cho biết nhanh hơn 32% (23.2 so với 17.6 cho N = 1000). Nhưng đó là thời gian thực sự.Tôi sẽ mặc định mã OP vì nó có thể đọc được ngay lập tức (với tôi). –

+3

Đó là điều tốt để biết về tốc độ. Tôi chắc chắn lặp lại cảm xúc của Mike về mã của OP dễ đọc hơn. –

41

Sử dụng các biến _, như tôi biết khi tôi hỏi question này, ví dụ:

# A long way to do integer exponentiation 
num = 2 
power = 3 
product = 1 
for _ in xrange(power): 
    product *= num 
print product 
+0

Tại sao các downvotes? – GreenMatt

+6

Không phải là downvoter nhưng nó có thể là vì bạn đang đề cập đến một bài đăng thay vì thêm chi tiết hơn trong câu trả lời – Downgoat

+2

@Downgoat: Cảm ơn phản hồi. Điều đó nói rằng, không có nhiều điều để nói về thành ngữ này. Quan điểm của tôi trong việc đề cập đến một bài đăng khác là chỉ ra rằng một tìm kiếm có thể đã tạo ra câu trả lời. Tôi thấy nó mỉa mai rằng câu hỏi này có nhiều lần upvotes như một trong những khác. – GreenMatt

7

Các _ là như nhau điều như x. Tuy nhiên nó là một thành ngữ python được sử dụng để chỉ định một định danh mà bạn không có ý định sử dụng. Trong python, các số nhận dạng này không cần ghi nhớ hoặc phân bổ không gian như các biến làm bằng các ngôn ngữ khác. Thật dễ dàng để quên điều đó. Chúng chỉ là các tên trỏ đến các đối tượng, trong trường hợp này là một số nguyên trên mỗi lần lặp.

7

từ chức năng là hạng công dân, bạn có thể viết wrapper nhỏ (từ Alex trả lời)

def repeat(f, N): 
    for _ in itertools.repeat(None, N): f() 

sau đó bạn có thể vượt qua chức năng như là đối số.

+0

Tôi tự hỏi hình phạt là gì ... –

+0

@Hamish: Hầu như không có gì. (17,8 cho mỗi vòng lặp trong cùng điều kiện như thời gian cho câu trả lời của Alex, cho một sự khác biệt 0,2 chúng tôi). –

+1

Hoặc, tốt hơn, 'cho fn trong itertools.repeat (f, N): fn()' ... – F1Rumors

25

Tôi chỉ sử dụng for _ in range(n), nó thẳng đến điểm. Nó sẽ tạo ra toàn bộ danh sách các số khổng lồ trong Python 2, nhưng nếu bạn đang sử dụng Python 3 thì đó không phải là vấn đề.

6

Giả sử bạn đã xác định do_something làm hàm và bạn muốn thực hiện nó N lần. Có thể bạn có thể thử các cách sau:

todos = [do_something] * N 
for doit in todos: 
    doit() 
+35

Chắc chắn. Chúng ta không chỉ gọi hàm một triệu lần, hãy phân bổ một danh sách một triệu mục. Nếu CPU đang hoạt động, cũng không nên bộ nhớ bị căng thẳng một chút? Câu trả lời không thể được mô tả rõ ràng là "không hữu ích" (nó cho thấy một cách tiếp cận khác, hoạt động) vì vậy tôi không thể downvote, nhưng tôi không đồng ý và tôi hoàn toàn phản đối nó. – tzot

+1

Đó không chỉ là danh sách các tham chiếu N cho cùng một giá trị hàm? –

+0

khá tốt hơn để làm 'fn() cho fn trong itertools.repeat (do_something, N)' và lưu trước khi tạo mảng ... đây là thành ngữ ưa thích của tôi. – F1Rumors

0

Vòng lặp đơn giản là gì?

while times > 0: 
    do_something() 
    times -= 1 

Bạn đã có biến; tại sao không sử dụng nó?

+1

Suy nghĩ duy nhất của tôi là 3 dòng mã so với một (?) – AJP

+2

@AJP - Giống như 4 dòng so với 2 dòng – ArtOfWarfare

+0

thêm so sánh (lần> 0) và giảm (lần - = 1) cho chi phí. .. chậm hơn so với vòng lặp ... – F1Rumors

Các vấn đề liên quan