- Ver 2: 2008/11/7
- Ver 1: 2008/11/3
基本概念
- Python居然支持复数。如
(-5+4j)
。但要注意虚数单位单独使用时要写成 1j
,不能写成 j
。
- 与Perl和PHP的区别:单引号和双引号没有任何区别。没有插值功能。
- 三引号:
'''
和 """
相当于Perl的heredoc。
- 行尾不需要用分号,分号仅用于一行写多条语句的情况。跟BASIC的冒号有些相似。
- 缩进是有语义的!建议使用TAB缩进
- 逻辑运算符只有
and
or
not
,没有 &&
||
!
- 没有自增自减运算符,
--a
相当于 -(-a)
,a--
语法错
- 赋值语句不是表达式,如
y = (x = 1)
语法错
- 字符串切片是很好用的:
'Hello'[0] == 'H'
,以前只有Basic才有这个功能,其他语言都没有。当然Python比Basic要强大得多
cmp
函数相当于Perl的 <=>
和 cmp
,由于python有类型,所以无需像perl那样用两个运算符
- []、()、{} 的布尔值是False,跟JavaScript不同(JavaScript中空数组和空对象都是true)。与Perl类似,但Perl可以用环境来解释。
运算符与表达式
- 运算符
**
乘幂,Perl也有。
- 字符串的
*
表示重复,相当于Perl的 x 运算符。
- 居然还有专用于整除的
//
。别跟Perl 6的 //
混淆了。
控制流
if-elif-else
,Perl为if-elsif-else
,bash为if-elif-fi
if
、elif
等控制流语句后面要加冒号,很像PHP的语法
while
和for
循环可以带else
,循环正常结束时就会执行else
。不用像C语言那样,循环结束时要检查循环变量是否等于终值,以判断是否正常结束。赞
range
函数生成的结果不包括终点。比较:Perl的 ..
运算符包括终点。所以,Python的range(a,b)
理解成C语言的 for(i=a;i<b,i++)
好些。
- 什么都不做的
pass
语句,算是个python特色
enumerate
能同时迭代key和value,很不错。for key, value in enumerate(LIST):
函数
- 函数中使用全局变量需要用
global
关键字,类似于PHP
- DocString,又一个python特色,函数的第一个逻辑航的字符串作为文档字符串。类似于POD和javadoc,不过是写在函数体内的。还能通过”函数名.doc“访问
lambda
:类似于perl的闭包
int()
函数在字符串转整数时,不能用来转浮点数字符串,也不能转包含字母的字符串。如int("1.2")
、int("123abc")
都是语法错误,而并不返回 1、123。
数据结构
- 列表:定义方式为
a=[1,2]
。等价于perl的数组/列表
- 元组(tuple):定义方式为
a=(1,2)
。
- 要注意列表中的列表不会被打散,如
a=[1,2]
, b=[a,3,4]
,结果就是 b=[[1,2],3,4]
。这一点与Perl不同。
- 字典:定义方式为
c={'a':1, 'b':2}
。等价于perl的散列。注意两点:
- 定义和访问时,key必须用引号引起来。
- 使用{}定义,使用[]访问,即c[‘a’]。与Perl不同。
- 列表赋值是引用赋值。要想拷贝,必须用切片:
b = a[:]
。Perl程序员要注意。
- 列表的
sort
会改变原列表。
例外
try-except-finally
,相当于java的try-catch-finally
- 还有
else
,当没有发生异常、正常结束try块时执行。跟for/while的else块一样
- 故意抛出异常叫
raise
,java里面叫throw
面向对象
- 数字和字符串(对象)是不可变的。那么如何理解
a=a+1
?实际上是a+1创建了一个新对象赋给a,而a原来的对象被回收了。学习Python必须改变原来的“变量是个盒子”的看法
(-1, 100)
之间的整数会被缓存,就是说即使写成 a=10; b=10;
,a和b还是同一个对象(a is b == True)
- python的长整型是无限大的
- 类的
__init__
函数类似于C++的构造函数;__del__
函数类似于C++的析构函数。
- 类方法定义的第一个参数必须为
self
,调用时这个参数会被传递为对象本身。类似于perl,perl中第一个参数也会被传递为对象本身,不过需要程序员自己写 my $self = shift
; 来接收。
- 用C++的话来说,所有成员函数都是虚函数。
- 调用基类方法时要手工传递self,如
Parnet.__init__(self, name)
。
模块
import foo;
相当于perl的 use foo;
from foo import bar
相当于perl的 use foo qw/bar/;