如何从Python函数返回多个变量

时间:2013-10-23 01:28:30

标签: python

我是Python新手并试图通过创建地址簿进行实验。我怀疑我的displayPerson函数有问题。我不能同时返回多个变量吗?

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'

4 个答案:

答案 0 :(得分:1)

只是

def myFunc():
    return 1, 2

和来电者

var1, var2 = yourFunc()

答案 1 :(得分:1)

lowercasewrapper而不是displayPerson引发了异常。您可以改为使用它:

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

阅读@DonaldMiner答案以获得更好的解释。

答案 2 :(得分: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

{{1}}

这使用list comrpehension。如果您还没有看到这种语法,您可能希望使用for循环迭代每个项目并小写它。

答案 3 :(得分: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

注意:这可以在一行中完成,我在这里用了几个来说明发生了什么。