Sunday, 28 September 2008

Python入门详细介绍

作为最爱的语言之一,首先来详细介绍一下我对Python的认识吧~~当然,Python的特性远远不止我在次介绍的这些,这就需要读者自己去研究了。此文章中所有的代码高亮也是有一个Python的程序所完成的,叫做pygmentize。它可以解析多种编程语言并生成相应的HTML、LATEX等等来对代码进行高亮显示。 和Perl、Ruby一样,Python是一种动态类型语言(Dynamically Typed),也是一种脚本语言(Scripting Language),解释型语言(Interpreted)。这种类型语言的特性在于它们语法简洁,无须编译,拥有非常方便但又强大的数据结构操作,很利于创建初始程序原型或者完成某些小型脚本处理。例如,我如果想要用Python对某个文件中的每一行进行同一个操作的话:
#!/usr/bin/env python

f = open("example.file")
lines = f.readlines()
lines = map(lambda x : x.strip() + " str", lines)
print lines
以上就不一一解释了,但是example.file文件内容如下:
first line
second line
third line
输出结果如下:
['first line str', 'second line str', 'third line str']
Python中我喜欢的特性 Python的特性主要来自动态类型和脚本语言,所以很多我喜欢的特性其实也就是动态类型语言的特性:
  1. 简洁干净的语法结构。和许多语言不同,Python的某个程序块的开始和结束并不是由某个符号或者语句所包围,而是采用冒号和缩进来进行区别,例如:
    #!/usr/bin/env python
    
    def println(line):
    print line
    
    f = open("example.file")
    lines = f.readlines()
    for line in lines:
        println(line)
    
    以上的简短程序中,函数体和函数声明、for语句和语句块都是由冒号和缩进进行分隔,看上去非常清楚,增加可读性。然而,这种方式有利也有弊。在使语法干净的同时,它使得程序的书写非常严格,而且在自动生成代码上也会增加不必要的处理。
  2. 多值赋值和返回。这是脚本语言一个非常有用的特性。Python中有一个数据结构叫做tuple,他只可读不可写,然而却为多值赋值和返回提供了可能。例如,我如果要对多个变量同时赋值,我无须在每一行写一个,可以如下:
    var1, var2, var3 = 3, 4, 5
    这样,一方面减少了我的代码量,另一方面,如果我将同一类的变量放在一起赋值,可以增加可读性。多值返回就更有用了,在很多时候,我们需要返回的不只是某一个变量,而是想返回多个变量。例如:很多时候我们想得到数组中最大元素和最大元素的索引,那么用Python就可以如下:
    #!/usr/bin/env python
    
    # assume the list is "l", and all the values are positive
    def max_in_list(l):
        mvalue = -1
        mindex = -1
        for i in range(len(l)):
        value = l[i]
        if value > mvalue:
            mvalue = value
            mindex = i
    
        return (mvalue, mindex)
    
    value, index =  max_in_list(l)
  3. List comprehension。这是我最喜欢的一个特性,在数组/列表处理上非常实用。其作用是对某个已有列表的每个元素进行操作,并返回新的列表。例如,我要对某个列表中的所有大于2的数字加上另一个数,可以如下:
    #!/usr/bin/env python
    
    l = [4, 3, 5, 87, 4, 6, 4, 2]
    new_l = [x + 2 for x in l if x > 2]
    print new_l
  4. 高阶函数。这其实是各种动态语言都拥有的一个特性,而且非常有用。所谓高阶函数,从简单说来就是指函数可以作为另一个函数的参数。注意这是不是说将函数的返回结果作为参数,而是将函数本身作为参数。例如:
    #!/usr/bin/env python
    
    def add_one(n):
        return n + 1
    
    def add_two(n):
        return n + 2
    
    def process_list(func, list):
        for n in list:
            print func(n)
    
    l = [3, 4, 5, 6, 7]
    print "Function = add_one ", "-"*30
    process_list(add_one, l)
    print "Function = add_two ", "-"*30
    process_list(add_two, l)
    
    Python中还有一个特殊的lambda关键字来代表某个匿名函数例如以上的例子我可以改成如下:
    #!/usr/bin/env python
    
    def process_list(func, list):
    for n in list:
        print func(n)
    
    l = [3, 4, 5, 6, 7]
    print "Function = add_one ", "-"*30
    process_list(lambda x : x + 1, l)
    print "Function = add_two ", "-"*30
    process_list(lambda x : x + 2, l)
    

3 comments:

小单 said...

跟jack 学python。。。

darkfeather said...

python is so sexy....

Unknown said...

来听Jack的讲座