python学习笔记(一)

来源:互联网 发布:环保 知乎 编辑:程序博客网 时间:2024/06/06 01:00

最近开始学习python,在学之前,准备python的概念,版本,工具等基本知识。

首先,python是什么?来自百度百科的解释:

Python(KK英语发音:/ˈpaɪθən/)是一种面向对象、直译式计算机程序设计语言。也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。 Python语法简捷而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。Python的名字来源于一个喜剧。也许最初设计Python这种语言的人并没有想到Python会在工业和科研上获得如此广泛的使用。

Python的特点:

可升级:

Python 提供了基本的开发模块,你可以在它上面开发你的软件,而且当这些需要扩展和增长时,Python的可插入性和模块化架构则能使你的项目生机盎然和易于管理。

可扩展:

Python 的标准实现是使用 C 语言完成的(也就是 CPython),所以要使用 C 和C++编写 Python 扩展。Python 的 Java 实现被称作 Jython,要使用 Java 编写其扩展。最后,还有 IronPython,这是针对 .NET 或 Mono 平台的 C# 实现。你可以使用 C# 或者 VB.Net 扩展 IronPython。

可移植性:

因为Python 是用C 写的,又由于C 的可移植性,使得Python 可以运行在任何带有ANSI C 编译器的平台上。尽管有一些针对不同平台开发的特有模块,但是在任何一个平台上用Python 开发的通用软件都可以稍事修改或者原封不动的在其他平台上运行。这种可移植性既适用于不同的架构,也适用于不同的操作系统。

易学易读:

Python 关键字少、结构简单、语法清晰。这样就使得学习者可以在相对更短的时间内轻松上手。对初学者而言,可能感觉比较新鲜的东西可能就是Python 的面向对象特点了。那些还未能全部精通OOP(Object Oriented Programming, 面向对象的程序设计)的人对径直使用Python还是有所顾忌的,但是OOP 并非必须或者强制的。

易维护:

Python 本身就是易于学习和阅读的。Python 另外一个激动人心的优势就是,当你在阅读自己六个月之前写的脚本程序的时候,不会把自己搞得一头雾水,也不需要借助参考手册才能读懂自己的软件。

健壮性:

Python 提供了“安全合理”的退出机制,让程序员能掌控局面。一旦你的Python 由于错误崩溃,解释程序就会转出一个“堆栈跟踪”,那里面有可用到的全部信息,包括你程序崩溃的原因以及是那段代码(文件名、行数、行数调用等等)出错了。这些错误被称为异常。如果在运行时发生这样的错误,Python 使你能够监控这些错误并进行处理。这些异常处理可以采取相应的措施,例如解决问题、重定向程序流、执行清除或维护步骤、正常关闭应用程序、亦或干脆忽略掉。无论如何,这都可以有效的缩减开发周期中的调试环节。

Python 的健壮性对软件设计师和用户而言都是大有助益的。一旦某些错误处理不当,Python也

还能提供一些信息,作为某个错误结果而产生的堆栈追踪不仅可以描述错误的类型和位置,还能指出代码所在模块。

解释性和编译性:

Python 是一种解释型语言,这意味着开发过程中没有了编译这个环节。一般来说,由于不是以本地机器码运行,纯粹的解释型语言通常比编译型语言运行的慢。然而,类似于Java,Python实际上是字节编译的,其结果就是可以生成一种近似机器语言的中间形式。这不仅改善了Python的性能,还同时使它保持了解释型语言的优点。

Python与其他语言比较:

Python 已经和很多语言比较过了。一个原因就是Python 提供了很多其他语言拥有的特性。另外一个原因就是Python 本身也是由诸多其他语言发展而来的,这包括ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unixshell 和其他的脚本语言等等。Python 就是”浓缩的精华“:范·罗萨姆研究过很多语言,从中吸收了许多觉得不错的特性,并将它们溶于一炉。

然而,往往因为Python 是一门解释型语言,你会发现大多数的比较是在Perl、Java、Tcl,还有JavaScript 之间进行的。Perl 是另外一种脚本语言,远远超越了标准的shell 脚本。像Python 一样,Perl赋予了你所有编程语言的功能特性,还有系统调用能力。

Perl 最大的优势在于它的字符串模式匹配能力,其提供了一个十分强大的正则表达式匹配

引擎。这使得Perl 实际上成为了一种用于过滤、识别和抽取字符串文本的语言,而且它一直是开发Web 服务器端CGI(common gateway interface,通用网关接口)网络程序的最流行的语言。Python 的正则表达式引擎很大程度上是基于Perl 的。

然而,Perl 语言的晦涩和对符号语法的过度使用,让解读变得很困难。这些语法令初学者不得精要,为他们的学习带来了不小的阻碍。Perl 的这些额外的“特色”使得完成同一个任务会有多个方法,进而引起了开发者之间的分歧和内讧。最后,通常当你想阅读几个月前写的Perl脚本的时候都不得不求助参考书Python 也经常被拿来和Java 作对比,因为他们都有类似的面向对象的特性和语法。Java的语法尽管比C++简单的多,但是依旧有些繁琐,尤其是当你想完成一个小任务的时候。Python的简洁比纯粹的使用Java 提供了更加快速的开发环境。

在Python 和Java 的关系上,一个非常重大的革命就是Jython 的开发。Jython 是一个完全用Java 开发的Python 解释器,现在可以在只有Java 虚拟机的环境中运行Python 程序。

现在,由于Rails 项目的流行,Python 也经常被拿来和Ruby 进行比较。就像前面我们提到的,Python 是多种编程范式的混合,它不像Ruby 那样完全的面向对象,也没有像Smalltalk那样的块,而这正是Ruby 最引人注目的特性。Python 有一个字节码解释器,而Ruby 没有。Python更加易读,而Ruby 事实上可以看作是面向对象的Perl。相对于Rails,Python有几个自己的Web 应用框架,比如Django 和 Turbogears 这两个项目。

Tcl 是另一种可以与Python 相提并论的脚本语言。Tcl 是最易于使用的脚本语言之一, 程序员很容易像访问系统调用一样对Tcl 语言进行扩展。Tcl 直到今天仍然很流行, 与Python相比, 它或许有更多局限性(主要是因为它有限的几种数据类型),不过它也拥有和Python一样的通过扩展超越其原始设计的能力。更重要的是,Tcl 通常总是和它的图形工具包Tk 一起工作, 一起协同开发图形用户界面应用程序。因为它非常流行,所以Tk 已经被移植到Perl(Perl/Tk)和Python(Tkinter)中. 同样有一个有争议的观点,那就是与Tcl 相比, 因为Python 有类, 模块及包的机制,所以写起大程序来更加得心应手。Python 有一点点函数化编程(functional programming ,FP)结构,这使得它有点类似List 或Scheme语言点击打开链接。尽管Python 不是传统的函数化编程语言, 但它持续的从Lisp 和haskell语言中借用一些有价值的特性。举例来说, 列表解析就是一个广受欢迎的来自Haskell 世界的特性, 而Lisp 程序员在遇到 lambda, map, filter 和reduce 时也会感到异常亲切。JavaScript 是另外一种非常类似Python 的面向对象脚本语言。优秀的JavaScript 程序员学起Python 来易如反掌。

Python()的下载及开发环境的搭建:

Python版本下载:https://download-cf.jetbrains.com/python/pycharm-professional-2017.1.4.exe

Pycharm软件下载:http://pan.baidu.com/s/1i5tKQRb

Python开发环境搭建(pycharm):http://blog.csdn.net/agoni_xiao/article/details/78352498

Python2.x与python3.x的对比变化:

1.性能 
Py3.0运行pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可 
以取得很好的优化结果。 
Py3.1性能比Py2.5慢15%,还有很大的提升空间。 
2.编码 
Py3.X源码文件默认使用utf-8编码,这就使得以下代码是合法的: 
    >>> 中国 = 'china' 
    >>>print(中国) 
    china 
3. 语法 
1)去除了<>,全部改用!= 
2)去除``,全部改用repr() 
3)关键词加入as 和with,还有True,False,None 
4)整型除法返回浮点数,要得到整型结果,请使用// 
5)加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量 
6)去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数 
   例如: 
     2.X: print "The answer is", 2*2 
     3.X: print("The answer is", 2*2) 
     2.X: printx,                             # 使用逗号结尾禁止换行 
     3.X: print(x, end="")                    # 使用空格代替换行 
     2.X:print                                # 输出新行 
     3.X:print()                              # 输出新行 
     2.X: print >>sys.stderr, "fatal error" 
     3.X: print("fatal error", file=sys.stderr) 
     2.X: print (x,y)                         # 输出repr((x,y)) 
     3.X: print((x,y))                        # 不同于print(x,y)! 
7)改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随即的 bool值  
8)输入函数改变了,删除了raw_input,用input代替: 
   2.X:guess = int(raw_input('Enter an integer : ')) # 读取键盘输入的方法 
   3.X:guess = int(input('Enter an integer : '))

9)去除元组参数解包。不能def(a, (b, c)):pass这样定义函数了 
10)新式的8进制字变量,相应地修改了oct()函数。 
   2.X的方式如下: 
     >>> 0666 
     438 
     >>> oct(438) 
     '0666' 
   3.X这样: 
     >>> 0666 
     SyntaxError: invalid token (<pyshell#63>, line1) 
     >>> 0o666 
     438 
     >>> oct(438) 
     '0o666' 
11)增加了 2进制字面量和bin()函数 
    >>> bin(438) 
    '0b110110110' 
    >>> _438 = '0b110110110' 
    >>> _438 
    '0b110110110' 
12)扩展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求两点:rest是list 
对象和seq是可迭代的。 
13)新的super(),可以不再给super()传参数, 
    >>> class C(object): 
          def __init__(self, a): 
            print('C', a) 
    >>> class D(C): 
          def __init(self, a): 
            super().__init__(a) # 无参数调用super() 
    >>> D(8) 
    C 8 
    <__main__.D object at 0x00D7ED90> 
14)新的metaclass语法: 
    class Foo(*bases, **kwds): 
      pass 
15)支持classdecorator。用法与函数decorator一样: 
    >>> def foo(cls_a): 
          def print_func(self): 
            print('Hello, world!') 
          cls_a.print = print_func 
          return cls_a 
    >>> @foo 
    class C(object): 
      pass 
    >>> C().print() 
    Hello, world! 
class decorator可以用来玩玩狸猫换太子的大把戏。更多请参阅PEP 3129 
4. 字符串和字节串 
1)现在字符串只有str一种类型,但它跟2.x版本的unicode几乎一样。

2)关于字节串,请参阅“数据类型”的第2条目 
5.数据类型 
1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long 
2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下: 
    >>> b = b'china' 
    >>> type(b) 
    <type 'bytes'> 
str对象和bytes对象可以使用.encode() (str -> bytes)or .decode() (bytes -> str)方法相互转化。 
    >>> s = b.decode() 
    >>> s 
    'china' 
    >>> b1 = s.encode() 
    >>> b1 
    b'china' 
3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 
dict.has_key(),用 in替代它吧 
6.面向对象 
1)引入抽象基类(AbstraactBase Classes,ABCs)。 
2)容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.5多了很多。 
    >>> import collections 
    >>> print('\n'.join(dir(collections))) 
    Callable 
    Container 
    Hashable 
    ItemsView 
    Iterable 
    Iterator 
    KeysView 
    Mapping 
    MappingView 
    MutableMapping 
    MutableSequence 
    MutableSet 
    NamedTuple 
    Sequence 
    Set 
    Sized 
    ValuesView 
    __all__ 
    __builtins__ 
    __doc__ 
    __file__ 
    __name__ 
    _abcoll 
    _itemgetter 
    _sys 
    defaultdict 
    deque 
另外,数值类型也被ABCs化。关于这两点,请参阅 PEP 3119和PEP 3141。 
3)迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法 
4)增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便。 
7.异常 
1)所以异常都从BaseException继承,并删除了StardardError 
2)去除了异常类的序列行为和.message属性 
3)用raise Exception(args)代替 raise Exception, args语法 
4)捕获异常的语法改变,引入了as关键字来标识异常实例,在Py2.5中: 
    >>> try: 
    ...    raise NotImplementedError('Error') 
    ... except NotImplementedError, error:

    ...    print error.message 
    ... 
    Error 
在Py3.0中: 
    >>> try: 
          raiseNotImplementedError('Error') 
        except NotImplementedError as error:#注意这个 as 
          print(str(error)) 
    Error 
5)异常链,因为__context__在3.0a1版本中没有实现 
8.模块变动 
1)移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。 
2)移除了imageop模块 
3)移除了audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter,mimify, popen2,  
rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块 
4)移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取) 
5)移除了new模块 
6)os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下 
7)tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize() 
9.其它 
1)xrange()改名为range(),要想使用range()获得一个list,必须显式调用: 
    >>> list(range(10)) 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
2)bytes对象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但对于后两者可以使用 b.strip(b’  
\n\t\r \f’)和b.split(b’‘)来达到相同目的 
3)zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload 
()函数都被去除了

现在可以使用hasattr()来替换 callable(). hasattr()的语法如:hasattr(string, '__name__')

4)string.letters和相关的.lowercase和.uppercase被去除,请改用string.ascii_letters 等 
5)如果x< y的不能比较,抛出TypeError异常。2.x版本是返回伪随机布尔值的 
6)__getslice__系列成员被废弃。a[i:j]根据上下文转换为a.__getitem__(slice(I, j))或 __setitem__和 
__delitem__调用 
7)file类被废弃,在Py2.5中: 
    >>> file 
    <type 'file'> 
在Py3.X中: 
    >>> file 
    Traceback (most recent call last): 
    File "<pyshell#120>", line 1, in<module> 
       file 
    NameError: name 'file' is not defined