2013-10-01 13 views
5

Đây là chương trình của tôiPython: chức năng của tôi trở lại "Không" sau khi nó làm những gì tôi muốn nó

def reverse(letters): 
    backwards = "" 
    i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
     i = i - 1 
    print (backwards) 

print (reverse("hello")) 

Nó hoạt động, nó in ra "olleh" nhưng sau đó, nó in "Không" trên dòng mới. Và tôi hỏi tại sao lại như vậy. Rõ ràng chương trình là để đảo ngược một từ, mã hoạt động, và không có một chức năng nó không in không có, vì vậy tôi không biết tại sao nó làm trong chức năng. Điều này đang được sử dụng trong một chương trình lớn hơn, vì vậy tôi cần nó như là một hàm, và bởi vì nó cho trường học, tôi không được phép chỉ đơn giản là sử dụng hàm .reverse(). Vì vậy, tôi thực sự cần mã này cố định thay vì những thay đổi lớn, nếu có thể.

+1

có thể trùng lặp của [Trả lại các mục từ danh sách trong hàm. Python] (http://stackoverflow.com/questions/18990977/return-items-from-list-in-function-python) – Freddie

Trả lời

2

Bạn có thể sử dụng câu lệnh trả về để thoát khỏi hàm trả về giá trị. Nếu chức năng được đến kết thúc mà không đạt được một tuyên bố trở lại, nó sẽ trở lại Không theo mặc định

def add1(x): 
    return x+1 

def returnsNone(): 
    pass 

print(add1(2)) 
print(returnsNone()) 
+3

Ngôn ngữ này là gì? Cả hai định nghĩa này không phải là cú pháp python hợp lệ. – Max

+0

@Max: thôi nào, cái đầu tiên chỉ thiếu một dấu hai chấm :) – hugomg

+1

@missingno: Không chỉ vậy. 'end' không có nghĩa gì đặc biệt trong Python. – DSM

4

chức năng trở lại None theo mặc định, vì vậy bạn nên return backwards rõ ràng

cũng có, bạn có thể sử dụng một cách pythonic để giải quyết vấn đề:

letters[::-1] 
+0

upvoting cho cách thức nhiệt đới để giải quyết vấn đề. –

0

Có ý nghĩa nếu bạn nghĩ về điều đó. reverse của bạn không trả lại bất kỳ thứ gì - nó chỉ in kết quả của nó. Nhưng khi bạn viết print (reverse("hello")), bạn đang thực sự in những gì trả về reverse. Vì nó không trả lại bất cứ điều gì, None được in.

1

Mọi hàm trả về nội dung nào đó bằng Python. Nếu bạn không trả về giá trị một cách rõ ràng, Python có hàm trả về None.

Chức năng của bạn không thực sự trả về bất kỳ thứ gì vì print in thành giá trị chuẩn, trong khi return thực sự trả về một giá trị. Họ có thể xem giống nhau trong REPL, nhưng chúng hoàn toàn khác nhau.

Vì vậy, để khắc phục vấn đề của bạn, trả lại một giá trị:

return backwards 
0

Hãy thử chỉ:

reverse(hello) 

Trong thực tế với

print reverse(hello) 

bạn đang in giá trị trả về ngược lại. Và giá trị trả về đó là None.

Hãy để tôi cung cấp cho bạn một vài lời khuyên chung:

đảo ngược() trong mã của bạn là một chức năng có tác dụng phụ (in). Bạn nên tránh chức năng với tác dụng phụ khi bạn không cần, hãy xem xét ngược() trả lại từ thay vì in nó:

def reverse(letters): 
    backwards = "" 
    i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
     i = i - 1 
    return backwards 
print (reverse("hello")) 

Hơn nữa

i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
     i = i - 1 

là không dễ dàng để mantain và nếu bạn thêm chức năng vào vòng lặp sự giảm dần i = i-1 sẽ ở xa nơi mà nó nên 'khái niệm'.Bạn nên thích có sụt lần cùng với việc kiểm tra:

for i in xrange(len(letters)-1,-1,-1): 
    backwards = backwards + letters[i] 

Khi tôi lười biếng tôi viết

myString = myString + fewChars 

vì vậy tôi có thể hiểu được bạn là lười biếng. Nhưng việc thêm vàiChiến không thay đổi myString nhưng tạo một cái mới. Nếu bạn lặp đi lặp lại thêm nhiều ký tự, hiếm khi cách hiệu quả nhất là thêm từng cái một. Xem xét sử dụng join(). Ví dụ

letters = 'word' 
lettersList = [letters[i] for i in xrange(len(letters)-1,-1,-1)] 
myReversed ''.join(lettersList) 

ok Tôi đồng ý là không thể đọc được và có lẽ thậm chí không nhanh, nhưng đối với chuỗi lớn hơn nó quy mô tốt hơn so với một newString = oldString + oneChar cách tiếp cận.

Điều đó nói rằng, hơn pythonic tiếp cận

letters[::-1] 

đã được đề xuất bởi một người nào đó nhanh hơn tôi thường hoạt động tốt hơn và dễ dàng để được đọc bởi các lập trình viên python.

0

Như đã đề cập trước đó. Nếu hàm python không đi qua một câu lệnh return, nó sẽ in theo mặc định là None. Thực hiện một thay đổi nhỏ như được hiển thị bên dưới để khắc phục sự cố này:

def reverse(letters): 
    backwards = "" 
    i = len(letters) - 1 
    while i >= 0: 
     backwards = backwards + letters[i] 
    i = i - 1 
    return(backwards) # instead of print(backwards) 

print(reverse("hello")) 
Các vấn đề liên quan