2013-10-23 40 views
2

我是Python新手,嘗試通過創建地址簿進行實驗。我懷疑我的displayPerson函數有問題。我不能同時返回多個變量嗎?如何從Python函數中返回多個變量

def lowercasewrapper(func): 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs).lower() 
    return wrapper 

#Class with object attributes 
class People(): 
    numofpeeps = 0 
    listofpeeps = [] 
    def __init__(self, name, age, phone, fblink): 
     self.name=name 
     self.age=age 
     self.phone=phone 
     self.fblink=fblink 
     People.numofpeeps += 1 
     People.listofpeeps.append(self.age) 

    @lowercasewrapper #calling the wrapper, to make all strings lowercase 
    def displayPerson(self): 
     return self.name, self.age, self.phone, self.fblink 

george=People("gEORge", "5", "503-405-4021", "http://facebook.com/boobs") 
dave=People("dave", "10", "971-863-3905", "http://boobs.com") 
charlie=People("CHARLIE", "19", "823-405-2942", "http://boobs.com") 

print george.displayPerson() 
print "Total number of people: ", People.numofpeeps 
print "List of ages: ", People.listofpeeps 


error shows the following: File "example.py", line 54, in <module> 
    print george.displayPerson() 
    File "example.py", line 31, in wrapper 
    return func(*args, **kwargs).lower() 
AttributeError: 'tuple' object has no attribute 'lower' 

回答

0

當然,你可以從一個函數返回多個值。這不是你的問題。

當您從函數返回多個值時,Python會自動將它們包裝在一個元組中。因此,當您撥打displayPerson時,它將按照該順序返回包含該人姓名,年齡,電話號碼和Facebook鏈接的元組。

現在,在您的小寫字母包裝中,您將調用displayPerson的結果,並調用lower方法。不幸的是,元組沒有lower方法。

相反,你需要返回每個元素的新的元組分別轉換爲小寫:

def lowercasewrapper(func): 
    def wrapper(*args, **kwargs): 
     # Get initial result of your function. 
     initial_tuple = func(*args, **kwargs) 
     # Create a new tuple consisting of each member of the 
     # initial tuple, converted to lower case. 
     new_tuple = tuple([x.lower() for x in initial_tuple]) 
     return new_tuple 
    return wrapper 

注:這可以在一個單一的線來完成,我用一對夫婦在這裏說明發生了什麼。

+0

我稍微遵循這一點,但我不能得到它的工作。是複製並粘貼你的例子應該工作?我收到錯誤:未定義全局名稱initial_tuple。 – stephan

+0

是的,它應該按原樣工作。如果它有幫助,它和@DonaldMiner的答案完全一樣(只是格式有點不同以幫助理解) - 可能值得嘗試一下。 – Mac

+0

下方法從哪裏來?這只是內置於Python嗎? – stephan

1

只是

def myFunc(): 
    return 1, 2 

和呼叫者

var1, var2 = yourFunc() 
1

異常由lowercasewrapper不是displayPerson提高。你可以用這個代替:

def lowercasewrapper(func): 
    def wrapper(*args, **kwargs): 
     return [x.lower() for x in func(*args, **kwargs)] 
    return wrapper 

閱讀@DonaldMiner回答更好的解釋。

1

在這一行:

return func(*args, **kwargs).lower() 

你正在服用的,返回,把它降低。當你這樣做:

return self.name, self.age, self.phone, self.fblink 

什麼是確實是這些包4個變量爲一個元組,然後返回。

因此,不幸的是,您正試圖在元組上調用.lower(),而不是在每個項目上。相反,你想通過和一切來電.lower()內:

def lowercasewrapper(func): 
    def wrapper(*args, **kwargs): 

     return tuple(item.lower() for item in func(*args, **kwargs)) 
    return wrapper 

這將使用列表comrpehension。如果你還沒有看到這種語法,你可能想要使用for循環遍歷每個項目並且小寫它。