2013-07-22 56 views
25

Đây có thể là một câu hỏi dễ trả lời, nhưng tôi không thể làm cho chương trình đơn giản này hoạt động và điều đó khiến tôi phát điên. Tôi có đoạn mã này:Tại sao hàm của tôi trả về Không?

def Dat_Function(): 
    my_var = raw_input("Type \"a\" or \"b\": ") 

    if my_var != "a" and my_var != "b": 
     print "You didn't type \"a\" or \"b\". Try again." 
     print " " 
     Dat_Function() 
    else: 
     print my_var, "-from Dat_Function" 
     return my_var 


def main(): 
    print Dat_Function(), "-From main()" 

main() 

Bây giờ, nếu tôi nhập "a" hoặc "b", mọi thứ đều ổn. Đầu ra là:

Type "a" or "b": a 
a -from Dat_Function 
a -From main() 

Nhưng, nếu tôi gõ cái gì khác và sau đó "a" hoặc "b", tôi có được điều này:

Type "a" or "b": purple 
You didn't type "a" or "b". Try again. 

Type "a" or "b": a 
a -from Dat_Function 
None -From main() 

Tôi không biết tại sao Dat_Function() đang trở lại None, vì nó chỉ nên trả lại my_var. Câu lệnh in cho thấy rằng my_var là giá trị đúng, nhưng hàm không trả về giá trị đó vì một lý do nào đó.

+6

Bạn cần làm 'return Dat_Function()' khi gọi nó đệ quy. –

+2

Chỉ cần một mẹo: Cách thành ngữ của điều kiện 'my_var! =" A "và my_var! =" B "' sẽ là 'my_var không có trong '' a ',' b ')' – gonz

Trả lời

42

Nó đang trở lại None bởi vì khi bạn đệ quy gọi nó là:

if my_var != "a" and my_var != "b": 
    print "You didn't type \"a\" or \"b\". Try again." 
    print " " 
    Dat_Function() 

..you không trả về giá trị.

Vì vậy, trong khi đệ quy xảy ra, giá trị trả về sẽ bị hủy bỏ, và sau đó bạn rơi khỏi phần cuối của hàm. Rơi ra khỏi cuối của hàm nghĩa là trăn ngầm trả None, chỉ cần như thế này:

>>> def f(x): 
...  pass 
>>> print(f(20)) 
None 

Vì vậy, thay vì chỉ gọiDat Function() trong bản Tuyên Bố if của bạn, bạn cần phải return nó.

+0

Không nên chạy qua nếu tuyên bố một lần nữa nếu nó được gọi là đệ quy? Tôi không hiểu tại sao nó không trả lại giá trị. – Cate

+0

Không. Xem chỉnh sửa của tôi. Việc đệ quy xảy ra, và sau đó bạn loại bỏ những gì đệ quy trả về. – roippi

+0

Vì vậy, nếu bạn gọi một hàm từ bên trong cùng hàm đó, giá trị trả về sẽ bị loại bỏ, nhưng bạn trả về cùng một hàm trong hàm đó, bạn thực sự chỉ gọi nó trong 'main()'? – Cate

4

Để trả về một giá trị không phải None, bạn cần sử dụng câu lệnh trả về.

Trong trường hợp của bạn, khối if chỉ thực hiện trả lại khi thực hiện một chi nhánh. Di chuyển trả lại bên ngoài khối if/else hoặc trả về trong cả hai tùy chọn.

+0

Tôi đã thử di chuyển nó ra khỏi khối, nhưng vô ích. Thay vì trả lại giá trị chính xác, nó trả về giá trị không chính xác đầu tiên. Ngoài ra, tôi không muốn một câu lệnh return cho phần if của câu lệnh if/else vì tôi muốn hàm chỉ trả về một giá trị đúng. – Cate

4
def Dat_Function(): 
    my_var = raw_input("Type \"a\" or \"b\": ") 

    if my_var != "a" and my_var != "b": 
     print "You didn't type \"a\" or \"b\". Try again." 
     print " " 
     return Dat_Function() 
    else: 
     print my_var, "-from Dat_Function" 
     return my_var 


def main(): 
    print Dat_Function(), "-From main()" 

main() 
0

Tôi nghĩ bạn nên sử dụng trong khi vòng. !

nếu my_var = "a" và my_var = "b": print "Bạn chưa nhập \" a \ "hoặc \ "b \". Hãy thử một lần nữa." print "" trở Dat_Function()

Hãy xem xét rằng bạn gõ một cái gì đó khác biệt so với "a" và "b", tất nhiên, nó sẽ gọi Dat_Function nhưng sau đó nó được bỏ qua phần tiếp theo.Đó là:

khác: in my_var, "-từ Dat_Function" trở my_var

Và sẽ đi trực tiếp vào:

def main(): in Dat_Function (), "-Từ chính()"

Vì vậy, nếu bạn sử dụng trong khi vòng lặp là:

khi my_var = "a" và my_var = "b":! in ('bạn chưa nhập hoặc b') trở Dat_Function()

Bằng cách này tôi nghĩ bạn có thể xử lý nó.