Hướng dẫn how do i stop a loop count in python? - làm cách nào để dừng đếm vòng lặp trong python?

Trong Python, tôi có thể thực hiện một vòng lặp với bộ đếm bước và điều kiện dừng như một trường hợp cổ điển cho vòng lặp:for loop :

for i in range[50]:
    result = fun[i]
    print[i, result]
    if result == 0: 
        break

trong đó

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
5 là một số hàm tùy ý từ số nguyên đến số nguyên.

Tôi luôn nghi ngờ nếu đó là cách tốt nhất để mã hóa nó [về mặt python và về khả năng đọc và hiệu quả] hoặc tốt hơn là chạy nó như một vòng lặp trong thời gian:Pythonically, and in terms of readability and efficiency] or is it better to run it as a while loop:

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1

Cách tiếp cận nào tốt hơn? Cụ thể - Tôi lo ngại về việc sử dụng tuyên bố

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
6 mà không cảm thấy đúng.

hỏi ngày 11 tháng 6 năm 2017 lúc 7:23Jun 11, 2017 at 7:23

DimgolddimgoldDimgold

2.5384 Huy hiệu vàng25 Huy hiệu bạc47 Huy hiệu đồng4 gold badges25 silver badges47 bronze badges

5

Vòng lặp

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
7 có hiệu suất hơn một chút so với
i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
8 vì
i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
9 được triển khai trong C, trong khi đó, hoạt động
from timeit import timeit

def for_func[]:
    for i in range[10000]:
        result = int[i]
        if result == -1: 
            break

def while_func[]:
    i = 0
    result = 1
    while result != -1 and i < 10000:
        result = int[i]
        i += 1


print[timeit[lambda: for_func[], number = 1000]]
# 1.03937101364
print[timeit[lambda: while_func[], number = 1000]]
# 1.21670079231 
0 được giải thích và đòi hỏi nhiều hoạt động và tạo/ phá hủy đối tượng. Bạn có thể minh họa sự khác biệt hiệu suất bằng mô -đun
from timeit import timeit

def for_func[]:
    for i in range[10000]:
        result = int[i]
        if result == -1: 
            break

def while_func[]:
    i = 0
    result = 1
    while result != -1 and i < 10000:
        result = int[i]
        i += 1


print[timeit[lambda: for_func[], number = 1000]]
# 1.03937101364
print[timeit[lambda: while_func[], number = 1000]]
# 1.21670079231 
1, ví dụ:

from timeit import timeit

def for_func[]:
    for i in range[10000]:
        result = int[i]
        if result == -1: 
            break

def while_func[]:
    i = 0
    result = 1
    while result != -1 and i < 10000:
        result = int[i]
        i += 1


print[timeit[lambda: for_func[], number = 1000]]
# 1.03937101364
print[timeit[lambda: while_func[], number = 1000]]
# 1.21670079231 

Vòng lặp

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
7 được cho là Pythonic hơn trong phần lớn các trường hợp khi bạn muốn lặp lại một đối tượng có thể lặp lại. Hơn nữa, để trích dẫn Wiki Python: "Là vòng lặp cho Python rất mạnh, trong khi hiếm khi được sử dụng ngoại trừ trong trường hợp cần có đầu vào của người dùng". Không có gì không chú ý về việc sử dụng câu lệnh
i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
6 mỗi se.

Khả năng đọc chủ yếu là chủ quan, tôi sẽ nói rằng vòng lặp

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
7 cũng dễ đọc hơn, nhưng nó có thể phụ thuộc vào nền tảng lập trình và kinh nghiệm trước đây của bạn.

Đã trả lời ngày 10 tháng 7 năm 2017 lúc 8:40Jul 10, 2017 at 8:40

Chris_RandsChris_RandsChris_Rands

36.8K13 Huy hiệu vàng80 Huy hiệu bạc112 Huy hiệu đồng13 gold badges80 silver badges112 bronze badges

2

Có một sự khác biệt phút trong hiệu suất. Khi vòng lặp thực hiện kiểm tra boolean thêm ở mỗi lần lặp, nó hơi chậm hơn một chút.

Tuy nhiên, đối với hầu hết các chức năng bạn muốn đánh giá, có một giải pháp thay thế cho việc sử dụng một vòng lặp ở nơi đầu tiên, nhanh hơn. Xem ví dụ được đính kèm bên dưới. Và tôi chắc chắn có nhiều triển khai tối ưu hơn ..

import time

def fun[step]:
    return step == 50000000

t1 = time.time[]
for i in range[500000000]:
    result = fun[i]
#    print[i, result]
    if result == 1: 
        break
print["time elapsed", time.time[] - t1]

t2 = time.time[]
i = 0
result = 0
while result != 1 and i < 50000000:
    result = fun[i]
#    print[i, result]
    i += 1

print["and here", time.time[] - t2]

import numpy as np

t3 = time.time[]

foo = np.arange[500000000]
i = np.where[foo == 50000000]
print["Alternative", time.time[]-t3]

Thời gian trôi qua 11.082087516784668

và ở đây 14.429940938949585

Thay thế 1.4022133350372314

Tuy nhiên, nếu bạn muốn/phải sử dụng một vòng lặp, thì vòng lặp nói chung là con đường pythonic hơn, như được giải thích trong câu trả lời hay này cho một câu hỏi liên quan

EDIT: Câu trả lời của Chris Rands dưới đây giải thích nó từ quan điểm mã C và sử dụng một mức độ chính xác hơn [mặc dù trên các cấp độ vĩ mô như tôi đã buộc ví dụ này, điều đó sẽ không thực sự quan trọng]. Đừng đọc câu trả lời của anh ấy là tốt.

Đã trả lời ngày 7 tháng 7 năm 2017 lúc 12:23Jul 7, 2017 at 12:23

UvaruvarUvar

3.32211 Huy hiệu bạc25 Huy hiệu đồng11 silver badges25 bronze badges

5

Cách tốt nhất sẽ không được lặp lại một cách rõ ràng. itertools cho giải cứu:

from itertools import takewhile
it = [[x, f[x]] for x in range[50]] # first you define the resulting view
it = takewhile[lambda y: y[1] != 0, it] # define when to stop iterating
list[map[print, it]] # if you want to print it

+ Nó sẽ nhanh hơn rất nhiều so với vòng lặp

Đã trả lời ngày 11 tháng 7 năm 2017 lúc 16:55Jul 11, 2017 at 16:55

Simpleancherosimplerancherosimpleranchero

3.1641 Huy hiệu vàng11 Huy hiệu bạc11 Huy hiệu đồng1 gold badge11 silver badges11 bronze badges

3

Nhìn hoàn toàn vào mã byte, trong khi vòng lặp có 30 dòng và vòng lặp có 26 dòng.

Cuối cùng, đừng thực sự nghĩ rằng nó quan trọng đến thế nhưng cá nhân tôi thích phiên bản for-loop vì nó dễ đọc hơn.

//mergely.com/9P1cfnTr/

Mã tôi đã sử dụng:

def fun[i]:
    i = i + 1
    return i

def test1[]:
    i = 0
    result = 1
    while result != 0 and i < 50:
        result = fun[i]
        print[i, result]
        i += 1

def test2[]:
    for i in range[50]:
        result = fun[i]
        print[i, result]
        if result == 0: 
            break

Đã trả lời ngày 7 tháng 7 năm 2017 lúc 12:16Jul 7, 2017 at 12:16

StefanestefaneStefanE

7.47210 Huy hiệu vàng46 Huy hiệu bạc74 Huy hiệu đồng10 gold badges46 silver badges74 bronze badges

1

Thực hiện phương pháp tiếp cận chức năng, tạo một đóng cửa cục bộ thực hiện hành động và trả về giá trị của vị từ chấm dứt. Sau đó lặp lại trên các đầu vào cho đến khi thực hiện.

def action[i]:
    result = fun[i]
    print[i, result]
    return result == 0

list[itertools.takewhile[action, range[50]]]  # non-pythonic wasted list

Một cách khác để chấm dứt một chuỗi các hành động là:

terminated = reduce[lambda done, i: done or action[i], range[50], False]  # extra unnecessary iterations

Có vẻ như chúng ta đã trở lại với tuyên bố

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
6 cho Pythonic

for i in range[50]:
    if action[i]:
        break

Đã trả lời ngày 13 tháng 7 năm 2017 lúc 2:07Jul 13, 2017 at 2:07

Mike Robinsmike RobinsMike Robins

1.7039 huy hiệu bạc14 huy hiệu đồng9 silver badges14 bronze badges

Tôi khá chắc chắn rằng bạn không nên quan tâm đến hiệu suất khi bạn so sánh trong khi và cho các vòng lặp, vì vậy câu hỏi chính là về khả năng đọc.while and for loops, so the main question is about readability.

Tất nhiên, trước hết,

for i in range[50]:
    result = fun[i]
    print[i, result]
    if result == 0: 
        break

tốt hơn nhiều so với

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1

bởi vì bạn không cần phải ghi nhớ một số biến giống như c khi bạn đang đọc vòng lặp đơn giản

Giải pháp của Quidkid khá thanh lịch, nhưng đó là một điểm tốt mà

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
1

Chỉ hoạt động trên các ví dụ khá đơn giản và sẽ mất khả năng đọc vì bạn sẽ yêu cầu thêm một số chức năng bổ sung

Như tôi có thể thấy, vấn đề chính trong mã của bạn là chức năng của bạn không thuần khiết, vì vậy có lẽ bạn nên làm điều gì đó như thế này:

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
2

Đã trả lời ngày 12 tháng 7 năm 2017 lúc 15:21Jul 12, 2017 at 15:21

Nếu hiệu quả là những gì bạn đang tìm kiếm thì hãy sử dụng các chức năng của máy phát điện

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
3

Kết quả của %thời gian trong ipython

Chạy chậm nhất mất 6,15 lần so với nhanh nhất. Điều này có thể có nghĩa là một kết quả trung gian đang được lưu trữ. 10000 vòng, tốt nhất là 3: 30.9 trên mỗi vòng lặp

Đã trả lời ngày 14 tháng 7 năm 2017 lúc 11:49Jul 14, 2017 at 11:49

TheBuzzyCoderTheBuzzyCodertheBuzzyCoder

2.4942 Huy hiệu vàng29 Huy hiệu bạc26 Huy hiệu đồng2 gold badges29 silver badges26 bronze badges

Bạn hoàn toàn không cần câu lệnh Break ... vì các vòng lặp sẽ tự động chấm dứt. Tất cả bạn cần là:

i = 0
result = 1
while result != 0 and i < 50:
    result = fun[i]
    print[i, result]
    i += 1
4

Điều này, sẽ luôn luôn là IMHO dễ đọc hơn.

Đã trả lời ngày 11 tháng 7 năm 2017 lúc 23:54Jul 11, 2017 at 23:54

Quidkidquidkidquidkid

5685 Huy hiệu bạc5 Huy hiệu Đồng5 silver badges5 bronze badges

Bài Viết Liên Quan

Chủ Đề