突然一时兴起找了个Python的Tutorial看了一下下,哈哈,感觉非常好,很小巧很讨喜的语言,比较有特点。第一印象是很简单,语法简洁而又功能强大,准备要尝试学一下。
下面贴一点学习的笔记:
一、基本知识Python同时即是脚本解释器,又是一个可以运行命令行的shell。在shell里可以计算任务Python表达式,甚至包括变量赋值,这些变量在shell打开时一直有效,关闭时丢失数据。
函数声明,以def开始,函数名,参数,冒号后面跟函数体。需要注意的是Python里的格式都以缩进的形式来表达,没有类C/C++中的大括号。另外函数
不需要指定返回值类型,实际上,如果函数有return语句,它将返回指定类型值,否则返回None(Python的空值)。
Python即是动态语言,它
不需要显示数据类型声明,赋值的同时即完成变量声明。又是强类型语言,一个变量一旦获得一个数据类型,它实际上就一直是这个类型的了。
Python里的“对象”概念,这里的“对象”不同于以前接触到的OO里的对象,Python里的对象定义更为广泛。一个程序块,一个变量,甚至一个字符串都可以是一个对象。其具体含义还需要根据上下文来判断。
三种重要的内置数据类型:Dictionary,List,Tuple:Dictionary对应于C++中的map和Java中的hashtable,也就是一个键值对集合。
List对应于C++中的vector和java中的ArrayList,一个可以动态自动扩展的数组。
Tuple是一个不可变的list,一旦创建就不能以方式改变它,但是好在Python提供了在Tuple和List之间相互转换的函数。
需要注意的是List和Tuple是可以存储混合类型的数组的,并且都可以通过索引取值(包括负的索引值,其表示从逆序取值)
For语句:Python里的for语句不同于C/C++中的for,更类似于C#中的
foreach
循环或者是Java中的
for (int i : IntArray)
。Python的for语句需要配合一个range函数使用,它有三个参数,并返回一个Tupe数组用于表示索引,三个参数是start,stop,step,例如range(0,5,1)则返回[0,1,2,3,4];range(5,0,-1)则返回[5,4,3,2,1]。
字符串格式化:与C中类似%d,%f,%s等等,通过字符串的join函数可以方便的将list的内容合并成字符串。
and/or:and和or负责执行布尔逻辑运算,但是它们不返回布尔值而是返回它们实际进行比较的值之一。非空的对象被认为是真,空对象则被认为是假。
and运算会返回第一个假值,而or运算返回第一个真值,其它部分都不会被计算到。
lambda函数:一种快速定义的单行最小函数,只有一行,类似于内联的感觉。例如一个例子:
ld = lambda i : i*i
ld(10) # == 100
理论上lambda函数可以有多个参数(包括可选参数)并且隐含的返回单个表达式的值。
两种导入(import)方法:
Python中有两种导入模块的方法: import xx / from xx import yy
它们的差别在于,from xx import
yy这种方式,yy被直接导入到了局部命名空间中(
类似于C++中的using),在以后使用yy的时候不再需要(
不能)加上模块名称限定。也就是说,如果使用import方式导入模块,在使用
它里面的一个变量的时候,你不得不每次都加上前缀xx.来表示使用的是位于xx模块中的变量,而使用from导入时,则不需要加入前缀。
异常处理:Python中使用
try...except来处理异常,使用
raise来引发异常。并且,一个except后面可以跟一个else块来表示没有捕获预期异常时的行为。一个try块后面也可以跟一个
finally块来保证一些代码总是被执行到,比如打开文件后的关闭操作。
注释:
Python里使用
#来作为单选注释开始符,使用三个冒号作为多行注释"""content""",
需要注意的是后一种形式的注意经常被用来作为函数或者类的"说明",写在这里的内容可以被其使用者当作参考手册来使用,Ptyhon里所有对象都具有一个内置的
__doc__属性,通过它可以查看各个对象的说明,应该养成写__doc__的习惯。一般其格式为
首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。
引号:
Python里有单引号,双引号和三引号。其中
单引号和双引号都可以用来表示字符串,例如
print 'string' == "string" 将会打印出True
设置这两种字符串引号的目的是为了简化引号的表示,例如如果字符串里含有引号本身就需要
使用\来进行标识,例如:'let\'s go!',“he said:\"get out!\"”。
如果字符串里含有大量这种情况会显得非常麻烦,可以交替使用单引号和双引号来避免这种情况。上面的例子可以改为:"let's go!",'he said:"get out!"'。
而三引号就是用来表示一个多行字符串。它们经常被用来定义
文档字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。建议从一开始就遵守这个惯例。
二、面向对象
类的定义:以class开头,pass表示结束(实际上没有特定的u),例如一个简单的类定义为
class Person:
pass
如果要表示继承关系只需要将基类用括号回到类名后面即可,Python支持多重继续,每个基类中间以逗号隔开。
class Student(Person):
pass
这里的pass语句仅表示占位之用,没有特别的含义。
类成员定义:__init__方法,这个函数的功能很类似于Java或者C++中的构造函数,但是仍存在一点细小的差别,__init__函数的第一个参数一定是self,类似于C++中的this指针。
__init__方法的定义并
不是必须的,但是一旦你定义了它,就
必须显示的调用父类的__init__方法。
需要注意的是,所有的类成员方法都必须定义一个
参数(self),
但它的名字不是一定的,其作用类似于C++中的
this指针。
__del__方法,类似于析构函数,在使用del语句的时候被调用。
重载:Python的类
没有任何形式的函数重载,即一个方法名称只能对应一个方法,如果子类中定义的与基类中同名的方法,则会将其覆盖掉。
成员属性:Python中有两种类型的成员方法:
普通类方法和专用类方法。
成员也有两种访问级别:
公开的和私有的。
其中公开和私有成员的表示没有特别的关键字,只是体现的方法名称上,私有成员的名称以两个短小的下划线作为开始例如:
class A:
__privatevalue
publicvalue
def __set(self, v):
__privatevalue = v
def get(self):
return publicvalue
pass
并且,一个成员是属于类的还是属于对象的,是通过定义这个变量的域来确定的,定义在类体内的变量由所有成员共享,通过self定义的变量则为成员变量。
此外,类的成员方法还分为:
普通类方法和专用类方法。普通方法的定义与普通函数定义类似,它是公开的,在类外部可以被调用。而类的
专用方法,没有特殊的关键字来表示,只是在方法的名称前后各加上两个短的下划线,例如def __getitem__。这种专用方法是由用户显式调用的,它有点
操作符重载的意思在里面,但是功能比操作符重载要强大一些。Python允许我们自己定义需要的类专用方法,例如任何定义了__cmp__方法的类就可以用==进行比较,任何定义了__len__方法的类就可以用len(instance)进行取长度。
三、标准库
1.文件操作
Python中有一个内置函数open可以用来打开文件
file = open("pictures/dog.bmp","rb")
open函数可以接受三个参数:
文件名,模式和缓冲区参数,但是只有每一个参数是必须的,文件会默认以文本方式打开。
文件的读取和C中类似,tell()返回当前文件位置,seek来移动文件操作的位置。具体的函数使用方法可以使用print seek.__doc__来查看
处理I/O错误:
try:
file = open(filename, "rb", 0)
try:
file.seek(-128,2)
data = file.read(128)
file.seek(0,2)
file.write("succeeded")
finally:
file.close()
expect IOError:
pass
Python提供了一个os.path模块来进行目录操作,具体使用方法就不详细写出来了,用过几次就记住了。
2.序列化标准库里有两个模块都提供这个功能,
pickle和
cPickle,用于将对象存储到文件中而后再读取出来。
但是后者是使用C语言写的,速度要比前面的快很多,但是功能都是一样的。
使用也很简便主要就是使用dump和load函数
------------------待续----------------