Tôi giả sử bạn đã cài đặt NumPy (ít nhất là câu hỏi ban đầu của bạn), vì vậy tôi sẽ trình bày cách bạn có thể lấy kết quả của bạn sử dụng numpy-arrays
một cách rất hiệu quả (không có bất kỳ danh sách-comprehensions và lặp đi lặp lại rõ ràng):
> import numpy as np
> s = 10
> l = np.arange(1, 100) * 2 + s * 2 # Arrange produces an array. Syntax is like "range".
> print(l)
array([ 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72,
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,
100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124,
126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150,
152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176,
178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202,
204, 206, 208, 210, 212, 214, 216, 218])
tôi sử dụng thực tế là các phép toán trên mảng NumPy ảnh hưởng đến tất cả các yếu tố này. Do đó việc viết hoạt động như vậy là dễ dàng: np.arange(1, 100) * 2
, vì nó nhân mọi phần tử với 2
và numpy.arange
là khả năng tạo một mảng chứa tất cả các số giữa một số start
và stop
nhất định với tùy chọn step
(giống như python range
).
Với NumPy, nó sẽ không phải là lựa chọn tốt cho append
giá trị đơn (vì điều này tạo lại toàn bộ mảng và không chỉ thêm giá trị). Trong hầu hết các trường hợp, tốt nhất là tạo một mảng với kích thước và hình dạng cuối cùng và hoạt động trực tiếp trên đó. Tất nhiên bạn có thể concatenate
hoặc append
mảng NumPy khác nhau, nhưng như đã đề cập, nó luôn tạo một mảng hoàn toàn mới và do đó không hiệu quả lắm (nếu được sử dụng thường xuyên).
Vì vậy, bây giờ là một vài quan sát về nỗ lực ban đầu của bạn và tại sao nó không làm việc: Chức năng của bạn tạo ra rất nhiều con số, nhưng nó quan trọng hơn họ trong mỗi vòng lặp và chỉ trả về mới nhất:
def func(s):
for i in range(1, 100):
t = i
p = t * 2 + s * 2
# Next iteration of the loop just overwrites p
# Returns only the last p
return p
Bạn có thể làm điều này một máy phát điện (với yield
thay vì return
), nhưng điều đó có thể là quá mức cần thiết ở đây, tôi sẽ chỉ cho nó vẫn :-)
l = []
def func(s):
for i in range(1, 100):
p = i * 2 + s * 2
yield p
l.append(list(func(10))) # Need to convert the generator to a list here.
# In this case a simple "l = list(func(10))" would be easier if you don't need to append.
@AlbertoBonsanto: hiện tại vấn đề với việc chỉnh sửa thụt đầu dòng nên rõ ràng. Đó có phải là 'return' thực sự là một phần của vòng lặp' for' trong hàm không? Và tại sao bạn không thụt lề thân thể chức năng? –
@MartijnPieters Tôi xin lỗi vì tôi đã chỉnh sửa đúng thời điểm! Tôi đã không giả vờ ghi đè lên của bạn! –
Cân nhắc điều này? 'func = lambda s: [(t * 2) + s * 2 cho t trong phạm vi (1, 100)]' – Signal