2016-03-19 10 views
6

Tôi chỉ muốn sử dụng for vòng lặp cho t biến trong chức năng của tôi:Làm cách nào để sử dụng vòng lặp 'for' chỉ cho một biến trong một hàm phụ thuộc vào hai biến?

l = [] 

def func(s): 
    for i in range(1, 100): 
     t = i 
     p = t * 2 + s * 2 
    return p 

l.append(func(10)) 

print l 

Tôi muốn giá trị của t để đi 1-99 và và in một danh sách của tất cả các giá trị, nhưng tôi luôn cuối cùng nhận được l = [218].

+2

@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? –

+0

@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! –

+0

Cân nhắc điều này? 'func = lambda s: [(t * 2) + s * 2 cho t trong phạm vi (1, 100)]' – Signal

Trả lời

41

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 2numpy.arange là khả năng tạo một mảng chứa tất cả các số giữa một số startstop 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. 
+0

khi sử dụng máy phát điện 'lợi nhuận', kết quả xuất hiện dưới dạng một phần tử 1 trong danh sách. làm thế nào tôi có thể in 'def func (s)' để tôi có thể vẽ nó chống lại một danh sách khác –

+0

@ p.kumar làm thế nào để bạn sử dụng máy phát điện? Ít nhất theo cách đó với 'list (func (s))' có vẻ hoạt động tốt trên máy tính của tôi, kết quả là một danh sách chứa 99 phần tử. Về 'âm mưu', có thể xem ['matplotlib.pyplot.plot'] (http://matplotlib.org/api/pyplot_api.html). – MSeifert

4

Bạn đang tính toán một giá trị nhiều lần (trong khi không thêm nó vào danh sách), sau đó nối giá trị cuối cùng vào danh sách.

Thay vào đó, chúng tôi muốn thêm vào danh sách khi chúng tôi thực hiện.

def func(s): 
    l = [] 
    for i in range(1, 100): 
     l.append(i*2+s*2) 
    return l 

Bạn cũng có thể thực hiện việc này trong một dòng bằng cách sử dụng list comprehension nếu bạn sắp hết thời gian.

func = lambda s: [(t*2)+s*2 for t in range(1, 100)] 

Output:

[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] 

Lưu ý 218 ở cuối. Như tôi đã nói trước đây, bạn chỉ trả lại giá trị cuối cùng, vì vậy, chương trình của bạn đã trả về 218.

+4

Thậm chí nếu bạn nhấn mạnh vào không cần thiết một lớp lót, tốt nhất là làm điều đó với 'def', không phải' lambda'; 'lambda' có nghĩa là chức năng không biết tên riêng của nó, mà phá vỡ các công cụ đơn giản như tẩy (ngầm tham gia vào các công cụ như' multiprocessing' hoặc 'concurrent.futures' hoặc thậm chí' copy.deepcopy' trong một số trường hợp). 'def func (s): trả về [(t * 2) + s * 2 cho t trong phạm vi (1, 100)]' chỉ là một hàng, tương tự ngắn gọn, và chức năng hơn (theo nghĩa Anh, không phải là ý nghĩa thiết kế ngôn ngữ). – ShadowRanger

0

Vì có ar rất nhiều giải pháp đó. Với các thư viện hoặc máy phát khác nhau. Bạn chỉ có vấn đề thụt đầu dòng trong mã của bạn và nó đã sẵn sàng để bay. Đây là sửa đổi nhỏ trong mã của bạn.

#In Python3 
def func(s): 
    for i in range(1,100): 
     p = i * 2 + s * 2 
     l.append(p) 
    return l 
l =[] 
print(func(10)) 
Các vấn đề liên quan