Thay thế cho python vòng lặp while

Tiêu đề ban đầu là “Never Write For-Loops Again” nhưng tôi nghĩ nó khiến mọi người lầm tưởng rằng vòng lặp for là xấu. Đây không phải là ý định của tôi. Bài viết này cung cấp một số lựa chọn thay thế cho các trường hợp, IMHO, không cần vòng lặp for rõ ràng và tôi nghĩ tốt hơn hết là không nên viết chúng, hoặc ít nhất, thực hiện một bài tập tinh thần nhanh để nghĩ ra một giải pháp thay thế

Có một số cách để viết lại vòng lặp for trong Python. Tạm dừng bản thân khi bạn muốn viết một vòng lặp for vào lần tới. Hãy tự hỏi: “Tôi có thực sự cần vòng lặp for để diễn đạt ý tưởng không? . Thay vào đó, bài viết này chỉ cung cấp cho bạn một góc nhìn khác. Hy vọng, bạn sẽ bị sốc và học được điều gì đó mới

Khá sốc, phải không? . Tôi thách bạn tránh viết các vòng lặp trong mọi tình huống. Ngoài ra, tôi thách bạn tìm ra những kịch bản khó đến mức khó viết bất cứ thứ gì khác ngoài vòng lặp for. Hãy chia sẻ những phát hiện của bạn. tôi muốn nghe về họ

Đã lâu rồi tôi mới bắt đầu khám phá các tính năng ngôn ngữ tuyệt vời trong Python. Lúc đầu, đó chỉ là một thử thách mà tôi tự đặt ra cho mình để thực hành sử dụng nhiều tính năng ngôn ngữ hơn thay vì những tính năng tôi học được từ ngôn ngữ lập trình khác. Và mọi thứ đang trở nên thú vị hơn. Không chỉ mã trở nên ngắn hơn và sạch hơn mà mã trông cũng có cấu trúc và nguyên tắc hơn. Tôi sẽ đi vào những lợi ích đó nhiều hơn trong bài viết này

Nhưng trước tiên, hãy lùi lại một bước và xem trực giác đằng sau việc viết một vòng lặp for là gì

  1. Để đi qua một trình tự để trích xuất một số thông tin
  2. Để tạo một chuỗi khác từ chuỗi hiện tại
  3. Đây là bản chất thứ hai của tôi để viết các vòng lặp vì tôi là một lập trình viên

May mắn thay, đã có những công cụ tuyệt vời được tích hợp sẵn trong Python để giúp bạn hoàn thành mục tiêu. Tất cả những gì bạn cần là thay đổi tâm trí và nhìn mọi thứ ở một góc độ khác

Những gì bạn đạt được bằng cách không viết các vòng lặp ở mọi nơi

  1. Ít dòng mã hơn
  2. Khả năng đọc mã tốt hơn
  3. Để lại thụt đầu dòng chỉ để quản lý ngữ cảnh

Hãy xem khung mã bên dưới

with ...:
for ...:
if ...:
try:
except:
else:

Trong ví dụ này, chúng tôi đang xử lý nhiều lớp mã. ĐÂY LÀ KHÓ ĐỌC. Vấn đề mà tôi tìm thấy trong mã này là nó đang trộn lẫn logic hành chính (____________4,

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
5) với logic nghiệp vụ (_______1_______6,
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
7) bằng cách cho chúng thụt lề ở khắp mọi nơi. Nếu bạn bị kỷ luật về việc chỉ sử dụng thụt đầu dòng cho logic quản trị, logic kinh doanh cốt lõi của bạn sẽ nổi bật ngay lập tức

“Phẳng tốt hơn lồng” — The Zen of Python

“Tôi ước mã phẳng hơn,” tôi nghe thấy bạn

Các công cụ bạn có thể sử dụng để tránh sử dụng vòng lặp for

1. Danh sách hiểu / Biểu thức trình tạo

Hãy xem một ví dụ đơn giản. Về cơ bản, bạn muốn biên dịch một chuỗi dựa trên một chuỗi hiện có khác

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)

Bạn có thể sử dụng

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
8 nếu bạn yêu thích MapReduce hoặc Python có tính năng Hiểu danh sách

result = [do_something_with(item) for item in item_list]

Tương tự, nếu bạn chỉ muốn nhận một trình vòng lặp, bạn có thể sử dụng Biểu thức trình tạo với cú pháp gần như giống nhau. (Làm sao bạn có thể không yêu thích tính nhất quán trong Python được?)

________số 8_______

2. Chức năng

Suy nghĩ theo cách lập trình bậc cao hơn, nhiều chức năng hơn, nếu bạn muốn ánh xạ một chuỗi sang một chuỗi khác, chỉ cần gọi hàm

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
8. (Hãy là khách của tôi để sử dụng hiểu danh sách ở đây thay thế. )

doubled_list = map(lambda x: x * 2, old_list)

Nếu bạn muốn giảm một chuỗi thành một giá trị duy nhất, hãy sử dụng

result = [do_something_with(item) for item in item_list]
0

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)

Ngoài ra, rất nhiều hàm dựng sẵn của Python sử dụng các lần lặp (các chuỗi đều có thể lặp theo định nghĩa)

>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> all(a)
False
>>> any(a)
True
>>> max(a)
9
>>> min(a)
0
>>> list(filter(bool, a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(a)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> dict(zip(a,a))
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> sorted(a, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> str(a)
‘[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]’
>>> sum(a)
45

3. Trích xuất chức năng hoặc trình tạo

Hai phương pháp trên là tuyệt vời để đối phó với logic đơn giản hơn. Làm thế nào về logic phức tạp hơn? . Ý tưởng tương tự áp dụng ở đây. Nếu bạn đang viết cái này

results = []
for item in item_list:
# setups
# condition
# processing
# calculation
results.append(result)

Rõ ràng bạn đang giao quá nhiều trách nhiệm cho một khối mã. Thay vào đó, tôi đề nghị bạn làm

def process_item(item):
# setups
# condition
# processing
# calculation
return result
results = [process_item(item) for item in item_list]

Làm thế nào về các vòng lặp for lồng nhau?

results = []
for i in range(10):
for j in range(i):
results.append((i, j))

Danh sách toàn diện đã hỗ trợ bạn

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
0

Nếu bạn có một số trạng thái nội bộ trong khối mã để giữ thì sao?

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
1

Hãy trích xuất một trình tạo để đạt được điều này

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
2

“Ồ, đợi đã, bạn vừa sử dụng vòng lặp for trong hàm tạo. Đó là gian lận. ”

Tốt thôi, hãy thử cách sau

4. Đừng tự viết. itertools đã bảo vệ bạn

Mô-đun này đơn giản là tuyệt vời. Tôi tin rằng mô-đun này bao gồm 80% các trường hợp mà bạn muốn viết các vòng lặp for. Ví dụ, ví dụ cuối cùng có thể được viết lại thành

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
3

Tôi biết rồi mà. Đây là một ví dụ khủng khiếp. Tôi chỉ đang cố chứng minh một điểm - “các vòng lặp for có thể bị loại bỏ trong mã của bạn. ” Tuy nhiên, điều này không loại bỏ tốt hơn. Ví dụ này rất phức tạp và khó hiểu và sẽ khiến đồng nghiệp của bạn ghét bạn vì sự phô trương

Ngoài ra, nếu bạn đang lặp trên các chuỗi tổ hợp, có thể sử dụng

result = [do_something_with(item) for item in item_list]
1,
result = [do_something_with(item) for item in item_list]
2,
result = [do_something_with(item) for item in item_list]
3

Tôi có thể sử dụng cái gì thay vì vòng lặp while trong Python?

Thay vì viết điều kiện sau từ khóa while, chúng ta chỉ cần viết trực tiếp giá trị thực để chỉ ra rằng điều kiện sẽ luôn đúng. Vòng lặp chạy cho đến khi nhấn CTRL + C, nhưng Python cũng có câu lệnh ngắt mà chúng ta có thể sử dụng trực tiếp trong mã của mình để dừng loại vòng lặp này.

Có vòng lặp nào khác cho vòng lặp while không?

Vòng lặp while cũng có thể có khối lệnh other tùy chọn . Ở đây, chúng tôi đã sử dụng biến đếm để in chuỗi 'Inside Loop' ba lần. Ở lần lặp thứ tư, điều kiện trong khi trở thành Sai. Do đó, phần khác được thực hiện.

Điều gì tốt hơn vòng lặp while?

Hóa ra là Lặp lại thực sự hiệu quả hơn một chút so với While, được trình bày bên dưới. Lặp lại có thể thuận tiện là trong nhiều tình huống, điều kiện không được biết hoặc thậm chí không được xác định cho đến khi ở trong vòng lặp.

Cái nào tốt hơn cho hoặc vòng lặp trong Python?

Như bạn có thể thấy, vòng lặp for-each vượt trội so với các đối thủ cạnh tranh . Ngoài ra, tốc độ thực hiện thay đổi đáng kể giữa thí sinh nhanh nhất và vòng lặp while lỏng lẻo hơn. vòng lặp for-each nhanh hơn sáu lần so với vòng lặp while. Ngay cả vòng lặp for-range cũng nhanh hơn gần hai lần so với vòng lặp while.