我也刚学python不多久,所以是学的最新版的3.1,发现有很多规则都和2.x的不一样,最最基本的print都改了,恐怕想把以前的工程移植到3.x没有哪个工程是不需要改动的,感觉python有点失败。。。
接下来说下我遇到的问题,本来想学下lambda用法(现在还没搞明白),就在网上找了个例子,如下(print语法我已经改了):
运行,然后报错:
Traceback (most recent call last):
File "C:/WilliamPythonProj/test.py", line 18, in <module>
List.sort(lambda p1,p2:cmp(p1.age,p2.age))
TypeError: must use keyword argument for key function
就是在排序那里出的错,经过查看官方文档得出结论:
-
Return a new sorted list from the items in iterable .
Has two optional arguments which must be specified as keyword arguments.
key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower . The default value is None .
reverse is a boolean value. If set to True , then the list elements are sorted as if each comparison were reversed.
To convert an old-style cmp function to a key function, see the CmpToKey recipe in the ASPN cookbook .
sorted ( iterable [ , key ] [ , reverse ] ) ¶
重点:key指定含有一个参数的函数,这个函数被用来提取各个元素之间比较用的关键字(现在看来,这个用法比用lambda更明了些)
根据这个提示,终于明白了,我要比较List中每个元素大小,每个元素都是People类,用age成员作为比较关键字,所以很简单联想到要给key赋一个方法,这个方法返回People中的age,所以修改后代码如下:
几个需要注意的地方
1. sort(key=People.Age),而不是sort(key=People.Age())
2. sort中的reverse参数,在key之后,布尔型,来指定是否反转排序,以前是在cmp()前加负号实现的
就此,问题得以解决,也反映出了一些问题,要多看官方文档。
现在学python的真少,而且有很多是学的2.x的,3.x的语法和规则改变太大,入门的人为难了,很可能会学一门语言入门两次,哈哈,我还好直接学3.x
在从 Python 2.x 过渡到 Python 3.x 时,开发者面临诸多改变,如 `print` 语法的调整。在尝试使用 `lambda` 函数对包含自定义类实例的列表进行排序时,遇到了 `TypeError`。问题出在 `cmp` 函数不再可用,需使用关键字参数指定 key 函数。解决方法是使用 `key=lambda x: x.age` 对象属性进行比较。

842

被折叠的 条评论
为什么被折叠?



