本文主要讲述Python语法的相关文章,怎样编写Python语法的一些做法,这些内容都是一些门户网站和技术论坛找到的,中间可能有不少错误是我没有挑出的,欢迎大家指正。
接下来说下我遇到的问题,本来想学下lambda用法(现在还没搞明白),就在网上找了个例子,如下(print语法我已经改了。
- class People:
- age=0
- gender='male'
- def __init__(self, age, gender):
- self.age = age
- self.gender = gender
- def toString(self):
- return 'Age:'+str(self.age)+'\tGender:'+self.gender
- List=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]
- print('Befor sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:cmp(p1.age,p2.age))
- print('\nAfter ascending sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:-cmp(p1.age,p2.age))
- print('\nAfter descending sort:')
- for p in List:
- print(p.toString())
重点:Python语法指定含有一个参数的函数,这个函数被用来提取各个元素之间比较用的关键字(现在看来,这个用法比用lambda更明了些)根据这个提示,终于明白了,我要比较List中每个元素大小,每个元素都是People类,用age成员作为比较关键字,所以很简单联想到要给key赋一个方法,这个方法返回People中的age,所以修改后代码如下:
- class People:
- age=0
- gender='male'
- def __init__(self, age, gender):
- self.age = age
- self.gender = gender
- def toString(self):
- return 'Age:'+str(self.age)+'\tGender:'+self.gender
- List=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]
- print('Befor sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:cmp(p1.age,p2.age))
- print('\nAfter ascending sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:-cmp(p1.age,p2.age))
- print('\nAfter descending sort:')
- for p in List:
- print(p.toString())
前两天把《A Byte of Python》大致看了一遍,算是基本可能入门了。动手写了些很简单的小例子,对Python语法有个基本的了解。但是还有一些细节不是很清楚,有些地方可能知其然不知所以然,还有待更深入的学习。今天再翻《Dive into python》,发现写出书上那么简洁但是功能强大的程序还是需要一段时间的。
关于函数定义:函数定义不需要定义返回的数据类型,不需要指定参数的类型。在Python 中, 永远也不需要明确指定任何东西的数据类型。举个例子:char *ret = (x!=0) ? "True" : "False"这行代码对应的python形式就是ret = (x and "True") or "False"(很简单吧,事实上括号可以去掉)。
运行时,python虚拟机会对赋值符右边的布尔表达式(注意这里并非三元表达式)求值,返回值是***一个被分析到的值。为什么是“***一个被分析到的”而不是表达式中“***一个”呢?因为布尔表达式有一个短路效应,比如a or b,如果a为真那么就不会分析b了。#t#
嗯,估计现在大家差不多明白了这行python代码的原理了。如果x为真,由于字符串“True”也为真,于是返回"True",反之,x为假,那么就没必要看字符串"True"了(短路效应),直接返回"False"。不难看出,三元运算在Python语法中事实上可以通过借用布尔求值表达。然后,有时会有点小问题。举个例子,char *ret = x ? "" or "VAL"。
根据前面的例子,我们很自然想到在python里应该这样写,ret = x and "" or "VAL"。错了!不管x的布尔求值是真还是假,ret得到的总是"VAL"。奇怪么?不奇怪,因为在python中对空字符串的布尔求值为false,这样x and ""永远都是false,所以ret得到的自然总是"VAL"了。
解决这个问题有两种办法,***种,也是我喜欢的一种,就是写成ret = not x and "VAL" or ""。第二种,麻烦一点ret=x and [""] or ["VAL"],然后每次取ret[0]作为返回值,这是因为[""]在布尔求值时值为true。