2010/06
30
本书假定读者是一个有经验的程序员,最好是已经阅读过其他python相关书籍的人。本章将对python做一个快速的介绍。
python概要
本概要针对有经验的程序员。建议你先参考python官方文档,特别推荐Python快速参考. 或者其他的一些python书籍,比如 Mark Lutz 和 David Ascher 的著作:, O'reilly出版,1999.
Python一般被认为是一种脚本语言,但事实并非仅仅如此。不像普通脚本语言,Python并不局限于某一特殊领域,更准确的说,Python应该被看作是一种提供脚本语言形式的编程语言。在实现脚本语言的之外,你会发现,Python可以替代你的任何批处理操作、shell脚本以及一些简单程序。Python的使用范围,已经超过了传统意义上脚本语言的使用范围。
Python语言易于书写和阅读。及时在很长一段时间后,你仍旧可以很快的阅读你之前的代码。阅读其他人的代码也是很容易的。Python语法十分的简洁,扼要。主要的一个原因是他使用了缩进来标示代码块。例如:
"#"符号标示注释,和C++.Java中的//相同。
首先,我们来看If的语法,其基本语法于C相似。但在C中,If的条件式需要使用圆括号括起来,但在python中,圆括号并不是必需的(当然,加上也是可接受的)。
Python中的条件式使用冒号来结束。其下的代码块使用缩进来标示,类似于then的作用法。在本例中,print语句用来输出信息到标准输出,其下是一个赋值语句。接下来的语句没有缩进,已然,他不再属于if的代码块了。缩进是可嵌套的,和C++,Java中的花括号相似。一点不同是,Python中的缩进是不可省略的。编译器强制每一处代码都必须使用缩进格式。这就是为什么Python能够保持很好的可读性的原因。
通常,Python一行只写一个语句(虽然你可以使用分号来写多个语句),一行语句结尾的分号也不是必须的。在上述示例代码中,你可以看到,python语法被设计的尽可能的简单,而且具备充分的代码可读性.
基本容器
在C++和Java中,容器类型以组件的方式被引入,他们并非语言所必须的。在Python中,几种重要的容器类型将作为基本类型内置在核心中,比如列表list,关联数组map(别名:映射,字典,哈希表)。这使得Python语法更加优雅。
另外,for语法使用自动迭代器,而不是通过下标访问。使用for循环来遍历一个数组或容器显得非常的方便。以下代码暂时了如何使用Python的自动迭代器来访问列表:
第一行建立了一个列表。你可以直接print输出一个列表,其结果和你输入的形式看起来很相似(相反的,在Thinking in Java的例子中,为了打印一个数组,我不得不建立一个图书的Arrays2类)。队列和java中的容器相似,你可以给他添加新元素(这里使用了append),他们会自动的增加队列长度。后面的for语句建立了一个迭代器x,其值为列表中的每一个元素值。
你可以使用range()来建立一个连续数字列表。你可以利用该特性来模仿C中的for语法
例如:
注意,python不需要进行变量类型定义,对象名字随时可以在需要的时候出现。Python将自动推断他们的类型。
Python的语法,将让你感觉到,你只需敲你必须敲入的字符。在使用python一段时间后,你会发现,在非python语言中,必须键入大量的括号,花括号,分号以及其他一些多余的和程序意图不相干的符号是一件相当烦人的事情。
函数
Python中使用def关键字来建立函数,其后紧跟这函数名称和参数列表。冒号之后,是函数主体。
以下是定义函数的第一个例子:
函数声明中,只有函数名称和参数列表,没有类型申明,也不需要返回值类型和参数类型定义。Python是弱类型语言,你不需要为此敲入额外的类型定义代码。你也可以在函数中传入或返回不同类型的值。如以下示例:
唯一一个强制性要求是,你传入函数中的参数必须能够被函数所正确执行,其他的,他不做限制。下面的例子,将使用了+的方法操作数字或字符串:
当操作符+号被用作字符串时,他的意义是连接(肯定的,Python支持操作符重载,而且它能够很漂亮的完成)
字符串
上面的例子也提到了一点点字符串的处理方式,他是我所见过的语言中最好的。你可以使用单引号或双引号来表示一个字符串。如果你使用双引号,其內你可以插入一个单引号字符,反之亦然:
注:Python并不是来源于蛇的名字,而是来源于一个马戏团。上面的例子就是来自于Python-esque马戏团的一些场景
三引号将对其间所有部分进行引用,包括换行。这对于生成web页面等特别有用(Python是一个很好的CGI程序),你可以使用三引号的方式来输出整个页面。
在r标记符右侧的字符串表示不需要进行反斜杠转义,当你需要插入反斜杠时,你不需要输入额外的反斜杠。
对字符串进行替换是非常简单的事情。Python使用了C的printf语法。在字符串后跟一个%号即可使用:
看第二个例子,当你需要输出不止一个参数的时候,你需要使用圆括号将它们括起来(这里的术语是“元组”,用来表示一个不可被修改的列表。你也可以使用常规的列表,但元组这种形式更为常见)。
Python支持C中所有的printf参数,包括数字千分号及对齐等。
Python也非常完美的支持正则表达式。
类
和Python其他的语法相似,只需要很少的代码就可以定义一个类。类的定义只需要使用class关键字,类主体中使用def关键字定义方法。以下是一个简单类:
上面两个方法都将self作为了其第一个参数,C++, Java则隐藏了他们。这一参数指向对象实例本身,类方法可以使用关键字this来代表实例本身。Python方法需要显式的将实例自身作为方法的第一参数。一般的,参数名字使用self,你也可以改变成其他的变量名,但这会给其他的人造成困惑。当你需要访问实例的属性或方法时,你需要在表达式中使用self.语法。在做实例的方法调用时,如x.show(),不需要传递self参数,系统已经为你做好了。
这里,第一个方法比较特殊,它以两个下划线开始,并以两个下划线结束。在这个例子中,它表示构造函数,在建立对象时,本函数将被自动调用。这和C++,Java的构造函数相似。在示例底部,我们可以看到类的实例化操作,其语法与一个函数调用并无差异。这里不需要new关键字。这和C++, java不同。
底部的一些代码被放置在一个if语句的代码块中。他用来检查__name__变量是否和"__main__"相等。由两个双下划线包含的变量是一类特殊的变量。这里的IF语句用来判断这个文件是否是被系统直接调用。在本例中,只有当你直接运行这个文件时,底部if代码块类的代码才会被执行,否则该文件只是完成了类的定义操作。你可以这样调用执行IF语句中的代码块:
当你在其他模块中对这个类进行import操作时,if代码块中的内容则不会被执行。
有时,新手常常会很惊讶,在pyton中类属性的定义是直接在方法中完成的。而不是像C++或Java,需要在方法外进行独立的类属性定义。建立一个属性,你只需要在方法中使用self加变量名称就可以了。通常会在构造函数中进行定义,但并非总是如此。类属性所需要的存储空间将在运行时被分配。在C++和Java程序员看来,这看起来很怪,他们总是习惯在类的头部就定义好属性,这样可以确定一个实例需要使用多少存储空间。
继承
由于Python是弱类型语言,因此它并不关心接口的概念。它唯一关心的,就是在运行时的操作能够成功的作用于对象(事实上,Java中的Interface关键字在Python中是不存在的)。这样,类继承的使用场景不太相同了。C++和Java中使用继承,往往希望获得其接口,而在Python中,使用继承的目的和代码实现密切相关,继承的目的是希望重用父类的代码。
使用继承时需要先指示出其父类的位置。在建立一个文件时,Python都隐式的建立一个模块(这个概念和JAVA中“包”概念相似),模块名称和文件名相同。不需要package关键字。当需要引入一个模块时,使用import关键字和其模块名称即可。 Python会在PYTHONPATH目录中搜索模块名称,这和Java在CLASSPATH中进行搜索是相似的。一个好处是,Python没有Java中的import陷阱。若只需要局部引入模块中的一个方法或类时,可以使用模块名称,分隔符,和方法名或类名。语法如下:
name(s)是由逗号分隔的一系列函数名或类名。
我们回到使用继承上来,继承的语法是:在子类名后面加上(),中见填上父类的类名。我们现看上面的Simple类,他所在文件名,即模块名称为SompleClass。因此,我们先需要使用import引入它:
Simple2继承自Simple, 在其构造函数中,父类的构造函数也被调用了。display( ), showMsg( ) 方法可以直接通过self进行调用。当子类和父类有相同的方法时,子类的方法将被重载。在构造函数中,你必须将所有参数全部传入,包括将self作为第一参数。上面还可以看到show方法被重载了。
在__main__代码块中,可以看到基类的构造函数也被调用了,基本的方法showMsg在父类中同样可以使用,
Different类也实现了show方法,但这个类并非Simple类的子类。__main__代码块中定义的f函数演示了弱类型语法。f函数关心的是obj参数是否支持show方法,而不关心obj的类型。因此Simple类和非Simple类都是可接受的。C++实现这样的方法需要使用template语法。Python作为一种弱类型语言,他天生就具备template能力。
python概要
本概要针对有经验的程序员。建议你先参考python官方文档,特别推荐Python快速参考. 或者其他的一些python书籍,比如 Mark Lutz 和 David Ascher 的著作:
Python一般被认为是一种脚本语言,但事实并非仅仅如此。不像普通脚本语言,Python并不局限于某一特殊领域,更准确的说,Python应该被看作是一种提供脚本语言形式的编程语言。在实现脚本语言的之外,你会发现,Python可以替代你的任何批处理操作、shell脚本以及一些简单程序。Python的使用范围,已经超过了传统意义上脚本语言的使用范围。
Python语言易于书写和阅读。及时在很长一段时间后,你仍旧可以很快的阅读你之前的代码。阅读其他人的代码也是很容易的。Python语法十分的简洁,扼要。主要的一个原因是他使用了缩进来标示代码块。例如:
#: c01:if.py response = "yes" if response == "yes": print "affirmative" val = 1 print "continuing..." #:~
"#"符号标示注释,和C++.Java中的//相同。
首先,我们来看If的语法,其基本语法于C相似。但在C中,If的条件式需要使用圆括号括起来,但在python中,圆括号并不是必需的(当然,加上也是可接受的)。
Python中的条件式使用冒号来结束。其下的代码块使用缩进来标示,类似于then的作用法。在本例中,print语句用来输出信息到标准输出,其下是一个赋值语句。接下来的语句没有缩进,已然,他不再属于if的代码块了。缩进是可嵌套的,和C++,Java中的花括号相似。一点不同是,Python中的缩进是不可省略的。编译器强制每一处代码都必须使用缩进格式。这就是为什么Python能够保持很好的可读性的原因。
通常,Python一行只写一个语句(虽然你可以使用分号来写多个语句),一行语句结尾的分号也不是必须的。在上述示例代码中,你可以看到,python语法被设计的尽可能的简单,而且具备充分的代码可读性.
基本容器
在C++和Java中,容器类型以组件的方式被引入,他们并非语言所必须的。在Python中,几种重要的容器类型将作为基本类型内置在核心中,比如列表list,关联数组map(别名:映射,字典,哈希表)。这使得Python语法更加优雅。
另外,for语法使用自动迭代器,而不是通过下标访问。使用for循环来遍历一个数组或容器显得非常的方便。以下代码暂时了如何使用Python的自动迭代器来访问列表:
#: c01:list.py list = [ 1, 3, 5, 7, 9, 11 ] print list list.append(13) for x in list: print x #:~
第一行建立了一个列表。你可以直接print输出一个列表,其结果和你输入的形式看起来很相似(相反的,在Thinking in Java的例子中,为了打印一个数组,我不得不建立一个图书的Arrays2类)。队列和java中的容器相似,你可以给他添加新元素(这里使用了append),他们会自动的增加队列长度。后面的for语句建立了一个迭代器x,其值为列表中的每一个元素值。
你可以使用range()来建立一个连续数字列表。你可以利用该特性来模仿C中的for语法
例如:
#: c02:list.py list = [ 1, 3, 5, 7, 9, 11 ] print list list.append(13) for i in range(len(list)): print list[i]
注意,python不需要进行变量类型定义,对象名字随时可以在需要的时候出现。Python将自动推断他们的类型。
Python的语法,将让你感觉到,你只需敲你必须敲入的字符。在使用python一段时间后,你会发现,在非python语言中,必须键入大量的括号,花括号,分号以及其他一些多余的和程序意图不相干的符号是一件相当烦人的事情。
函数
Python中使用def关键字来建立函数,其后紧跟这函数名称和参数列表。冒号之后,是函数主体。
以下是定义函数的第一个例子:
#: c01:myFunction.py
def myFunction(response):
val = 0
if response == "yes":
print "affirmative"
val = 1
print "continuing..."
return val
print myFunction("no")
print myFunction("yes")
#:~
函数声明中,只有函数名称和参数列表,没有类型申明,也不需要返回值类型和参数类型定义。Python是弱类型语言,你不需要为此敲入额外的类型定义代码。你也可以在函数中传入或返回不同类型的值。如以下示例:
#: c01:differentReturns.py
def differentReturns(arg):
if arg == 1:
return "one"
if arg == "one":
return 1
print differentReturns(1)
print differentReturns("one")
#:~
唯一一个强制性要求是,你传入函数中的参数必须能够被函数所正确执行,其他的,他不做限制。下面的例子,将使用了+的方法操作数字或字符串:
#: c01:sum.py
def sum(arg1, arg2):
return arg1 + arg2
print sum(42, 47)
print sum('spam ', "eggs")
#:~
当操作符+号被用作字符串时,他的意义是连接(肯定的,Python支持操作符重载,而且它能够很漂亮的完成)
字符串
上面的例子也提到了一点点字符串的处理方式,他是我所见过的语言中最好的。你可以使用单引号或双引号来表示一个字符串。如果你使用双引号,其內你可以插入一个单引号字符,反之亦然:
#: c01:strings.py print "That isn't a horse" print 'You are not a "Viking"' print """You're just pounding two coconut halves together.""" print '''"Oh no!" He exclaimed. "It's the blemange!"''' print r'c:\python\lib\utils' #:~
注:Python并不是来源于蛇的名字,而是来源于一个马戏团。上面的例子就是来自于Python-esque马戏团的一些场景
三引号将对其间所有部分进行引用,包括换行。这对于生成web页面等特别有用(Python是一个很好的CGI程序),你可以使用三引号的方式来输出整个页面。
在r标记符右侧的字符串表示不需要进行反斜杠转义,当你需要插入反斜杠时,你不需要输入额外的反斜杠。
对字符串进行替换是非常简单的事情。Python使用了C的printf语法。在字符串后跟一个%号即可使用:
#: c01:stringFormatting.py val = 47 print "The number is %d" % val val2 = 63.4 s = "val: %d, val2: %f" % (val, val2) print s #:~
看第二个例子,当你需要输出不止一个参数的时候,你需要使用圆括号将它们括起来(这里的术语是“元组”,用来表示一个不可被修改的列表。你也可以使用常规的列表,但元组这种形式更为常见)。
Python支持C中所有的printf参数,包括数字千分号及对齐等。
Python也非常完美的支持正则表达式。
类
和Python其他的语法相似,只需要很少的代码就可以定义一个类。类的定义只需要使用class关键字,类主体中使用def关键字定义方法。以下是一个简单类:
#: c01:SimpleClass.py
class Simple:
def __init__(self, str):
print "Inside the Simple constructor"
self.s = str
# Two methods:
def show(self):
print self.s
def showMsg(self, msg):
print msg + ':',
self.show() # Calling another method
if __name__ == "__main__":
# Create an object:
x = Simple("constructor argument")
x.show()
x.showMsg("A message")
#:~
上面两个方法都将self作为了其第一个参数,C++, Java则隐藏了他们。这一参数指向对象实例本身,类方法可以使用关键字this来代表实例本身。Python方法需要显式的将实例自身作为方法的第一参数。一般的,参数名字使用self,你也可以改变成其他的变量名,但这会给其他的人造成困惑。当你需要访问实例的属性或方法时,你需要在表达式中使用self.语法。在做实例的方法调用时,如x.show(),不需要传递self参数,系统已经为你做好了。
这里,第一个方法比较特殊,它以两个下划线开始,并以两个下划线结束。在这个例子中,它表示构造函数,在建立对象时,本函数将被自动调用。这和C++,Java的构造函数相似。在示例底部,我们可以看到类的实例化操作,其语法与一个函数调用并无差异。这里不需要new关键字。这和C++, java不同。
底部的一些代码被放置在一个if语句的代码块中。他用来检查__name__变量是否和"__main__"相等。由两个双下划线包含的变量是一类特殊的变量。这里的IF语句用来判断这个文件是否是被系统直接调用。在本例中,只有当你直接运行这个文件时,底部if代码块类的代码才会被执行,否则该文件只是完成了类的定义操作。你可以这样调用执行IF语句中的代码块:
python SimpleClass.py
当你在其他模块中对这个类进行import操作时,if代码块中的内容则不会被执行。
有时,新手常常会很惊讶,在pyton中类属性的定义是直接在方法中完成的。而不是像C++或Java,需要在方法外进行独立的类属性定义。建立一个属性,你只需要在方法中使用self加变量名称就可以了。通常会在构造函数中进行定义,但并非总是如此。类属性所需要的存储空间将在运行时被分配。在C++和Java程序员看来,这看起来很怪,他们总是习惯在类的头部就定义好属性,这样可以确定一个实例需要使用多少存储空间。
继承
由于Python是弱类型语言,因此它并不关心接口的概念。它唯一关心的,就是在运行时的操作能够成功的作用于对象(事实上,Java中的Interface关键字在Python中是不存在的)。这样,类继承的使用场景不太相同了。C++和Java中使用继承,往往希望获得其接口,而在Python中,使用继承的目的和代码实现密切相关,继承的目的是希望重用父类的代码。
使用继承时需要先指示出其父类的位置。在建立一个文件时,Python都隐式的建立一个模块(这个概念和JAVA中“包”概念相似),模块名称和文件名相同。不需要package关键字。当需要引入一个模块时,使用import关键字和其模块名称即可。 Python会在PYTHONPATH目录中搜索模块名称,这和Java在CLASSPATH中进行搜索是相似的。一个好处是,Python没有Java中的import陷阱。若只需要局部引入模块中的一个方法或类时,可以使用模块名称,分隔符,和方法名或类名。语法如下:
from module import name(s)
name(s)是由逗号分隔的一系列函数名或类名。
我们回到使用继承上来,继承的语法是:在子类名后面加上(),中见填上父类的类名。我们现看上面的Simple类,他所在文件名,即模块名称为SompleClass。因此,我们先需要使用import引入它:
#: c01:Simple2.py
from SimpleClass import Simple
class Simple2(Simple):
def __init__(self, str):
print "Inside Simple2 constructor"
# You must explicitly call
# the base-class constructor:
Simple.__init__(self, str)
def display(self):
self.showMsg("Called from display()")
# Overriding a base-class method
def show(self):
print "Overridden show() method"
# Calling a base-class method from inside
# the overridden method:
Simple.show(self)
class Different:
def show(self):
print "Not derived from Simple"
if __name__ == "__main__":
x = Simple2("Simple2 constructor argument")
x.display()
x.show()
x.showMsg("Inside main")
def f(obj): obj.show() # One-line definition
f(x)
f(Different())
#:~
Simple2继承自Simple, 在其构造函数中,父类的构造函数也被调用了。display( ), showMsg( ) 方法可以直接通过self进行调用。当子类和父类有相同的方法时,子类的方法将被重载。在构造函数中,你必须将所有参数全部传入,包括将self作为第一参数。上面还可以看到show方法被重载了。
在__main__代码块中,可以看到基类的构造函数也被调用了,基本的方法showMsg在父类中同样可以使用,
Different类也实现了show方法,但这个类并非Simple类的子类。__main__代码块中定义的f函数演示了弱类型语法。f函数关心的是obj参数是否支持show方法,而不关心obj的类型。因此Simple类和非Simple类都是可接受的。C++实现这样的方法需要使用template语法。Python作为一种弱类型语言,他天生就具备template能力。
Defined tags for this entry: python, Thinking In Python
Last modified on 2010-07-21 10:59










0 Trackbacks