有关Python语法介绍说明

开发 后端
刚学Python语法的时候,所以是学的最新版的3.1,发现有很多规则都和2.x的不一样,最基本的print都改了,恐怕想把以前的工程移植到。

本文主要讲述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了。#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。

责任编辑:chenqingxiang 来源: 清华大学出版社
相关推荐

2010-02-24 17:22:59

Python项目

2010-02-01 17:11:45

Python 解释器

2010-02-23 14:41:28

Python模块

2010-02-22 16:16:14

Python语法

2010-02-03 17:37:30

Python语法

2010-02-22 14:42:19

Python 控制语句

2010-02-26 11:20:53

Python应用

2010-02-01 16:32:49

Python脚本

2009-12-25 17:11:40

ADO方法

2010-03-03 17:50:45

Android图形界面

2010-03-10 11:26:29

交换机配置

2010-02-02 13:05:58

Python代码

2010-02-03 13:27:17

Python 特性

2010-03-01 10:39:18

Python源代码

2010-03-10 16:32:17

光端交换机

2010-02-22 13:20:58

Python中文问题

2010-02-01 18:06:48

Python Edit

2010-02-02 13:28:46

Python变量

2010-02-03 16:03:44

Python系统文件

2010-01-06 16:53:57

JS两种语法
点赞
收藏

51CTO技术栈公众号