Introduction à l'enseignement de base de Python

巴扎黑
Libérer: 2017-06-23 16:32:54
original
2161 Les gens l'ont consulté

Section 9 Fonctions

  • Une fonction est un groupe d'instructions qui complète une fonction spécifique. Ce groupe d'instructions peut être utilisé comme une unité et recevoir un nom.

  • peut être exécuté plusieurs fois à différents endroits du programme via le nom de la fonction (c'est ce qu'on appelle généralement un appel de fonction), mais il n'est pas nécessaire de répéter ces instructions partout.

Fonction personnalisée

  • Écrite par l'utilisateur

Fonction Python prédéfinie

  • Certaines fonctions sont fournies avec le système, ainsi que certaines fonctions écrites par des tiers, telles que certaines fonctions écrites par d'autres programmeurs. Les utilisateurs peuvent utiliser directement ces fonctions prêtes à l'emploi.

Pourquoi utiliser des fonctions

  • Réduire la difficulté de programmation

    • Généralement un complexe Décomposez un gros problème en une série de petits problèmes plus simples, puis continuez à diviser les petits problèmes en problèmes plus petits. Lorsque le problème sera suffisamment raffiné pour être simple, nous serons capables de diviser pour mieux régner. À ce stade, nous pouvons utiliser des fonctions pour résoudre des problèmes spécifiques. Une fois que chaque petit problème est résolu, le gros problème sera résolu.

  • Réutilisation du code

    • Les fonctions que nous définissons peuvent être utilisées à plusieurs endroits dans un programme ou dans plusieurs programmes. De plus, nous pouvons également placer des fonctions dans un module pour les utiliser par d'autres programmeurs, et nous pouvons également utiliser des fonctions définies par d'autres programmes. Cela évite la duplication du travail et améliore l’efficacité du travail.

Définition et appel de fonctions

  • Lorsque nous définissons nous-mêmes une fonction, nous utilisons généralement l'instruction def, dont la syntaxe est la suivante :

    def 函数名 (参数列表): #可以没有参数函数体
    
    def add(a, b):
        print a + b
    Copier après la connexion
  • La forme générale d'appel d'une fonction est :

    函数名(参数列表)
    
    add(1, 2)
    Copier après la connexion

Paramètres formels et paramètres réels

  • Lors de la définition d'une fonction, le nom de la variable entre parenthèses après la fonction est appelé "paramètre formel", ou simplement "paramètre formel"

  • Lors de l'appel de la fonction, après le nom de la fonction Les noms de variables entre parenthèses sont appelés "paramètres réels", ou simplement "paramètres réels"

Paramètres par défaut (paramètres par défaut)

  • Les paramètres par défaut ne peuvent être donnés que de droite à gauche. Si le premier paramètre doit recevoir une valeur par défaut et que d'autres paramètres ne sont pas donnés, déplacez le premier paramètre vers le dernier.

    def add(a, b = 2):
        print a + b
    
    add(3)                  #result : 5
    Copier après la connexion

Variables locales et globales

  • Toute variable en Python a sa portée spécifique.

  • Les variables définies dans une fonction ne peuvent généralement être utilisées que dans la fonction. Ces variables qui ne peuvent être utilisées que dans des parties spécifiques du programme sont appelées variables locales.

  • Les variables définies en haut d'un fichier peuvent être appelées par n'importe quelle fonction du fichier. Ces variables qui peuvent être utilisées par l'ensemble du programme sont appelées variables globales.

    x = 100         #全局变量,可以在文件任何地方调用
    
    def func():
        x = 200     #局部变量,只能在函数内部调用
        print x
    
    func()          #输出200
    print x         #输出100
    Copier après la connexion

déclaration globale

  • déclaration forcée en tant que variable globale

    x = 100
    
    def func():
        global x    #强制声明x为全局变量,导致值被覆盖
        x = 200
    
    func()
    print x         #输出200
    Copier après la connexion

function Valeur de retour

  • Une fois la fonction appelée, elle renverra une valeur spécifiée

  • Une fois la fonction appelée, elle renvoie Aucun par défaut

  • retour de la valeur de retour

  • La valeur de retour peut être de n'importe quel type

  • retour après exécution , la fonction se termine

  • Distinguer la valeur de retour et l'impression

    def add(a, b):
        return a + b
    
    ret = add(1, 2)     #将函数返回结果赋值给变量ret
    print ret           #输出3
    Copier après la connexion

Passer les tuples et les dictionnaires à la fonction

  • func (*args)

    def func(x, y):
        print x, y
    
    t = (1, 2)
    func(*t)
    Copier après la connexion
  • func (**kw)

    def func(name='jack', age=30):
        print name,age
    
    d = {'age': 22, 'name' : 'mike'};
    func(**d)
    Copier après la connexion

Gestion des arguments redondants

  • def func(*args, **kw)

    def func(x, *args, **kw):
        print x
        print args
        print kw
    
    func(1, 2, 3, 4, 5, y=10, z=20)
    
    #输出
    1
    (2, 3, 4, 5)
    {'y': 10, 'z': 20}
    Copier après la connexion

expression lambda

  • Fonction anonyme

    • La fonction lambda est une fonction minimale qui définit rapidement une seule ligne, empruntée à Lisp, et peut être utilisée partout où une fonction est nécessaire.

      lambda x,y:x*y
      Copier après la connexion
    • Lors de l'utilisation de Python pour écrire certains scripts d'exécution, l'utilisation de lambda peut enregistrer le processus de définition des fonctions et rationaliser le code.

    • Pour certaines fonctions abstraites qui ne seront pas réutilisées ailleurs, il est parfois difficile de nommer la fonction. Lorsque vous utilisez lambda, vous n'avez pas besoin de considérer les problèmes de nommage.

    • L'utilisation de lambdas rend parfois le code plus facile à comprendre.

les bases de lambda

  • Dans l'instruction lambda, il y a des paramètres avant les deux points, il peut y en avoir plusieurs, séparés par des virgules, sur le côté droit de la valeur de retour du côlon. L'instruction lambda construit en fait un objet fonction

    g = lambda x:x**2
    print g
    <function <lambda> at 0x0000000002643A58>
    Copier après la connexion

instance d'application lambda

  • reduce consiste à faire fonctionner chaque élément de la liste successivement, en recevant Les paramètres sont 2 et le résultat final est renvoyé.

    sum = reduce(lambda x,y:x*y, range(1,6))
    print sum
    Copier après la connexion

instruction switch

  • L'instruction switch est utilisée pour écrire des programmes avec des structures multi-branches, similaires à if...elif ... sinon déclaration.

  • switch语句表达的分支结构比if...elif...else语句表达的更清晰,代码的可读性更高。

  • 但是python并没有提供switch语句

switch实现

  • python可以通过字典实现switch语句的功能。

  • 实现方法分为两步

    • 首先,定义一个字典

    • 其次,调用字典的get()获取相应的表达式

函数调用

  • 通过字典调用函数

    def add(a, b):
        return a + b
    
    def sub(a, b):
        return a - b
    
    def mul(a, b):
        return a * b
    
    def div(a, b):
        return a / b
    
    operator = {'+': add, '-': sub, '*': mul, '/': div}     #通过字典实现switch语句的功能
    
    def calc(a, o, b):
        return operator.get(o)(a, b)
    
    print calc(4, '+', 2)
    print calc(4, '-', 2)
    print calc(4, '*', 2)
    print calc(4, '/', 2)
    Copier après la connexion

第十节 内置函数

help函数可以用来查看函数的用法

help(range)

#输出结果
Help on built-in function range in module __builtin__:

range(...)
    range(stop) -> list of integers
    range(start, stop[, step]) -> list of integers

    Return a list containing an arithmetic progression of integers.
    range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
    When step is given, it specifies the increment (or decrement).
    For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
    These are exactly the valid indices for a list of 4 elements.
Copier après la connexion

常用函数

  • abs(number): 绝对值

  • max(iterable[, key=func]): 最大值

  • min(iterable[, key=func]): 最小值

  • len(collection): 取得一个序列或集合的长度

  • divmod(x, y): 求两个数的商和模,返回一个元组(x//y, x%y)

  • pow(x, y[, z]): 求一个数的幂运算

  • round(number[, ndigits]): 对一个数进行指定精度的四舍五入

  • callable(object): 判断一个对象是否可调用

  • isinstance(object, class-or-type-or-tuple):判断对象是否为某个类的实例

  • cmp(x, y): 比较两个数或字符串大小

  • range(start [,stop, step]): 返回一个范围数组,如range(3), 返回[0,1,2]

  • xrange(start [,stop, step]): 作用与range相同,但是返回一个xrange生成器,当生成范围较大的数组时,用它性能较高

类型转换函数

  • type()

    type(object) -> the object's type
    type(name, bases, dict) -> a new type
    Copier après la connexion
  • int()

    int(x=0) -> int or long
    int(x, base=10) -> int or long
    Copier après la connexion
  • long()

    long(x=0) -> long
    long(x, base=10) -> long
    Copier après la connexion
  • float()

    float(x) -> floating point number
    Copier après la connexion
  • complex()

    complex(real[, imag]) -> complex number
    Copier après la connexion
  • str()

    str(object='') -> string
    Copier après la connexion
  • list()

    list() -> new empty list
    list(iterable) -> new list initialized from iterable's items
    Copier après la connexion
  • tuple()

    tuple() -> empty tuple
    tuple(iterable) -> tuple initialized from iterable's items
    Copier après la connexion
  • hex()

    hex(number) -> string
    Copier après la connexion
  • oct()

    oct(number) -> string
    Copier après la connexion
  • chr()

    chr(i) -> character
    Copier après la connexion
  • ord()

    ord(c) -> integer
    Copier après la connexion

string函数

  • str.capitalize()

    >>> s = "hello"
    >>> s.capitalize()
    'Hello'
    Copier après la connexion
  • str.replace()

    >>> s = "hello"
    >>> s.replace('h', 'H')
    'Hello'
    Copier après la connexion
  • str.split()

    >>> ip = "192.168.1.123"
    >>> ip.split('.')
    ['192', '168', '1', '123']
    Copier après la connexion

序列处理函数

  • len()

    >>>l = range(10)
    >>> len(l)
    10
    Copier après la connexion
  • max()

    >>>l = range(10)
    >>> max(l)
    9
    Copier après la connexion
  • min()

    >>>l = range(10)
    >>> min(l)
    0
    Copier après la connexion
  • filter()

    >>>l = range(10)
    >>> filter(lambda x: x>5, l)
    [6, 7, 8, 9]
    Copier après la connexion
  • zip()

    >>> name=['bob','jack','mike']
    >>> age=[20,21,22]
    >>> tel=[131,132]
    >>> zip(name, age)
    [('bob', 20), ('jack', 21), ('mike', 22)]
    >>> zip(name,age,tel)
    [('bob', 20, 131), ('jack', 21, 132)]       #如果个数不匹配会被忽略
    Copier après la connexion
  • map()

    >>> map(None, name, age)
    [('bob', 20), ('jack', 21), ('mike', 22)]
    >>> map(None, name, age, tel)
    [('bob', 20, 131), ('jack', 21, 132), ('mike', 22, None)]       #个数不匹配时,没有值的会被None代替
    
    >>> a = [1,3,5]
    >>> b = [2,4,6]
    >>> map(lambda x,y:x*y, a, b)
    [2, 12, 30]
    Copier après la connexion
  • reduce()

    >>> reduce(lambda x,y:x+y, range(1,101))
    5050
    Copier après la connexion

lambda -> 列表表达式

  • map的例子,可以写成

    print map(lambda x:x*2+10, range(1,11))
    print [x*2+10 for x in range(1,11)]
    Copier après la connexion
  • 非常的简洁,易懂。filter的例子可以写成:

    print filter(lambda x:x%3==0, range(1,11))
    print [x for x in range(1,11) if x%3 == 0]
    Copier après la connexion


第十一节 模块

简介

  • 模块是python组织代码的基本方式

  • python的脚本都是用扩展名为py的文本文件保存的,一个脚本可以单独运行,也可以导入另一个脚本中运行。当脚本被导入运行时,我们将其称为模块(module)

  • python的模块可以按目录组织为包

  • 创建一个包的步骤是:

    • 建立一个名字为包名字的文件夹

    • 在该文件夹下创建一个__init__.py文件

    • 根据需要在该文件夹下存放脚本文件、已编译扩展及子包

    • import pack.m1, pack.m2, pack.m3

模块

  • 模块名与脚本的文件名相同

    • 例如我们编写了一个名为items.py的脚本,则可在另外一个脚本中用import items语句来导入它

总结

  • 模块是一个可以导入的python脚本文件

  • 包是一堆目录组织的模块和子包,目录下的__init__.py文件存放了包的信息

  • 可以用import, import as, from import等语句导入模块和包

    #假设有一个模块名为calc.py
    import calc
    import calc as calculate
    from calc import add
    Copier après la connexion


第十二节 正则表达式

目标

  • 掌握正则表达式的规则

案例

  • 一个小爬虫

简介

  • 正则表达式(或re)是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实现

    • 可以为想要匹配的相应字符串集指定规则

    • 该字符集可能包含英文语句、e-mail地址、命令或任何你想搞定的东西

    • 可以问诸如“这个字符串匹配该模式吗”

    • “在这个字符串中是否有部分匹配该模式呢?”

    • 你也可以使用re以各种试来修改或分割字符串

  • 正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行

  • 正则表达式语言相对小型和受限(功能有限)

    • 并非所有字符串处理都能用正则表达式完成

字符匹配

  • 普通字符

    • 大多数字母和数字一般都会和自身匹配

    • 如正则表达式test会和字符串"test"完全匹配

  • 元字符

    .   ^   $   *   +   ?   {}  []  \   |   ()
    Copier après la connexion
    • 其中mn是十进制整数。该限定符的意思是至少有m个重复,至多到n个重复

    • 忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实现上是20亿)

    • {0,}等同于*{1,}等同于+,而{0,1}则与?相同。如果可以的话,最好使用*+?

    • 匹配一次或零次,你可以认为它用于标识某事物是可选的

    • 表示匹配一次或更多次

    • 注意和+之间的不同:匹配零或更多次,所以可以根本不出现,而+则要求至少出现一次

    • 指定前一个字符可能被匹配零次或更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定范围,20亿)

    • 正则表达式第一功能是能够匹配不定长的字符集,另一个功能就是可以指定正则表达式的一部分的重复次数。

    • 反斜杠后面可以加不同的字符以表示不同特殊意义

    • 也可以用于取消所有的元字符:\[\\

      \d  匹配任何十进制数,它相当于[0-9]
      \D  匹配任何非数字字符,它相当于[^0-9]
      \s  匹配任何空白字符,它相当于[\t\n\r\f\v]
      \S  匹配任何非空白字符,它相当于[^\t\n\r\f\v]
      \w  匹配任何字母数字字符,它相当于[a-zA-Z0-9]
      \W  匹配任何非字母数字字符,它相当于[^a-zA-Z0-9]
      Copier après la connexion
    • 匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。

    • 匹配行首。除非设置MULTILINE标志,它只是匹配字符串的开始。在MULTILINE模式里,它也可以匹配字符串中的每个换行。

    • 常用来指定一个字符集:[abc]  [a-z]

    • 元字符在字符集中不起作用:[akm$]

    • 补集匹配不在区间范围内的字符:[^5]

      import re
      
      regExp = r't[0-9]p'
      print re.findall(regExp, 't1p t2p')
      Copier après la connexion
    • []

    • ^

    • $

    • \

    • 重复

    • *

    • +

    • ?

    • {m,n}

    使用正则表达式

    • re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用它们来进行匹配

    • 编译正则表达式

      >>> import re
      >>> p = re.compile('ab*')
      >>> print p
      <_sre.SRE_Pattern object at 0x00000000004D1CA8>
      Copier après la connexion
    • re.compile()也可以接受可选择的标志参数,常用来实现不同的特殊功能和语法变更

      p = re.compile('ab*', re.IGNORECASE)
      Copier après la connexion

    反斜杠的麻烦

    • 字符串前加"r"反斜杠就不会被任何特殊方式处理

      字符            阶段
      \section        要匹配的字符串
      \\section       为re.compile取消反斜杠的特殊意义
      "\\\\section"   为"\\section"的字符串实值(string literals)取消反斜杠的特殊意义
      Copier après la connexion

    执行匹配

    • 'RegexObject'实例有一些方法和属性,完整的列表可查阅Python Library Reference

      方法/属性       作用
      match()        决定RE是否在字符串刚开始的位置匹配
      search()       扫描字符串,找到这个RE匹配的位置
      findall()      找到RE匹配的所有子串,并把它们作为一个列表返回
      finditer()     找到RE匹配的所有子串,并把它们作为一个迭代器返回
      
      如果没有匹配到的话,match()和search()将返回None。
      如果成功的话,就会返回一个'MatchObject'实例。
      Copier après la connexion
    • MatchObject实例方法

      方法/属性       作用
      group()        返回被RE匹配的字符串
      start()        返回匹配开始的位置
      end()          返回匹配结束的位置
      span()         返回一个元组包含匹配(开始,结束)的位置
      Copier après la connexion
      • 实际程序中,最常见的作法是将'MatchObject'保存在一个变量里,然后检查它是否为None

        p = re.compile('ab*', re.I)
        m = p.match('aaaabcccccabcc')
        
        if m:
            print 'Match found : ', m.group()
        else:
            print 'No match'
        Copier après la connexion

    模块级函数

    • re模块也提供了顶级函数调用如match()、search()、sub()、subn()、split()、findall()

    • 查看模块的所有属性和方法: dir(re)

    编译标志-flags

    标志                含义
    DOTALL, S           使.匹配包括换行在内的所有字符
    IGNORECASE, I       使匹配对大小写不敏感
    LOCALE, L           做本地化识别(local-aware)匹配.法语等
    MULTILINE, M        多行匹配,影响^和$
    VERBOSE, X          能够使用REs的verbose状态,使之被组织得更清晰易懂
    
    charref = re.compile(r"""
    (
    [0-9]+[^0-9]    #Decimal form
    | 0[0-7]+[^0-7] #Octal form
    | x[0-9a-fA-F]+[^0-9a-fA-F] #Hexadecimal form
    )
    """, re.VERBOSE)
    Copier après la connexion

    分组()

    email = r"\w+@\w+(\.com|\.cn)"
    Copier après la connexion

    一个小爬虫

    • 下载贴吧或空间中所有图片

      import re
      import urllib
      
      def getHtml(url):
          page = urllib.urlopen(url)
          html = page.read()
          return html
      
      def getImg(html):
          reg = r'src="(.*?\.jpg)" width'
          imgre = re.compile(reg)
          imglist = re.findall(imgre, html)
          x = 0
          for imgurl in imglist:
              urllib.urlretrieve(imgurl, '%s.jpg' % x)
              x++
      
      getImg(getHtml(url))
      Copier après la connexion


    第十三章 python对内存的使用

    浅拷贝和深拷贝

    • 所谓浅拷贝就是对引用的拷贝(只拷贝父对象)

    • 所谓深拷贝就是对对象的资源的拷贝

    • 解释一个例子:

      import copy
      a = [1,2,3,['a','b','c']]
      b = a
      c = copy.copy(a)
      d = copy.deepcopy(a)
      Copier après la connexion


    第十四章 文件与目录

    目标

    • 文件的打开和创建

    • 文件读取

    • 文件写入

    • 内容查找和替换

    • 文件删除、复制、重命名

    • 目录操作

    案例

    • 目录分析器

    • 杀毒软件

    • 系统垃圾清理工具

    python文件读写

    • python进行文件读写的函数是openfile

    • file_handle = open(filename, mode)

    模式 说明
    r 只读
    r+ 读写
    w 写入,先删除原文件,在重新写入,如果文件没有则创建
    w+ 读写,先删除原文件,在重新写入,如果文件没有则创建(可以写入输出)
    a 写入,在文件末尾追加新的内容,文件不存在,创建之
    a+ 读写,在文件末尾追加新的内容,文件不存在,创建之
    b 打开二进制文件。可以与r、w、a、+结合使用
    U 支持所有的换行符号。"\r"、"\n"、"\r\n"

    文件对象方法

    • close

      • 关闭文件,关闭前,会将缓存中的数据先写入文件。

      • FileObject.close()

      • 格式

      • 说明

      • readline

        • 每次读取文件的一行

        • size:是指每行每次读取size个字节,直到行的末尾

        • String = FileObject.readline([size])

        • 格式

        • 说明

        • readlines

          • 多行读,返回一个列表

          • size: 每次读入size个字符,然后继续按size读,而不是每次读入行的size个字符

          • List = FileObject.readlines([size])

          • 格式

          • 说明

          • read

            • 读出文件的所有内容,并复制给一个字符串

            • size: 读出文件的前[size]个字符,并输出给字符串,此时文件的指针指向size处

            • String = FileObject.read([size])

            • 格式

            • 说明

            • next

              • 返回当前行,并将文件指针到下一行

              • FileObject.next()

              • 格式

              • 说明

              • write

                • write和后面的writelines在写入前会是否清除文件中原来所有的数据,在重新写入新的内容,取决于打开文件的模式

                • FileObject.write(string)

                • 格式

                • 说明

                • writelines

                  • 多行写

                  • 效率比write高,速度更快,少量写入可以使用write

                  • FileObject.writelines(List)

                  • 格式

                  • 说明

                  • seek

                    • 选项=0时,表示将文件指针指向从文件头部到“偏移量”字节处。

                    • 选项=1时,表示将文件指针指向从文件的当前位置,向向移动“偏移量”字节。

                    • 选项=2时,表示将文件指针指向从文件的尾部,向前移动“偏移量”字节。

                    • FileObject.seek(偏移量,选项)

                    • 格式

                    • 说明

                    • flush

                      • 提交更新

                      • FileObject.flush()

                      • 格式

                      • 说明

                      文件查找和替换

                      • 文件查找

                      • cat a.txt

                        hello world
                        hello hello world
                        Copier après la connexion
                      • 统计文件中hello的个数

                        import re
                        
                        fp = file("a.txt", "r")
                        count = 0
                        for s in fp.readlines():
                            li = re.findall("hello", s)
                            if len(li) > 0:
                                count = count + len(li)
                        
                        print "Search ",count," hello"
                        fp.close()
                        Copier après la connexion
                      • 文件内容替换

                      • 问题:把a.txt中的hello替换为good, 并保存结果到b.txt中

                      • 示例代码一:

                        fp1 = file("a.txt", "r")
                        fp2 = file("b.txt", "w")
                        
                        for s in fp1.readlines():
                            fp2.write(s.replace("hello", "good"))
                        
                        fp1.close()
                        fp2.close()
                        Copier après la connexion
                      • 示例代码二:

                        fp1 = file("a.txt", "r")
                        fp2 = file("b.txt", "w")
                        
                        s = fp1.read()
                        fp2.write(s.replace("hello", "good"))
                        
                        fp1.close()
                        fp2.close()
                        Copier après la connexion

                      目录操作

                      • 目录操作就是通过python来实现目录的创建,修改,遍历等功能

                      • import os

                        • 目录操作需要调用os模块

                        • 比如os.mkdir('/root/demo')

                      • 常用函数

                      函数 说明
                      mkdir(path[,mode=0777]) 创建单个目录
                      makedirs(name,mode=511) 创建多层级目录
                      rmdir(path) 删除单个目录
                      removedirs(path) 删除多层级目录
                      listdir(path) 列出目录
                      getcwd() 取得当前目录
                      chdir(path) 切换目录
                      walk(top, topdown=True, onerror=None)
                      • 案例

                        • 系统垃圾清除小工具

                      • 方式

                        • 函数声明:os.walk(path)

                        • 该函数返回一个元组,该元组有3个元素,这3个元素分别表示每次遍历的路径名,目录列表和文件列表。

                          for path, dirlist, filelist in os.walk('.'):
                              for filename in filelist:
                                  print os.path.join(path, filename)
                          Copier après la connexion
                        • 递归函数

                        • os.walk()函数

                      第十五章 异常处理

                      异常以及异常抛出

                      • 异常抛出机制,为程序开发人员提供了一种在运行时发现错误,进行恢复处理,然后继续执行的能力。下面是一个异常处理实例:

                        try:
                            f = open('unfile.py', 'r')
                        except IOError, e:
                            print False,str(e)
                        
                        False [Errno 2] No such file or directory: 'unfile.py'
                        Copier après la connexion

                      抛出机制

                      • 如果在运行时发生异常的话,解释器会查找相应的处理语句(称为handler)。

                      • 要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。

                      • 如果在最外层(全局“main”)还是没有找到的话,解释器就会退出,同时打印出traceback以便让用户找出错误产生的原因。

                      • 注意:虽然大多数错误会导致异常,但一个异常不一定代表错误。有时候它们只是一个警告,有时候它们可能是一个终止信号,比如退出循环等。

                      finally子句

                      • python提供try-finally子句来表述这样的情况:我们不关心捕捉到是什么错误,无论错误是不是发生,这些代码“必须”运行,比如文件关闭,释放锁,把数据库连接还给连接池等。比如:

                        try:
                            f = open('unfile.py', 'r')
                        except Exception, e:
                            print False,str(e)
                        finally:
                            print "exec finally"
                        Copier après la connexion

                      raise抛出异常

                      • 到目前为止,我们只讨论了如何捕捉异常,那么如何抛出异常?

                      • 使用raise来抛出一个异常:

                        if 'a' > 5:
                            raise TypeError("Error: 'a' must be integer.")
                        Copier après la connexion

                      常见的python异常

                      异常 描述
                      AssertionError assert语句失败
                      AttributeError 试图访问一个对象没有的属性
                      IOError 输入输出异常,基本是无法打开文件
                      ImportError 无法引入模块或者包,基本是路径问题
                      IndentationError 语法错误,代码没有正确的对齐
                      IndexError 下标索引超出序列边界
                      KeyError 试图访问你字典里不存在的键
                      KeyBoardInterrupt Ctrl+C被按下
                      NameError 使用一个还未赋予对象的变量
                      SyntaxError python代码逻辑语法出错,不能执行
                      TypeError 传入的对象类型与要求不符
                      UnboundLocalError 试图访问一个还未设置的全局变量,基本上是由于另有一个同名的全局变量,导致你以为在访问
                      ValueError 传入一个不被期望的值,即使类型正确

                      Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

                      Étiquettes associées:
                      source:php.cn
                      Déclaration de ce site Web
                      Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
                      Tutoriels populaires
                      Plus>
                      Derniers téléchargements
                      Plus>
                      effets Web
                      Code source du site Web
                      Matériel du site Web
                      Modèle frontal