Hướng dẫn dùng go foreach python

Khi tôi gặp tình huống tôi có thể làm điều đó trong javascript, tôi luôn nghĩ rằng nếu có hàm foreach thì nó sẽ thuận tiện. Theo foreach tôi có nghĩa là chức năng được mô tả dưới đây:

def foreach(fn,iterable):
    for x in iterable:
        fn(x)

họ chỉ làm điều đó trên mọi phần tử và không mang lại hoặc trả lại một cái gì đó, tôi nghĩ rằng nó nên là một hàm dựng sẵn và sẽ nhanh hơn viết nó bằng Python thuần túy, nhưng tôi không tìm thấy nó trong danh sách Nó chỉ gọi một tên khác? hoặc tôi chỉ bỏ lỡ một số điểm ở đây?

Có lẽ tôi đã nhầm, vì việc gọi một hàm trong Python có chi phí cao, chắc chắn không phải là một thực hành tốt cho ví dụ. Thay vì một vòng lặp ra, hàm nên thực hiện vòng lặp bên trong thân của nó trông như thế này bên dưới đã được đề cập trong nhiều đề xuất mã của python:

def fn(*args):
    for x in args:
       dosomething

nhưng tôi nghĩ foreach vẫn được chào đón dựa trên hai sự thật:

  1. Trong trường hợp bình thường, mọi người chỉ không quan tâm đến hiệu suất
  2. Đôi khi API không chấp nhận đối tượng lặp lại và bạn không thể viết lại nguồn của nó.

Mọi sự xuất hiện của "foreach" mà tôi đã thấy (PHP, C #, ...) về cơ bản giống như câu lệnh pythons "for".

Đây là ít nhiều tương đương:

// PHP:
foreach ($array as $val) {
    print($val);
}

// C#
foreach (String val in array) {
    console.writeline(val);
}

// Python
for val in array:
    print(val)

Vì vậy, vâng, có một "foreach" trong python. Nó được gọi là "cho".

Những gì bạn đang mô tả là một chức năng "mảng bản đồ". Điều này có thể được thực hiện với danh sách hiể trong python:

names = ['tom', 'john', 'simon']

namesCapitalized = [capitalize(n) for n in names]

Python không có câu lệnh foreach mỗi se . Nó có các vòng lặp for được tích hợp vào ngôn ngữ.

for element in iterable:
    operate(element)

Nếu bạn thực sự muốn, bạn có thể xác định hàm foreach của riêng mình:

def foreach(function, iterable):
    for element in iterable:
        function(element)

Như một lưu ý phụ, cú pháp for element in iterable xuất phát từ ABC ngôn ngữ lập trình, một trong những ảnh hưởng của Python.

Những ví dụ khác:

Vòng lặp Foreach Python:

array = ['a', 'b']
for value in array:
    print(value)
    # a
    # b

Python cho vòng lặp:

array = ['a', 'b']
for index in range(len(array)):
    print("index: %s | value: %s" % (index, array[index]))
    # index: 0 | value: a
    # index: 1 | value: b

mapNAME _ có thể được sử dụng cho tình huống được đề cập trong câu hỏi.

Ví dụ.

map(len, ['abcd','abc', 'a']) # 4 3 1

Đối với các hàm có nhiều đối số, có thể đưa ra nhiều đối số hơn trên bản đồ:

map(pow, [2, 3], [4,2]) # 16 9

Nó trả về một danh sách trong python 2.x và một iterator trong python 3

Trong trường hợp hàm của bạn có nhiều đối số và các đối số đã đã có ở dạng tuples (hoặc bất kỳ lần lặp nào kể từ python 2.6), bạn có thể sử dụng itertools.starmap . (có một cú pháp rất giống với những gì bạn đang tìm kiếm). Nó trả về một iterator.

Ví dụ.

for num in starmap(pow, [(2,3), (3,2)]):
    print(num)

cho chúng tôi 8 và 9

Nếu tôi hiểu bạn đúng, bạn có nghĩa là nếu bạn có hàm 'func', bạn muốn kiểm tra từng mục trong danh sách nếu func (mục) trả về đúng; nếu bạn đúng với tất cả, thì hãy làm gì đó.

Bạn có thể sử dụng 'tất cả'.

Ví dụ: Tôi muốn nhận tất cả các số nguyên tố trong phạm vi 0-10 trong danh sách:

from math import sqrt
primes = [x for x in range(10) if x > 2 and all(x % i !=0 for i in range(2, int(sqrt(x)) + 1))]

Điều này thực hiện foreach trong python 3

test = [0,1,2,3,4,5,6,7,8,"test"]

for fetch in test:
    print(fetch)

Nhìn vào bài viết này . Đối tượng iterator nditer từ gói numpy , được giới thiệu trong NumPy 1.6, cung cấp nhiều cách linh hoạt để truy cập tất cả các yếu tố của một hoặc nhiều mảng theo kiểu có hệ thống.

Thí dụ:

import random
import numpy as np

ptrs = np.int32([[0, 0], [400, 0], [0, 400], [400, 400]])

for ptr in np.nditer(ptrs, op_flags=['readwrite']):
    # apply random shift on 1 for each element of the matrix
    ptr += random.choice([-1, 1])

print(ptrs)

d:\>python nditer.py
[[ -1   1]
 [399  -1]
 [  1 399]
 [399 401]]

Nếu bạn chỉ tìm kiếm một cú pháp ngắn gọn hơn, bạn có thể đặt vòng lặp for trên một dòng:

array = ['a', 'b']
for value in array: print(value)

Chỉ cần tách các câu lệnh bổ sung bằng dấu chấm phẩy.

array = ['a', 'b']
for value in array: print(value); print('hello')

Điều này có thể không phù hợp với hướng dẫn phong cách địa phương của bạn, nhưng sẽ có ý nghĩa khi làm điều đó như thế này khi bạn đang chơi xung quanh trong bảng điều khiển.