在Python中,我想使用lambda在列表中找到max元素进行比较.
这段代码没有成功:
# An 'anonymous' object, like JSON object. Use like: Mock(name='Bob', age=30)
class Mock(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
items = [
Mock(cost=10, quantity=1),
Mock(cost=15, quantity=3),
Mock(cost=20, quantity=5),
Mock(cost=100, quantity=2)
]
index, value = max(items, key=lambda(item) : item.cost * item.quantity)
print('$%d, q=%d' % (value.cost, value.quantity))
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
index, value = max(items, key=lambda(item) : item.cost * item.quantity)
TypeError: 'Mock' object is not iterable
Run Code Online (Sandbox Code Playgroud)
我该如何正确实现?
只是一个错误输入:我忘记在属性装饰器之前添加 @。花了大约 1 小时才找出出了什么问题。下面是一个例子:
class Woo(object):
@property
def success(self):
return True
property
def failure(self):
return False
if __name__ == '__main__':
woo = Woo()
print(f'success={woo.success}')
print(f'failure={woo.failure}')
print(f'It\'s fine to call failure()={woo.failure()}')
Run Code Online (Sandbox Code Playgroud)
结果是:
success=True
failure=<bound method Woo.failure of <__main__.Woo object at 0x0000016050D4F6D8>>
It's fine to call failure()=False
Run Code Online (Sandbox Code Playgroud)
我想知道为什么 Python 编译器允许在语法中使用“裸装饰器”(例如,没有装饰器前缀 @ 的属性)以及它在语义上的含义。