本文主要讲述Python语法的相关文章,怎样编写Python语法的一些做法,这些内容都是一些门户网站和技术论坛找到的,中间可能有不少错误是我没有挑出的,欢迎大家指正。
接下来说下我遇到的问题,本来想学下lambda用法(现在还没搞明白),就在网上找了个例子,如下(print语法我已经改了。



    1.  class People:   
2.        age=0   
3.        gender='male'   
4.        def __init__(self, age, gender):      
5.             self.age = age      
6.             self.gender = gender     
7.       def toString(self):   
8.             return 'Age:'+str(self.age)+'\tGender:'+self.gender     
9.  
10. List
=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]     
11. print('Befor sort:')   
12. for p in List:     
13.      print(p.toString())   
14. List.sort(lambda p1,p2:cmp(p1.age,p2.age))     
15. print('\nAfter ascending sort:')   
16. for p in List:     
17.      print(p.toString())   
18. List.sort(lambda p1,p2:-cmp(p1.age,p2.age))     
19. print('\nAfter descending sort:')   
20. for p in List:     
21.     print(p.toString())

重点:Python语法指定含有一个参数的函数,这个函数被用来提取各个元素之间比较用的关键字(现在看来,这个用法比用lambda更明了些)根据这个提示,终于明白了,我要比较List中每个元素大小,每个元素都是People类,用age成员作为比较关键字,所以很简单联想到要给key赋一个方法,这个方法返回People中的age,所以修改后代码如下:



    1. class People:   
2.    age=0   
3.    gender='male'   
4.    def __init__(self, age, gender):      
5.        self.age = age      
6.        self.gender = gender     
7.    def toString(self):   
8.        return 'Age:'+str(self.age)+'\tGender:'+self.gender     
9.        
10.  List=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]     
11.  print('Befor sort:')   
12.  for p in List:     
13.       print(p.toString())   
14.  List.sort(lambda p1,p2:cmp(p1.age,p2.age))     
15.  print('\nAfter ascending sort:')   
16.  for p in List:     
17.    print(p.toString())   
18.  List.sort(lambda p1,p2:-cmp(p1.age,p2.age))     
19.  print('\nAfter descending sort:')   
20.  for p in List:     
21.    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了。

嗯,估计现在大家差不多明白了这行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。