Hướng dẫn what can i use instead of for loops in python? - tôi có thể sử dụng cái gì thay cho các vòng lặp trong python?

Thuộc tính hình ảnh cho http://critical-thinkers.com/2015/01/the-critical-thinking-buddy-system/

Tiêu đề ban đầu là Never Never Write For Loops Again, nhưng tôi nghĩ rằng mọi người đã nói với mọi người khi nghĩ rằng vòng lặp là xấu. Đây 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, don don cần các vòng lặp rõ ràng và tôi nghĩ rằng nó tốt hơn là không viết chúng, hoặc ít nhất, thực hiện một bài tập tinh thần nhanh chóng để nghĩ ra một giải pháp thay thế.

Có một số cách để viết lại các vòng lặp trong Python. Tạm dừng bản thân khi bạn có sự thôi thúc để viết một vòng lặp vào lần tới. Hãy tự hỏi mình, tôi có thực sự cần một vòng lặp để thể hiện ý tưởng không? Hay là có một cách thậm chí còn biểu cảm hơn? " Bài viết này không phải là cố gắng để ra lệnh theo cách bạn nghĩ về việc viết mã. Thay vào đó, bài viết này chỉ cung cấp cho bạn một quan điểm khác. Hy vọng rằng, bạn sẽ bị sốc và học được điều gì đó mới.

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

Nó đã được một thời gian kể từ khi tô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, nó chỉ là một thử thách mà tôi đã đưa ra để thực hành bằng cách 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ứ chỉ trở nên vui vẻ hơn! Không chỉ mã trở nên ngắn hơn và sạch hơn, mà cả mã trông có cấu trúc và kỷ luật hơn. Tôi sẽ nhận được 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 lại một bước và xem những gì mà trực giác đằng sau việc viết một vòng lặp:

  1. Để trải qua một chuỗi để trích xuất một số thông tin
  2. Để tạo ra một chuỗi khác ra khỏi chuỗi hiện tại
  3. Đây là bản chất thứ hai của tôi để viết cho 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 xây dựng thành Python để giúp bạn hoàn thành các mục tiêu! Tất cả những gì bạn cần là thay đổi tâm trí của bạn và nhìn vào những thứ ở một góc độ khác.

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

  1. Ít dòng mã hơn
  2. Khả năng đọc mã tốt hơn
  3. Chỉ còn lại vết lõm để quản lý bối cảnh

Hãy cùng xem bộ xương 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ã. Điều này là khó đọc. Vấn đề tôi tìm thấy trong mã này là nó đang pha trộn logic hành chính (

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
4,
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
5) với logic kinh doanh (
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
6,
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
7) bằng cách cung cấp cho họ sự cố định ở khắp nơi. Nếu bạn bị kỷ luật về việc chỉ sử dụng thụt lề cho logic hành chính, logic kinh doanh cốt lõi của bạn sẽ nổi bật ngay lập tức.administrative logic (the
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
4,
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
5) with the business logic (the
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
6,
result = []
for item in item_list:
new_item = do_something_with(item)
result.append(new_item)
7) by giving them the indentation ubiquitously. If you are disciplined about using indentation only for administrative logic, your core business logic would stand out immediately.

“Căn hộ tốt hơn so với lồng nhau - Zen of Python

Tôi ước rằng mã là 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 cho vòng lặp

1. Liệt kê biểu thức hiểu / máy phát điện

Hãy cùng 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ó danh sách hiểu biết:

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

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

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

2. Chức năng

Suy nghĩ theo cách lập trình 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 danh sách hiểu biết ở đây.)

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

Nếu bạn muốn giảm một chuỗi vào 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 chức năng tích hợp của Python, tiêu thụ Iterables (trình tự hoàn toàn có thể lặp lại 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 các chức năng hoặc máy phát điện

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? Là một lập trình viên, chúng tôi viết các chức năng để trừu tượng hóa những điều khó khăn. Ý tưởng tương tự được áp dụng ở đây. Nếu bạn đang viết bà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ã duy nhất. Thay vào đó, tôi đề xuất 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 lồng nhau?

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

Danh sách hiểu biết trở lại của bạn:

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

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

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 máy phát điện để đạ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 chỉ cần sử dụng một vòng lặp trong hàm máy phát. Như thế là gian lận!"

Tốt thôi, hãy để thử như sau.

4. Don Tiết viết nó cho mình. itertools giúp bạn được bảo hiểm

Mô -đun này chỉ đơn giản là rực rỡ. Tôi tin rằng mô-đun này bao gồm 80% các trường hợp mà bạn khiến bạn muốn viết cho vòng lặp. 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ố gắng chứng minh một điểm-có thể loại bỏ các vòng lặp trong mã của bạn. Tuy nhiên, đây không phải là sự loại bỏ tốt hơn. Ví dụ này rất phức tạp và khó tiêu hóa và sẽ khiến đồng nghiệp của bạn ghét bạn vì đã thể hiện.

Ngoài ra, nếu bạn lặp đi lặp lại trên các chuỗi tổ hợp, có

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 để sử dụng.

Sự kết luận

  1. Bạn không cần phải viết cho vòng lặp trong hầu hết các kịch bản
  2. Bạn nên tránh viết cho vòng lặp, vì vậy bạn có khả năng đọc mã tốt hơn

Hoạt động

  1. Nhìn lại mã của bạn. Phát hiện bất kỳ nơi nào bạn đã viết một vòng lặp trước đây bằng trực giác. Hãy suy nghĩ lại và xem nếu nó có ý nghĩa để viết lại nó mà không cần sử dụng vòng lặp.
  2. Chia sẻ các trường hợp của bạn khó mã hóa mà không cần sử dụng vòng lặp

Tôi có thể sử dụng gì thay vì một vòng lặp?

> foreach () Phương thức này có một hàm và thực thi nó cho mọi yếu tố.Sự thay thế này cho vòng lặp For For For chỉ được sử dụng khi chúng ta không có chức năng bậc cao hơn để sử dụng trong tình huống đó.forEach() This method takes a function and executes it for every element. This alternative for “for” loop is only used when we do not have a better higher order function to use in that situation.

Tôi có thể sử dụng gì thay vì một vòng gấu trúc cho vòng lặp?

Hầu hết thời gian, bạn có thể sử dụng một giải pháp vector hóa để thực hiện các hoạt động gấu trúc của mình.Thay vì sử dụng thao tác loại For For Loop, liên quan đến việc lặp lại thông qua một bộ dữ liệu một giá trị tại một thời điểm, vector hóa có nghĩa là bạn thực hiện một giải pháp hoạt động trên toàn bộ các giá trị cùng một lúc.vectorized solution to perform your Pandas operations. Instead of using a “for loop” type operation that involves iterating through a set of data one value at a time, vectorization means you implement a solution that operates on a whole set of values at once .