Python3 教程 第3页

Python3 迭代器与生成器

迭代器 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器: >>> list=[1,2,3,4] >>> it = iter(list) # 创建迭代器对象 >>> print (next(it)) # 输出迭代器的下一个元素 1 >>> print (next(it)) 2 >>> 迭代器对象可以使用常规 for 语句进行遍历: #!/usr/bin/python3 list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ") 尝试一下 执行以上程序,输出结果如下: 1 2 3 4 也可以使用 next() 函数: #!/usr/bin/python3 import sys # 引入 sys 模块 list=[1,2,3,4] it = iter(list) # 创建迭代器对象 while True: try: print (next(it)) except StopIteration: sys.exit() 尝试一下 执行以上程序,输出结果如下: 1 2 3 4 生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator)。 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。并在下一次执行 next() 方法时从当前位置继续运行。 以下实例使用 yield 实现斐波那契数列: #!/usr/bin/python3 import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter...

Python3 函数

本章节我们将为大家介绍 Python 中函数的应用。 该章节可参阅 Python 函数应用详解。 Python 定义函数使用 def 关键字,一般格式如下: def 函数名(参数列表): 函数体 让我们使用函数来输出”Hello World!”: >>> def hello() : print("Hello World!") >>> hello() Hello World! >>> 更复杂点的应用,函数中带上参数变量: def area(width, height): return width * height def print_welcome(name): print("Welcome", name) print_welcome("Fred") w = 4 h = 5 print("width =", w, " height =", h, " area =", area(w, h)) 尝试一下 以上实例输出结果: Welcome Fred width = 4 height = 5 area = 20 函数变量作用域 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 通过以下实例,你可以清楚了解 Python 函数变量的作用域: #!/usr/bin/env python3 a = 4 # 全局变量 def print_func1(): a = 17 # 局部变量 print("in print_func a = ", a) def print_func2(): print("in print_func a = ", a) print_func1() print_func2() print("a = ", a) 尝试一下 以上实例运行结果如下: in print_func a = 17 in print_func a = 4...

Python3 数据结构

本章节我们主要结合前面所学的知识点来介绍 Python 数据结构。 列表 Python 中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能修改。 以下是 Python 中列表的方法: 方法 描述 list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。 list.extend(L) 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。 list.insert(i, x) 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。 list.remove(x) 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。 list.pop([i]) 从列表的指定位置删除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被删除。(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。) list.clear() 移除列表中的所有项,等于del a[:]。 list.index(x) 返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。 list.count(x) 返回 x 在列表中出现的次数。 list.sort() 对列表中的元素进行排序。 list.reverse() 倒排列表中的元素。 list.copy() 返回列表的浅复制,等于a[:]。 下面示例演示了列表的大部分方法: >>> a = [66.25, 333, 333, 1, 1234.5] >>> print(a.count(333), a.count(66.25), a.count('x')) 2 1 0 >>> a.insert(2, -1) >>> a.append(333) >>> a [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.25, -1, 333, 1, 1234.5, 333] >>> a.reverse() >>> a [333, 1234.5, 1, 333, -1, 66.25] >>> a.sort() >>> a [-1, 1, 66.25, 333,...

Python3 模块

在前面的几个章节中我们脚本上是用 Python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。 为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。 模块是一个包含所有你定义的函数和变量的文件,其后缀名是 .py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 Python 标准库的方法。下面是一个使用 Python 标准库中模块的例子。  #!/usr/bin/python3 # Filename: using_sys.py import sys print('命令行参数如下:') for i in sys.argv: print(i) print('\n\nPython 路径为:', sys.path, '\n') 执行结果如下所示: $ python using_sys.py 参数1 参数2 命令行参数如下: using_sys.py 参数1 参数2 Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 1、import sys 引入 Python 标准库中的 sys.py 模块;这是引入某一模块的方法。 2、sys.argv 是一个包含命令行参数的列表。 3、sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。 import 语句 如果要使用 Python 源文件,只需在另一个源文件里执行 import 语句,import 语句语法如下: import module1[,module2[, ... moduleN] 当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。 搜索路径是一个解释器会先进行搜索的所有目录的列表。如果想要导入模块 support,需要把命令放在脚本的顶端: #!/usr/bin/python3 # Filename: support.py def print_func( par ): print ("Hello : ", par) return test.py 引入 support 模块: #!/usr/bin/python3 # Filename: test.py # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("w3cschool") 以上实例输出结果: $ python3 test.py Hello : w3cschool 一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。 当我们使用 import 语句的时候,Python 解释器是怎样找到对应的文件的呢?...

Python3 输入和输出

在前面几个章节中,我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python 两种输出值的方式: 表达式语句和 print() 函数。(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以用 sys.stdout 引用。) 如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。 如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。 str() 函数返回一个用户易读的表达形式。 repr() 产生一个解释器易读的表达形式。 例如 >>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hello, world.'" >>> str(1/7) '0.14285714285714285' >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print(s) The value of x is 32.5, and y is 40000... >>> # repr() 函数可以转义字符串中的特殊字符 ... hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # repr() 的参数可以是 Python 的任何对象 ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000,...

Python3 File 方法

file 文件对象使用 open 函数来创建,下表列出了 file 文件对象常用的函数: 序号 方法及描述 1 file.close() 关闭文件。关闭后文件不能再进行读写操作。 2 file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 3 file.fileno() 返回一个整型的文件描述符 (file descriptor FD 整型), 可以用在如 os 模块的 read 方法等一些底层操作上。 4 file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 5 file.next() 返回文件下一行。 6 file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 7 file.readline([size]) 读取整行,包括 “\n” 字符。 8 file.readlines([sizehint]) 读取所有行并返回列表,若给定 sizeint>0,返回总和大约为 sizeint 字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 9 file.seek(offset[, whence]) 设置文件当前位置 10 file.tell() 返回文件当前位置。 11 file.truncate([size]) 截取文件,截取的字节通过 size 指定,默认为当前文件位置。 12 file.write(str) 将字符串写入文件,返回的是写入的字符长度。 13 file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

Python3 OS 文件/目录方法

os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示: 序号 方法及描述 1 os.access(path, mode) 检验权限模式。 2 os.chdir(path) 改变当前工作目录。 3 os.chflags(path, flags) 设置路径的标记为数字标记。 4 os.chmod(path, mode) 更改权限。 5 os.chown(path, uid, gid) 更改文件所有者。 6 os.chroot(path) 改变当前进程的根目录。 7 os.close(fd) 关闭文件描述符 fd。 8 os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略。 9 os.dup(fd) 复制文件描述符 fd。 10 os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2。 11 os.fchdir(fd) 通过文件描述符改变当前工作目录。 12 os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数 fd 指定,参数 mode 是 Unix 下的文件访问权限。 13 os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户 ID 和用户组 ID,该文件由文件描述符 fd 指定。 14 os.fdatasync(fd) 强制将文件写入磁盘,该文件由文件描述符 fd 指定,但是不强制更新文件的状态信息。 15 os.fdopen(fd[, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象。 16 os.fpathconf(fd, name) 返回一个打开的文件的系统配置信息。name 为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 17 os.fstat(fd) 返回文件描述符 fd 的状态,像 stat()。 18 os.fstatvfs(fd) 返回包含文件描述符 fd 的文件的文件系统的信息,像 statvfs()。 19 os.fsync(fd) 强制将文件描述符为 fd 的文件写入硬盘。 20 os.ftruncate(fd, length) 裁剪文件描述符 fd 对应的文件,...

Python3 错误和异常

作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。 Python 有两种错误很容易辨认:语法错误和异常。 语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>> while True print('Hello world') File "<stdin>", line 1, in ? while True print('Hello world') ^ SyntaxError: invalid syntax 这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号(:)。 语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。 异常 即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: Can't convert 'int' object to str implicitly 异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。 错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。 异常处理 以下例子中,让用户输入一个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。 >>> while True: try: x = int(input("Please...

Python3 面向对象

Python 从设计之初就是一门面向对象的语言,正因为如此,在 Python 中创建一个类和对象是很容易的。本章节我们将详细介绍 Python 的面向对象编程。 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习 Python 的面向对象编程。 接下来我们先来简单的了解下面向对象的一些基本特征。 Python3 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。 局部变量:定义在方法中的变量,只作用于当前实例的类。 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个 Dog 类型的对象派生自 Animal 类,这是模拟”是一个(is-a)”关系(例图,Dog 是一个 Animal)。 实例化:创建一个类的实例,类的具体对象。 方法:类中定义的函数。 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。 和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。 Python 中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。 对象可以包含任意数量和类型的数据。 类定义 语法格式如下: class ClassName: <statement-1> . . . <statement-N> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。 类对象 类对象支持两种操作:属性引用和实例化。 属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。 类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样: #!/usr/bin/python3 class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello world' # 实例化类 x = MyClass() # 访问类的属性和方法 print("MyClass 类的属性 i 为:", x.i) print("MyClass 类的方法 f 输出为:", x.f()) 实例化类: # 实例化类 x = MyClass() # 访问类的属性和方法 以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。 执行以上程序输出结果为: MyClass 类的属性 i 为: 12345 MyClass 类的方法 f 输出为: hello world 很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__() 的特殊方法(构造方法),像下面这样: def __init__(self): self.data = [] 类定义了 __init__() 方法的话,类的实例化操作会自动调用 __init__() 方法。所以在下例中,可以这样创建一个新的实例: x = MyClass() 当然, __init__()...

Python3 标准库概览

Python 语言参考手册描述了具体语法和语义,并介绍了与 Python 一起发布的标准库。本文还描述了发行版中通常包含的一些可选组件。 操作系统接口 os 模块提供了不少与操作系统相关联的函数。 >>> import os >>> os.getcwd() # 返回当前的工作目录 'C:\\Python34' >>> os.chdir('/server/accesslogs') # 修改当前的工作目录 >>> os.system('mkdir today') # 执行系统命令 mkdir 0 建议使用 “import os” 风格而非 “from os import *”。这样可以保证随操作系统不同而有所变化的 os.open() 不会覆盖内置函数 open()。 在使用 os 这样的大型模块时内置的 dir() 和 help() 函数非常有用: >>> import os >>> dir(os) <returns a list of all module functions> >>> help(os) <returns an extensive manual page created from the module's docstrings> 针对日常的文件和目录管理任务,:mod:shutil 模块提供了一个易于使用的高级接口: >>> import shutil >>> shutil.copyfile('data.db', 'archive.db') >>> shutil.move('/build/executables', 'installdir') 文件通配符 glob 模块提供了一个函数用于从目录通配符搜索中生成文件列表: >>> import glob >>> glob.glob('*.py') ['primes.py', 'random.py', 'quote.py'] 命令行参数 通用工具脚本经常调用命令行参数。这些命令行参数以链表形式存储于 sys 模块的 argv 变量。例如在命令行中执行 “python demo.py one two three” 后可以得到以下输出结果: >>> import sys >>> print(sys.argv) ['demo.py', 'one', 'two', 'three'] 错误输出重定向和程序终止 sys 还有 stdin,stdout 和 stderr 属性,即使在 stdout 被重定向时,后者也可以用于显示警告和错误信息。...