Python3基础教程

#一.标识符
#1.1 第一个字符必须是字母表中字母或下划线 _ 。
#1.2 标识符的其他的部分由字母、数字和下划线组成。
#1.3 标识符对大小写敏感。

#二.保留字
#2.1 保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:
import keyword
print (keyword.kwlist)

#三.注释
#3.1 Python中单行注释以 # 开头
#3.2 多行注释可以用多个 # 号,还有 ‘’’ 和 “”"

第一个注释

第二个注释

‘’’
第三注释
第四注释
‘’’

“”"
第五注释
第六注释
“”"
print (“Hello, Python!”)

#四.行与缩进
#4.1 python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
#4.2 缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。

if True:
print (“True”)
else:
print (“False”)

#五.多行语句
#5.1 Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠()来实现多行语句。
total = ‘item_one’ +
‘item_two’ +
‘item_three’
print (total)

#5.2 在 [], {}, 或 () 中的多行语句,不需要使用反斜杠().
total = [‘item_one’, ‘item_two’, ‘item_three’,
‘item_four’, ‘item_five’]
print (total)

#六.数字(Number)类型
#6.1 python中数字有四种类型:整数、布尔型、浮点数和复数。

int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。

bool (布尔), 如 True。

float (浮点数), 如 1.23、3E-2

complex (复数), 如 1 + 2j、 1.1 + 2.2j

#七.字符串(String)
#7.1 python中单引号和双引号使用完全相同。
#7.2 使用三引号(’’'或""")可以指定一个多行字符串。
#7.3 转义符 ‘’
#7.4 反斜杠可以用来转义,使用r可以让反斜杠不发生转义。。 如 r"this is a line with \n" 则\n会显示,并不是换行。print (r"this is a line with \n" )
#7.5 按字面意义级联字符串,如"this " “is " “string"会被自动转换为this is string。
#7.6 字符串可以用 + 运算符连接在一起,用 * 运算符重复。
#7.7 Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
#7.8 Python中的字符串不能改变。
#7.9 Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
#7.10 字符串的截取的语法格式如下:变量[头下标:尾下标:步长]
word = ‘字符串’
sentence = “这是一个句子。”
paragraph = “”“这是一个段落,
可以由多行组成”””

str = ‘Runoob’

print(str) # 输出字符串
print(str[0:-1]) # 输出第一个到倒数第二个的所有字符
print(str[0]) # 输出字符串第一个字符
print(str[2:5]) # 输出从第三个开始到第五个的字符
print(str[2:]) # 输出从第三个开始的后的所有字符
print(str * 2) # 输出字符串两次
print(str + ‘你好’) # 连接字符串

print(’------------------------------’)

print(‘hello\nrunoob’) # 使用反斜杠()+n转义特殊字符
print(r’hello\nrunoob’) # 在字符串前面添加一个 r,表示原始字符串,不会发生转义

八.空行

#8.1 函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

#九.等待用户输入
#9.1 执行下面的程序在按回车键后就会等待用户输入
#input("\n\n按下 enter 键后退出。")

#十.同一行显示多条语句
#10.1 Python可以在同一行中使用多条语句,语句之间使用分号(;)分割,以下是一个简单的实例
import sys; x = ‘runoob’; sys.stdout.write(x + ‘\n’)

#十一.多个语句构成代码组
#缩进相同的一组语句构成一个代码块,我们称之代码组。
#像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。我们将首行及后面的代码组称为一个子句(clause)。
#if expression :

suite

#elif expression :

suite

#else :

suite

#十二.Print 输出
#print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end="":
x = “a”
y = “b”

换行输出

print(x)
print(y)

print(’---------’)

不换行输出

#print( x, end=" " )
#print( y, end=" " )

#十三.import 与 from…import
#13.1 在 python 用 import 或者 from…import 来导入相应的模块。
#13.2 将整个模块(somemodule)导入,格式为: import somemodule
#13.3 从某个模块中导入某个函数,格式为: from somemodule import somefunction
#13.4 从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
#13.5 将某个模块中的全部函数导入,格式为: from somemodule import *

import sys
print(‘Python import mode==========’);
print (‘命令行参数为:’)
for i in sys.argv:
print (i)
print (’\n python 路径为’,sys.path)

from sys import argv,path # 导入特定的成员
print(‘python from import===================’)
print(‘path:’,path) # 因为已经导入path成员,所以此处引用时不需要加sys.path

#十四.Python3 基本数据类型
#14.1 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
#14.2 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
#14.3 等号(=)用来给变量赋值。
#14.4 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:

counter = 100 # 整型变量
miles = 1000.0 # 浮点型变量
name = “runoob” # 字符串

print (counter)
print (miles)
print (name)

#14.5 多个变量赋值
#创建一个整型对象,值为1,从后向前赋值,三个变量被赋予相同的数值
a = b = c = 1

#14.6 也可以为多个对象指定多个变量
#两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 “runoob” 分配给变量 c
a, b, c = 1, 2, “runoob”

#14.7 标准数据类型

Python3 中有六个标准的数据类型:Number(数字)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字典)

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);

可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

#14.8 Number(数字)
#Python3 支持 int、float、bool、complex(复数)。
#在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
#像大多数语言一样,数值类型的赋值和计算都是很直观的。
#内置的 type() 函数可以用来查询变量所指的对象类型。
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type©, type(d))
print (isinstance(a, int))

isinstance 和 type 的区别在于:

type()不会认为子类是一种父类类型。

isinstance()会认为子类是一种父类类型。

>>> class A:

… pass

>>> class B(A):

… pass

>>> isinstance(A(), A)

True

>>> type(A()) == A

True

>>> isinstance(B(), A)

True

>>> type(B()) == A

False

>>>5 + 4 # 加法

9

>>> 4.3 - 2 # 减法

2.3

>>> 3 * 7 # 乘法

21

>>> 2 / 4 # 除法,得到一个浮点数

0.5

>>> 2 // 4 # 除法,得到一个整数

0

>>> 17 % 3 # 取余

2

>>> 2 ** 5 # 乘方

32

14.9 String(字符串)

Python中的字符串用单引号 ’ 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。

变量[头下标:尾下标]

str = ‘Runoob’

print (str) # 输出字符串
print (str[0:-1]) # 输出第一个到倒数第二个的所有字符
print (str[0]) # 输出字符串第一个字符
print (str[2:5]) # 输出从第三个开始到第五个的字符
print (str[2:]) # 输出从第三个开始的后的所有字符
print (str * 2) # 输出字符串两次
print (str + “TEST”) # 连接字符串

Python 使用反斜杠()转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串:

print(‘Ru\noob’)

Ru

oob

print(r’Ru\noob’)

Ru\noob

1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。

2、字符串可以用+运算符连接在一起,用*运算符重复。

3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。

4、Python中的字符串不能改变。

14.10 List(列表)

List(列表) 是 Python 中使用最频繁的数据类型。

列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。

列表是写在方括号 [] 之间、用逗号分隔开的元素列表。

和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。

列表截取的语法格式如下:变量[头下标:尾下标]

list = [‘abcd’, 786, 2.23, ‘runoob’, 70.2]
tinylist = [123, ‘runoob’]

print (list) # 输出完整列表
print (list[0]) # 输出列表第一个元素
print (list[1:3]) # 从第二个开始输出到第三个元素
print (list[2:]) # 输出从第三个元素开始的所有元素
print (tinylist * 2) # 输出两次列表
print (list + tinylist) # 连接列表

def reverseWords(input):
# 通过空格将字符串分隔符,把各个单词分隔为列表
inputWords = input.split(" ")

# 翻转字符串
# 假设列表 list = [1,2,3,4],
# list[0]=1, list[1]=2 ,而 -1 表示最后一个元素 list[-1]=4 ( 与 list[3]=4 一样)
# inputWords[-1::-1] 有三个参数
# 第一个参数 -1 表示最后一个元素
# 第二个参数为空,表示移动到列表末尾
# 第三个参数为步长,-1 表示逆向
inputWords = inputWords[-1::-1]

# 重新组合字符串
output = ' '.join(inputWords)

return output

if name == “main”:
input = ‘I like runoob’
rw = reverseWords(input)
print(rw)

#14.11 Tuple(元组)

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。

tuple = (‘abcd’, 786, 2.23, ‘runoob’, 70.2)
tinytuple = (123, ‘runoob’)

print (tuple) # 输出完整元组
print (tuple[0]) # 输出元组的第一个元素
print (tuple[1:3]) # 输出从第二个元素开始到第三个元素
print (tuple[2:]) # 输出从第三个元素开始的所有元素
print (tinytuple * 2) # 输出两次元组
print (tuple + tinytuple) # 连接元组

string、list(列表) 和 tuple 都属于 sequence(序列)

数组和列表到区别:

1.数组中存放的数据类型必须一致,可以存放基本类型数据;list中可以存放不同类型数据,但不能存放基本类型数据

2.数组初始化后大小固定,且数据都已经被赋值

3.list移除某一元素后,后续元素会前移;数组不能删除制定位置元素,除非重建数组对象

tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
#1、与字符串一样,元组的元素不能修改。
#2、元组也可以被索引和切片,方法一样。
#3、注意构造包含 0 或 1 个元素的元组的特殊语法规则。
#4、元组也可以使用+操作符进行拼接。

14.12 Set(集合)

集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

创建格式:

parame = {value01,value02,…}

或者

set(value)

student = {‘Tom’, ‘Jim’, ‘Mary’, ‘Tom’, ‘Jack’, ‘Rose’}

print(student) # 输出集合,重复的元素被自动去掉

成员测试

if ‘Rose’ in student:
print(‘Rose 在集合中’)
else:
print(‘Rose 不在集合中’)

set可以进行集合运算

a = set(‘abracadabra’)
b = set(‘alacazam’)

print(a)

print(a - b) # a 和 b 的差集

print(a | b) # a 和 b 的并集

print(a & b) # a 和 b 的交集

print(a ^ b) # a 和 b 中不同时存在的元素

14.13 Dictionary(字典)

字典(dictionary)是Python中另一个非常有用的内置数据类型。

列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。

键(key)必须使用不可变类型。

在同一个字典中,键(key)必须是唯一的。

dict = {}
dict[‘one’] = “1 - 菜鸟教程”
dict[2] = “2 - 菜鸟工具”

tinydict = {‘name’: ‘runoob’, ‘code’: 1, ‘site’: ‘www.runoob.com’}

print (dict[‘one’]) # 输出键为 ‘one’ 的值
print (dict[2]) # 输出键为 2 的值
print (tinydict) # 输出完整的字典
print (tinydict.keys()) # 输出所有键
print (tinydict.values()) # 输出所有值

#1、字典是一种映射类型,它的元素是键值对。
#2、字典的关键字必须为不可变类型,且不能重复。
#3、创建空字典使用 { }。

#十五.运算符

#算术运算符
#比较(关系)运算符
#赋值运算符
#逻辑运算符
#位运算符
#成员运算符
#身份运算符
#运算符优先级

15.1 Python算术运算符

+ 加 - 两个对象相加 a + b 输出结果 31

- 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -11

* 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 210

/ 除 - x 除以 y b / a 输出结果 2.1

% 取模 - 返回除法的余数 b % a 输出结果 1

** 幂 - 返回x的y次幂 a**b 为10的21次方

// 取整除 - 向下取接近除数的整数 9//2=4 -9//2=-5

15.2 Python比较运算符

== 等于 - 比较对象是否相等 (a == b) 返回 False。

!= 不等于 - 比较两个对象是否不相等 (a != b) 返回 True。

> 大于 - 返回x是否大于y (a > b) 返回 False。

< 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 (a < b) 返回 True。

>= 大于等于 - 返回x是否大于等于y。 (a >= b) 返回 False。

<= 小于等于 - 返回x是否小于等于y。 (a <= b) 返回 True。

15.3 Python赋值运算符

= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c

+= 加法赋值运算符 c += a 等效于 c = c + a

-= 减法赋值运算符 c -= a 等效于 c = c - a

*= 乘法赋值运算符 c *= a 等效于 c = c * a

/= 除法赋值运算符 c /= a 等效于 c = c / a

%= 取模赋值运算符 c %= a 等效于 c = c % a

**= 幂赋值运算符 c **= a 等效于 c = c ** a

//= 取整除赋值运算符 c //= a 等效于 c = c // a

15.4 Python位运算符

a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a = 1100 0011

& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100

| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101

^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001

~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。

<< 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000

>> 右移动运算符:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111

15.5 Python逻辑运算符

and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。

or x or y 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10。

not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False

15.6 Python成员运算符

in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。

not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

15.7 Python身份运算符

is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False

is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

is 与 == 区别:

is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。

15.8 Python运算符优先级

** 指数 (最高优先级)

~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)

* / % // 乘,除,取模和取整除

+ - 加法减法

>> << 右移,左移运算符

& 位 ‘AND’

^ | 位运算符

<= < > >= 比较运算符

<> == != 等于运算符

= %= /= //= -= += *= **= 赋值运算符

is is not 身份运算符

in not in 成员运算符

not and or 逻辑运算符

十六.Python3 数字(Number)

16.1 Python 数字数据类型用于存储数值。

数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。

以下实例在变量赋值时 Number 对象将被创建:var1 = 1 var2 = 10

16.2 也可以使用del语句删除一些数字对象的引用

del语句的语法是:del var1[,var2[,var3[…,varN]]]

您可以通过使用del语句删除单个或多个对象的引用,例如:del var del var_a, var_b

16.3 Python支持三种不同的数值类型

整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。

浮点型(float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)

复数( (complex)) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

16.4 Python 数字类型转换

int(x) 将x转换为一个整数。

float(x) 将x转换到一个浮点数。

complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。

complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。

16.5 Python 数字运算

Python 解释器可以作为一个简单的计算器,您可以在解释器里输入一个表达式,它将输出表达式的值。

表达式的语法很直白: +, -, * 和 /, 和其它语言(如Pascal或C)里一样

/和//的关系:

在整数除法中,除法 / 总是返回一个浮点数,如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符 // :>>> 17 / 3 # 整数除法返回浮点型 5.666666666666667 >>> 17 // 3 # 整数除法返回向下取整后的结果 5 >>> 17 % 3 # %操作符返回除法的余数 2 >>> 5 * 3 + 2 17

注意:// 得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。>>> 7//2 3 >>> 7.0//2 3.0 >>> 7//2.0 3.0

Python 可以使用 ** 操作来进行幂运算:5 ** 2 # 5 的平方 25

不同类型的数混合运算时会将整数转换为浮点数:3 * 3.75 / 1.5 = 7.5

十七.Python3 字符串

17.1 字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。

17.2 创建字符串很简单,只要为变量分配一个值即可。例如:var1 = ‘Hello World!’ var2 = “Runoob”

var1 = ‘Hello World!’
var2 = “Runoob”

print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])

17.3 Python 字符串更新

var1 = ‘Hello World!’
print ("已更新字符串 : ", var1[:6] + ‘Runoob!’)

17.4 Python转义字符

(在行尾时) 续行符

\ 反斜杠符号

’ 单引号

" 双引号

\a 响铃

\b 退格(Backspace)

\000 空

\n 换行

\v 纵向制表符

\t 横向制表符

\r 回车

\f 换页

\oyy 八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。

\xyy 十六进制数,yy代表的字符,例如:\x0a代表换行

\other 其它的字符以普通格式输出

17.5 Python字符串运算符

+ 字符串连接 a + b 输出结果: HelloPython

* 重复输出字符串 a*2 输出结果:HelloHello

[] 通过索引获取字符串中字符 a[1] 输出结果 e

[ : ] 截取字符串中的一部分,遵循左闭右开原则,str[0,2] 是不包含第 3 个字符的。 a[1:4] 输出结果 ell

in 成员运算符 - 如果字符串中包含给定的字符返回 True ‘H’ in a 输出结果 True

not in 成员运算符 - 如果字符串中不包含给定的字符返回 True ‘M’ not in a 输出结果 True

r/R 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。

print( r’\n’ )

print( R’\n’ )

% 格式字符串

a = “Hello”
b = “Python”

print(“a + b 输出结果:”, a + b)
print(“a * 2 输出结果:”, a * 2)
print(“a[1] 输出结果:”, a[1])
print(“a[1:4] 输出结果:”, a[1:4])

if (“H” in a):
print(“H 在变量 a 中”)
else:
print(“H 不在变量 a 中”)

if (“M” not in a):
print(“M 不在变量 a 中”)
else:
print(“M 在变量 a 中”)

print (r’\n’)
print (R’\n’)

17.6 Python字符串格式化

在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。

print (“我叫 %s 今年 %d 岁!” % (‘小明’, 10))

%c 格式化字符及其ASCII码

%s 格式化字符串

%d 格式化整数

%u 格式化无符号整型

%o 格式化无符号八进制数

%x 格式化无符号十六进制数

%X 格式化无符号十六进制数(大写)

%f 格式化浮点数字,可指定小数点后的精度

%e 用科学计数法格式化浮点数

%E 作用同%e,用科学计数法格式化浮点数

%g %f和%e的简写

%G %f 和 %E 的简写

%p 用十六进制数格式化变量的地址

17.7 Python三引号

python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下

para_str = “”“这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
“””
print (para_str)

十八. Python3 列表

序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。

Python有6个序列的内置类型,但最常见的是列表和元组。

序列都可以进行的操作包括索引,切片,加,乘,检查成员。

此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。

列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

18.1 访问列表中的值

使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符,如下所示:

list1 = [‘Google’, ‘Runoob’, 1997, 2000];

list2 = [1, 2, 3, 4, 5, 6, 7 ];

print ("list1[0]: ", list1[0])

print ("list2[1:5]: ", list2[1:5])

18.2 更新列表

可以对列表的数据项进行修改或更新,你也可以使用append()方法来添加列表项,如下所示:

list = [‘Google’, ‘Runoob’, 1997, 2000]
print ("第三个元素为 : ", list[2])
list[2] = 2001
print ("更新后的第三个元素为 : ", list[2])

18.3 删除列表元素

可以使用 del 语句来删除列表的的元素,如下实例:

list = [‘Google’, ‘Runoob’, 1997, 2000]

print ("原始列表 : ", list)
del list[2]
print ("删除第三个元素 : ", list)

18.4 Python列表脚本操作符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

len([1, 2, 3]) 3 长度

[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合

[‘Hi!’] * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 重复

3 in [1, 2, 3] True 元素是否存在于列表中

for x in [1, 2, 3]: print(x, end=" ") 1 2 3 迭代

18.5 Python列表截取与拼接

>>>L=[‘Google’, ‘Runoob’, ‘Taobao’]

>>> L[2]

‘Taobao’

>>> L[-2]

‘Runoob’

>>> L[1:]

[‘Runoob’, ‘Taobao’]

18.6 列表还支持拼接操作

>>>squares = [1, 4, 9, 16, 25]

>>> squares += [36, 49, 64, 81, 100]

>>> squares

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

18.7 嵌套列表

使用嵌套列表即在列表里创建其它列表

>>>a = [‘a’, ‘b’, ‘c’]

>>> n = [1, 2, 3]

>>> x = [a, n]

>>> x

[[‘a’, ‘b’, ‘c’], [1, 2, 3]]

>>> x[0]

[‘a’, ‘b’, ‘c’]

>>> x[0][1]

‘b’

18.8 Python列表函数&方法

1 len(list)

列表元素个数

2 max(list)

返回列表元素最大值

3 min(list)

返回列表元素最小值

4 list(seq)

将元组转换为列表

十九. Python3 元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号,列表使用方括号。

19.1 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

tup1 = (‘Google’, ‘Runoob’, 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = “a”, “b”, “c”, “d”; # 不需要括号也可以
print (type(tup3))

19.2 创建空元组

tup1 = ();

19.3 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:

tup1 = (50)
print (type(tup1)) # 不加逗号,类型为整型
tup1 = (50,)
print (type(tup1)) # 加上逗号,类型为元组

19.4 访问元组

元组可以使用下标索引来访问元组中的值,如下实例:

tup1 = (‘Google’, ‘Runoob’, 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7)

print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])

19.5 修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

tup1 = (12, 34.56);
tup2 = (‘abc’, ‘xyz’)

以下修改元组元素操作是非法的。

tup1[0] = 100

创建一个新的元组

tup3 = tup1 + tup2;
print (tup3)

19.6 删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

tup = (‘Google’, ‘Runoob’, 1997, 2000)

print (tup)

del tup;

print ("删除后的元组 tup : ")

print (tup)

19.7 元组索引,截取

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

L = (‘Google’, ‘Taobao’, ‘Runoob’)
print (L[2])
print (L[-2])
print (L[1:])

二十. Python3 字典

20.1 字典是另一种可变容器模型,且可存储任意类型对象。

20.2 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

dict = {‘Alice’: ‘2341’, ‘Beth’: ‘9102’, ‘Cecil’: ‘3258’}
dict1 = { ‘abc’: 456 }
dict2 = { ‘abc’: 123, 98.6: 37 }
print (dict2)

20.3 键必须是唯一的,但值则不必。

20.4 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

20.5 访问字典里的值

dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}

print ("dict[‘Name’]: ", dict[‘Name’])
print ("dict[‘Age’]: ", dict[‘Age’])

20.6 修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}

dict[‘Age’] = 8 # 更新 Age
dict[‘School’] = “菜鸟教程” # 添加信息

print ("dict[‘Age’]: ", dict[‘Age’])
print ("dict[‘School’]: ", dict[‘School’])

20.7 删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。显示删除一个字典用del命令,如下实例:

dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}
del dict[‘Name’] # 删除键 ‘Name’
print (dict)

dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}
dict.clear() # 清空字典
print (dict)

dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}
del dict # 删除字典
print (dict)

20.8 字典键的特性

字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。

两个重要的点需要记住:

1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:

dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Name’: ‘小菜鸟’}

print ("dict[‘Name’]: ", dict[‘Name’])

以上实例输出结果:

dict[‘Name’]: 小菜鸟

2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行,如下实例:

dict = {[‘Name’]: ‘Runoob’, ‘Age’: 7}

print ("dict[‘Name’]: ", dict[‘Name’])

以上实例输出结果:

Traceback (most recent call last):

File “test.py”, line 3, in

dict = {[‘Name’]: ‘Runoob’, ‘Age’: 7}

TypeError: unhashable type: ‘list’

二十一. Python3 集合

21.1 集合(set)是一个无序的不重复元素序列。

21.2 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

21.3 创建格式:parame = {value01,value02,…} 或者 set(value)

>>>basket = {‘apple’, ‘orange’, ‘apple’, ‘pear’, ‘orange’, ‘banana’}

>>> print(basket) # 这里演示的是去重功能

{‘orange’, ‘banana’, ‘pear’, ‘apple’}

>>> ‘orange’ in basket # 快速判断元素是否在集合内

True

>>> ‘crabgrass’ in basket

False

>>> # 下面展示两个集合间的运算.

>>> a = set(‘abracadabra’)

>>> b = set(‘alacazam’)

>>> a

{‘a’, ‘r’, ‘b’, ‘c’, ‘d’}

>>> a - b # 集合a中包含而集合b中不包含的元素

{‘r’, ‘d’, ‘b’}

>>> a | b # 集合a或b中包含的所有元素

{‘a’, ‘c’, ‘r’, ‘d’, ‘b’, ‘m’, ‘z’, ‘l’}

>>> a & b # 集合a和b中都包含了的元素

{‘a’, ‘c’}

>>> a ^ b # 不同时包含于a和b的元素

{‘r’, ‘d’, ‘b’, ‘m’, ‘z’, ‘l’}

21.4 类似列表推导式,同样集合支持集合推导式(Set comprehension):

a = {x for x in ‘abracadabra’ if x not in ‘abc’}
print (a)

21.5 添加元素 s.add( x )

thisset = set((“Google”, “Runoob”, “Taobao”))
thisset.add(“Facebook”)
print(thisset)

还有一个方法,也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:s.update( x )

thisset = set((“Google”, “Runoob”, “Taobao”))
thisset.update({1,3})
print(thisset)
thisset.update([1,4],[5,6])
print(thisset)

21.6 移除元素 s.remove( x )

将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。

thisset = set((“Google”, “Runoob”, “Taobao”))
thisset.remove(“Taobao”)
print(thisset)
#thisset.remove(“Facebook”) # 不存在会发生错误

此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:

s.discard( x )

thisset = set((“Google”, “Runoob”, “Taobao”))
thisset.discard(“Facebook”) # 不存在不会发生错误
print(thisset)

我们也可以设置随机删除集合中的一个元素,语法格式如下:s.pop()

thisset = set((“Google”, “Runoob”, “Taobao”, “Facebook”))
x = thisset.pop()
print(x)

21.7 计算集合元素个数 len(s)

thisset = set((“Google”, “Runoob”, “Taobao”))
print (len(thisset))

21.8 清空集合 s.clear()

thisset = set((“Google”, “Runoob”, “Taobao”))
thisset.clear()
print(thisset)

21.9 判断元素是否在集合中存在

x in s 判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False。

thisset = set((“Google”, “Runoob”, “Taobao”))
print (“Runoob” in thisset)

print (“Facebook” in thisset)

二十二 Python3 条件控制

22.1 联系

a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b

i = 256*256
print(‘i 的值为:’, i)

22.2 条件控制

Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。

if condition_1:

statement_block_1

elif condition_2:

statement_block_2

else:

statement_block_3

实例

age = 2#int(input("请输入你家狗狗的年龄: "))

if age<=0:
print (“Are you kidding me!”)
elif age1:
print (“相当于 14 岁的人。”)
elif age
2:
print (“相当于 22 岁的人。”)
elif age > 2:
human = 22 + (age -2)*5
print("对应人类年龄: ", human)

实例

print(5 == 6)

使用变量

x = 5
y = 8
print(x == y)

实例

number = 7

guess = -1

print(“数字猜谜游戏!”)

while guess != number:

guess = int(input(“请输入你猜的数字:”))

if guess == number:

print(“恭喜,你猜对了!”)

elif guess < number:

print(“猜的数字小了…”)

elif guess > number:

print(“猜的数字大了…”)

二十三 Python3 循环语句

Python中的循环语句有 for 和 while。

在 Python 中没有 do…while 循环。

Python中while语句的一般形式:

while 判断条件:

语句

n = 100

sum = 0
counter = 1
while counter <= n:
sum = sum + counter
counter += 1

print(“1 到 %d 之和为: %d” % (n, sum))

23.1 无限循环

var = 1

while var == 1: # 表达式永远为 true

num = int(input(“输入一个数字 :”))

print ("你输入的数字是: ", num)

print (“Good bye!”)

23.2 while 循环使用 else 语句

count = 0
while count < 5:
print (count, " 小于 5")
count = count + 1
else:
print (count, " 大于或等于 5")

如果while循环体中只有一条语句,可以将该语句与while写在同一行中, 如下所示

flag = 1

while (flag): print (‘欢迎访问菜鸟教程!’)

print (“Good bye!”)

23.3 for 语句

Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。

for循环的一般格式如下:

for in :

else:

languages = [“C”, “C++”, “Perl”, “Python”]
for x in languages:
print (x)

sites = [“Baidu”, “Google”,“Runoob”,“Taobao”]
for site in sites:
if site == “Runoob”:
print(“菜鸟教程!”)
break
print("循环数据 " + site)
else:
print(“没有循环数据!”)
print(“完成循环!”)

23.4 range()函数

如果需要遍历数字序列,可以使用内置range()函数。它会生成数列,例如:

for i in range(5):
print(i)

for i in range(0, 10, 3) :
print(i)

for i in range(-10, -100, -30) :
print(i)

可以结合range()和len()函数以遍历一个序列的索引

a = [‘Google’, ‘Baidu’, ‘Runoob’, ‘Taobao’, ‘QQ’]
for i in range(len(a)):
print(i, a[i])

break和continue语句及循环中的else子句

for letter in ‘Runoob’: # 第一个实例
if letter == ‘b’:
break
print (‘当前字母为 :’, letter)

var = 10 # 第二个实例
while var > 0:
print (‘当期变量值为 :’, var)
var = var - 1
if var == 5:
break

print (“Good bye!”)

23.5 continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环

for letter in ‘Runoob’: # 第一个实例
if letter == ‘o’: # 字母为 o 时跳过输出
continue
print (‘当前字母 :’, letter)

var = 10 # 第二个实例
while var > 0:
var = var - 1
if var == 5: # 变量为 5 时跳过输出
continue
print (‘当前变量值 :’, var)
print (“Good bye!”)

23.6 pass 语句

Python pass是空语句,是为了保持程序结构的完整性。

pass 不做任何事情,一般用做占位语句,如下实例

while True:

pass # 等待键盘中断 (Ctrl+C)

for letter in ‘Runoob’:
if letter == ‘o’:
pass
print (‘执行 pass 块’)
print (‘当前字母 :’, letter)

print (“Good bye!”)

二十四 Python3 迭代器与生成器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

24.1 字符串,列表或元组对象都可用于创建迭代器:

list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
print (next(it)) # 输出迭代器的下一个元素
print (next(it)) # 输出迭代器的下一个元素

24.2 迭代器对象可以使用常规for语句进行遍历:

for x in it:
print (x)

24.3 也可以使用 next() 函数:

import sys # 引入 sys 模块

list = [1, 2, 3, 4]
it = iter(list) # 创建迭代器对象

while True:
try:
print (next(it))
except StopIteration:
sys.exit()

24.4 创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。

如果已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 init(), 它会在对象初始化的时候执行。

class MyNumbers:

def iter(self):

self.a = 1

return self

def next(self):

if self.a <= 20:

x = self.a

self.a += 1

return x

else:

raise StopIteration

myclass = MyNumbers()

myiter = iter(myclass)

for x in myiter:

print(x)

import sys

def fibonacci(n): # 生成器函数 - 斐波那契

a, b, counter = 0, 1, 0

while True:

if (counter > n):

return

yield a

a, b = b, a + b

counter += 1

f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:

try:

print (next(f))

except StopIteration:

sys.exit()

二十五 Python3 函数

25.1 定义一个函数

#函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
#任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
#函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
#函数内容以冒号起始,并且缩进。
#return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):

# 函数体

实例

def hello():
print(“Hello World!”)

hello()

def area(width, height):
return width * height

def print_welcome(name):
print(“Welcome”, name)

print_welcome(“Runoob”)
w = 4
h = 5
print(“width =”, w, " height =", h, " area =", area(w, h))

25.2 函数调用

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

如下实例调用了 printme() 函数:

定义函数

def printme(str):
# 打印任何传入的字符串
print (str)
return

调用函数

printme(“我要调用用户自定义函数!”)
printme(“再次调用同一函数”)

25.3 参数传递

在 python 中,类型属于对象,变量是没有类型的:

a=[1,2,3]
a=“Runoob”

以上代码中,[1,2,3] 是 List 类型,“Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。

25.4 可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。

可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

25.5 python 函数的参数传递:

不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python 传不可变对象实例

def ChangeInt(a):
a = 10

b = 2
ChangeInt(b)
print(b) # 结果是 2

实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。

传可变对象实例

可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

可写函数说明

def changeme(mylist):
“修改传入的列表”
mylist.append([1, 2, 3, 4])
print ("函数内取值: ", mylist)
return

调用changeme函数

mylist = [10, 20, 30]
changeme(mylist)
print ("函数外取值: ", mylist)

25.6 参数

以下是调用函数时可使用的正式参数类型:

必需参数

关键字参数

默认参数

不定长参数

25.6.1 必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:

可写函数说明

def printme(str):
“打印任何传入的字符串”
print (str)
return

调用 printme 函数,不加参数会报错

printme()

25.6.2 关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 printme() 调用时使用参数名:

可写函数说明

def printinfo(name, age):
“打印任何传入的字符串”
print ("名字: ", name)
print ("年龄: ", age)
return

调用printinfo函数

printinfo(age=50, name=“runoob”)

25.6.3 默认参数

可写函数说明

def printinfo(name, age=35):
“打印任何传入的字符串”
print ("名字: ", name)
print ("年龄: ", age)
return

调用printinfo函数

printinfo(age=50, name=“runoob”)
print ("------------------------")
printinfo(name=“runoob”)

25.6.4 不定长参数

可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:

加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

可写函数说明

def printinfo(arg1, *vartuple):
“打印任何传入的参数”
print ("输出: ")
print (arg1)
for var in vartuple:
print (var)
return

调用printinfo 函数

printinfo(10)
printinfo(70, 60, 50)

还有一种就是参数带两个星号 ** 基本语法如下:

可写函数说明

def printinfo(arg1, **vardict):
“打印任何传入的参数”
print ("输出: ")
print (arg1)
print (vardict)

调用printinfo 函数

printinfo(1, a=2, b=3)

如果单独出现星号 * 后的参数必须用关键字传入。

def f(a,b,*,c):
return a+b+c

f(1,2,3) # 报错
f(1,2,c=3) # 正常

25.7 匿名函数

python 使用 lambda 来创建匿名函数。

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

lambda 只是一个表达式,函数体比 def 简单很多。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

可写函数说明

sum = lambda arg1, arg2: arg1 + arg2

调用sum函数

print ("相加后的值为 : ", sum(10, 20))
print ("相加后的值为 : ", sum(20, 20))

25.8 return语句

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:

可写函数说明

def sum(arg1, arg2):
# 返回2个参数的和."
total = arg1 + arg2
print ("函数内 : ", total)
return total

调用sum函数

total = sum(10, 20)
print ("函数外 : ", total)

25.9 变量作用域

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

L (Local) 局部作用域

E (Enclosing) 闭包函数外的函数中

G (Global) 全局作用域

B (Built-in) 内置作用域(内置函数所在模块的范围)

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:

if True:
msg = ‘I am from Runoob’

msg
‘I am from Runoob’

如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:

def test():

msg_inner = ‘I am from Runoob’

>>> msg_inner

Traceback (most recent call last):

File “”, line 1, in

NameError: name ‘msg_inner’ is not defined

25.10 全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

total = 0 # 这是一个全局变量

可写函数说明

def sum(arg1, arg2):
# 返回2个参数的和."
total = arg1 + arg2 # total在这里是局部变量.
print ("函数内是局部变量 : ", total)
return total

调用sum函数

sum(10, 20)
print ("函数外是全局变量 : ", total)

函数内是局部变量 : 30

函数外是全局变量 : 0

25.11 global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

以下实例修改全局变量 num:

num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num)
num = 123
print(num)
fun1()
print(num)

1
123
123

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()

100
100

二十六 Python3 数据结构

26.1 列表

Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。

以下是 Python 中列表的方法:

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, 333, 1234.5]

26.2 将列表当做堆栈使用

将列表当做堆栈使用列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用

append()

方法可以把一个元素添加到堆栈顶。用不指定索引的

pop()

方法可以把一个元素从堆栈顶释放出来。例如:

stack = [3, 4, 5]

stack.append(6)

stack.append(7)

stack

[3, 4, 5, 6, 7]

stack.pop()

7

stack

[3, 4, 5, 6]

stack.pop()

6

stack.pop()

5

stack

[3, 4]

26.3 将列表当作队列使用

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

from collections import deque
queue = deque([“Eric”, “John”, “Michael”])
queue.append(“Terry”) # Terry arrives
queue.append(“Graham”) # Graham arrives
queue.popleft() # The first to arrive now leaves
print (queue)

26.4 列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

这里我们将列表中每个数值乘三,获得一个新的列表:

vec = [2, 4, 6]
print ([3*x for x in vec])
[6, 12, 18]

[[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

可以用 if 子句作为过滤器:

[3*x for x in vec if x > 3]
[12, 18]

一些关于循环和其它技巧

vec1 = [2, 4, 6]
vec2 = [4, 3, -9]
[x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
[x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
[vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

26.5 嵌套列表解析

展示了3X4的矩阵列表:

matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]

将3X4的矩阵列表转换为4X3列表:

print ([[row[i] for row in matrix] for i in range(4)])

del 语句

使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:

a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0]
del a[2:4]
del a[:]
del a

26.6 元组和序列

元组由若干逗号分隔的值组成,例如:

t = 12345, 54321, ‘hello!’
u = t, (1, 2, 3, 4, 5)
print (u)

26.7 集合

集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。

可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典,下一节我们会介绍这个数据结构。

basket = {‘apple’, ‘orange’, ‘apple’, ‘pear’, ‘orange’, ‘banana’}
print(basket)

检测成员

‘orange’ in basket
‘crabgrass’ in basket

a = set(‘abracadabra’)
b = set(‘alacazam’)
a - b
a | b
a & b
a ^ b

a = {x for x in ‘abracadabra’ if x not in ‘abc’}

26.8 字典

序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。

理解字典的最佳方式是把它看做无序的键=>值对集合。在同一个字典之内,关键字必须是互不相同。

一对大括号创建一个空的字典:{}。

tel = {‘jack’: 4098, ‘sape’: 4139}
tel[‘guido’] = 4127
tel
{‘sape’: 4139, ‘guido’: 4127, ‘jack’: 4098}
tel[‘jack’]
4098
del tel[‘sape’]
tel[‘irv’] = 4127
tel
{‘guido’: 4127, ‘irv’: 4127, ‘jack’: 4098}
list(tel.keys())
[‘irv’, ‘guido’, ‘jack’]
sorted(tel.keys())
[‘guido’, ‘irv’, ‘jack’]
‘guido’ in tel
True
‘jack’ not in tel
False

26.9 遍历技巧

在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来:

knights = {‘gallahad’: ‘the pure’, ‘robin’: ‘the brave’}

for k, v in knights.items():

print(k, v)

gallahad the pure

robin the brave

在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:

for i, v in enumerate([‘tic’, ‘tac’, ‘toe’]):

print(i, v)

0 tic

1 tac

2 toe

同时遍历两个或更多的序列,可以使用 zip() 组合:

questions = [‘name’, ‘quest’, ‘favorite color’]

answers = [‘lancelot’, ‘the holy grail’, ‘blue’]

for q, a in zip(questions, answers):

print(‘What is your {0}? It is {1}.’.format(q, a))

What is your name? It is lancelot.

What is your quest? It is the holy grail.

What is your favorite color? It is blue.

二十七 Python3 模块

使用 python 标准库中模块的例子

import sys
print(‘命令行参数如下:’)
for i in sys.argv:
print(i)

print(’\n\nPython 路径为:’, sys.path, ‘\n’)

1、import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。

2、sys.argv 是一个包含命令行参数的列表。

3、sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。

27.1 import 语句

想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:

import module1[, module2[,… moduleN]

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 support,需要把命令放在脚本的顶端:

Filename: support.py

def print_func(par):
print ("Hello : ", par)
return

test.py 引入 support 模块:

Filename: test.py

导入模块

import support

现在可以调用模块里包含的函数了

support.print_func(“Runoob”)

27.2 from … import 语句

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[, name2[, … nameN]]

要导入模块 fibo 的 fib 函数,使用如下语句:

from fibo import fib, fib2

这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的fib函数引入进来。

27.3 from … import * 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

二十八 Python3 输入和输出

28.1 输出格式美化

Python两种输出值的方式: 表达式语句和 print() 函数。

第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。

如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。

如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。

str(): 函数返回一个用户易读的表达形式。

repr(): 产生一个解释器易读的表达形式。

s = ‘Hello, Runoob’
print (str(s))

‘Hello, Runoob’

print (repr(s))

“‘Hello, Runoob’”

print (str(1/7))

‘0.14285714285714285’

x = 10 * 3.25
y = 200 * 200
s = 'x 的值为: ’ + repr(x) + ‘, y 的值为:’ + repr(y) + ‘…’
print(s)

x 的值为: 32.5, y 的值为:40000…

repr() 函数可以转义字符串中的特殊字符

hello = ‘hello, runoob\n’
hellos = repr(hello)
print(hellos)

‘hello, runoob\n’

repr() 的参数可以是 Python 的任何对象

print (repr((x, y, (‘Google’, ‘Runoob’))))

“(32.5, 40000, (‘Google’, ‘Runoob’))”

这个例子展示了字符串对象的 rjust() 方法, 它可以将字符串靠右, 并在左边填充空格。

还有类似的方法, 如 ljust() 和 center()。 这些方法并不会写任何东西, 它们仅仅返回新的字符串。

另一个方法 zfill(), 它会在数字的左边填充 0,如下所示:

‘12’.zfill(5)
‘00012’
‘-3.14’.zfill(7)
‘-003.14’
‘3.14159265359’.zfill(5)
‘3.14159265359’

28.2 str.format() 的基本使用如下:

print(’{}网址: “{}!”’.format(‘菜鸟教程’, ‘www.runoob.com’))

菜鸟教程网址: “www.runoob.com!”

括号及其里面的字符 (称作格式化字段) 将会被 format() 中的参数替换。

在括号中的数字用于指向传入对象在 format() 中的位置,如下所示:

print(’{0} 和 {1}’.format(‘Google’, ‘Runoob’))

Google 和 Runoob

print(’{1} 和 {0}’.format(‘Google’, ‘Runoob’))

Runoob 和 Google

如果在 format() 中使用了关键字参数, 那么它们的值会指向使用该名字的参数。

print(’{name}网址: {site}’.format(name=‘菜鸟教程’, site=‘www.runoob.com’))

菜鸟教程网址: www.runoob.com

位置及关键字参数可以任意的结合:

print(‘站点列表 {0}, {1}, 和 {other}。’.format(‘Google’, ‘Runoob’, other=‘Taobao’))

站点列表 Google, Runoob, 和 Taobao。

!a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用于在格式化某个值之前对其进行转化:

import math
print(‘常量 PI 的值近似为: {}。’.format(math.pi))

常量 PI 的值近似为: 3.141592653589793。

print(‘常量 PI 的值近似为: {!r}。’.format(math.pi))

常量 PI 的值近似为: 3.141592653589793。

可选项 : 和格式标识符可以跟着字段名。 这就允许对值进行更好的格式化。 下面的例子将 Pi 保留到小数点后三位:

import math
print(‘常量 PI 的值近似为 {0:.3f}。’.format(math.pi))

常量 PI 的值近似为 3.142。

在 : 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。

table = {‘Google’: 1, ‘Runoob’: 2, ‘Taobao’: 3}
for name, number in table.items():
print(’{0:10} ==> {1:10d}’.format(name, number))

如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。

最简单的就是传入一个字典, 然后使用方括号 [] 来访问键值 :

table = {‘Google’: 1, ‘Runoob’: 2, ‘Taobao’: 3}
print(‘Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}’.format(table))

Runoob: 2; Google: 1; Taobao: 3

也可以通过在 table 变量前使用 ** 来实现相同的功能:

table = {‘Google’: 1, ‘Runoob’: 2, ‘Taobao’: 3}
print(‘Runoob: {Runoob:d}; Google: {Google:d}; Taobao: {Taobao:d}’.format(**table))

Runoob: 2; Google: 1; Taobao: 3

28.3 旧式字符串格式化

% 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串. 例如:

import math

print(‘常量 PI 的值近似为:%5.3f。’ % math.pi)

常量 PI 的值近似为:3.142。

因为 str.format() 比较新的函数, 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format().

28.4 读取键盘输入

Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。

input 可以接收一个Python表达式作为输入,并将运算结果返回。

str = input(“请输入:”);
print ("你输入的内容是: ", str)

这会产生如下的对应着输入的结果:

请输入:菜鸟教程

你输入的内容是: 菜鸟教程

28.5 读和写文件

open() 将会返回一个 file 对象,基本语法格式如下:

filename:包含了你要访问的文件名称的字符串值。

mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。

28.5 读和写文件

open()将会返回一个file对象,基本语法格式如下:

open(filename, mode)

filename:包含了你要访问的文件名称的字符串值。

mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。

打开一个文件

f = open("/tmp/foo.txt", “w”)

f.write( “Python 是一个非常好的语言。\n是的,的确非常好!!\n” )

关闭打开的文件

f.close()

28.6 文件对象的方法

f.read()

为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。

size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。

以下实例假定文件 foo.txt 已存在(上面实例中已创建):

打开一个文件

f = open("/tmp/foo.txt", “r”)

str = f.read()
print(str)

关闭打开的文件

f.close()

28.7 f.readline()

f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。

打开一个文件

f = open("/tmp/foo.txt", “r”)

str = f.readline()
print(str)

关闭打开的文件

f.close()

28.8 f.readlines()

f.readlines() 将返回该文件中包含的所有行。

如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。

打开一个文件

f = open("/tmp/foo.txt", “r”)

str = f.readlines()
print(str)

关闭打开的文件

f.close()

另一种方式是迭代一个文件对象然后读取每行:

# 打开一个文件

f = open("/tmp/foo.txt", “r”)

for line in f:

print(line, end=’’)

# 关闭打开的文件

f.close()

28.9 f.write()

f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。

打开一个文件

f = open("/tmp/foo.txt", “w”)

num = f.write( “Python 是一个非常好的语言。\n是的,的确非常好!!\n” )
print(num)

关闭打开的文件

f.close()

28.10 如果要写入一些不是字符串的东西, 那么将需要先进行转换:

打开一个文件

f = open("/tmp/foo1.txt", “w”)

value = (‘www.runoob.com’, 14)
s = str(value)
f.write(s)

关闭打开的文件

f.close()

28.11 f.tell()

f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。

28.12 f.seek()

如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。

from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:

seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符

seek(x,1) : 表示从当前位置往后移动x个字符

seek(-x,2):表示从文件的结尾往前移动x个字符

from_what 值为默认为0,即文件开头。下面给出一个完整的例子:

f = open(’/tmp/foo.txt’, ‘rb+’)
f.write(b’0123456789abcdef’)
16
f.seek(5) # 移动到文件的第六个字节
5
f.read(1)
b’5’
f.seek(-3, 2) # 移动到文件的倒数第三字节
13
f.read(1)
b’d’

28.13 f.close()

在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。

当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。

当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:

with open(’/tmp/foo.txt’, ‘r’) as f:
read_data = f.read()
f.closed
True

28.14 pickle 模块

python的pickle模块实现了基本的数据序列和反序列化。

通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。

通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

基本接口:pickle.dump(obj, file, [,protocol])

有了 pickle 这个对象, 就能对 file 以读取的形式打开:

x = pickle.load(file)

注解:从 file 中读取一个字符串,并将它重构为原来的python对象。

file: 类文件对象,有read()和readline()接口。

实例 1

import pickle

使用pickle模块将数据对象保存到文件

data1 = {‘a’: [1, 2.0, 3, 4+6j],
‘b’: (‘string’, u’Unicode string’),
‘c’: None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open(‘data.pkl’, ‘wb’)

Pickle dictionary using protocol 0.

pickle.dump(data1, output)

Pickle the list using the highest protocol available.

pickle.dump(selfref_list, output, -1)

output.close()

实例 2

import pprint, pickle

#使用pickle模块从文件中重构python对象
pkl_file = open(‘data.pkl’, ‘rb’)

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()

二十九 Python3 File(文件) 方法

29.1 open() 方法

Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

open(file, mode=‘r’)

open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

file: 必需,文件路径(相对或者绝对路径)。

mode: 可选,文件打开模式

buffering: 设置缓冲

encoding: 一般使用utf8

errors: 报错级别

newline: 区分换行符

closefd: 传入的file参数类型

opener:

29.2 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()

Python 3 中的 File 对象不支持 next() 方法。

返回文件下一行。

6

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

7

file.readline([size])

读取整行,包括 “\n” 字符。

8

file.readlines([sizeint])

读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

9

file.seek(offset[, whence])

设置文件当前位置

10

file.tell()

返回文件当前位置。

11

file.truncate([size])

从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

12

file.write(str)

将字符串写入文件,返回的是写入的字符长度。

13

file.writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

三十 Python3 OS 文件/目录方法

os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:

1

os.access(path, mode)

检验权限模式

os.access() 方法使用当前的uid/gid尝试访问路径。大部分操作使用有效的 uid/gid, 因此运行环境可以在 suid/sgid 环境尝试。

# path -- 要用来检测是否有访问权限的路径。
#
# mode -- mode为F_OK,测试存在的路径,或者它可以是包含R_OK, W_OK和X_OK或者R_OK, W_OK和X_OK其中之一或者更多。
#     os.F_OK: 作为access()的mode参数,测试path是否存在。
#     os.R_OK: 包含在access()的mode参数中 , 测试path是否可读。
#     os.W_OK 包含在access()的mode参数中 , 测试path是否可写。
#     os.X_OK 包含在access()的mode参数中 ,测试path是否可执行。

import os, sys

假定 /tmp/foo.txt 文件存在,并有读写权限

ret = os.access("/tmp/foo.txt", os.F_OK)
print (“F_OK - 返回值 %s”% ret)

ret = os.access("/tmp/foo.txt", os.R_OK)
print (“R_OK - 返回值 %s”% ret)

ret = os.access("/tmp/foo.txt", os.W_OK)
print (“W_OK - 返回值 %s”% ret)

ret = os.access("/tmp/foo.txt", os.X_OK)
print (“X_OK - 返回值 %s”% ret)

F_OK - 返回值 True

R_OK - 返回值 True

W_OK - 返回值 True

X_OK - 返回值 False

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的文件的文件系统的信息,Python 3.3 相等于 statvfs()。

19

os.fsync(fd)

强制将文件描述符为fd的文件写入硬盘。

20

os.ftruncate(fd, length)

裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。

21

os.getcwd()

返回当前工作目录

22

os.getcwdu()

返回一个当前工作目录的Unicode对象

23

os.isatty(fd)

如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。

24

os.lchflags(path, flags)

设置路径的标记为数字标记,类似 chflags(),但是没有软链接

25

os.lchmod(path, mode)

修改连接文件权限

26

os.lchown(path, uid, gid)

更改文件所有者,类似 chown,但是不追踪链接。

27

os.link(src, dst)

创建硬链接,名为参数 dst,指向参数 src

28

os.listdir(path)

返回path指定的文件夹包含的文件或文件夹的名字的列表。

29

os.lseek(fd, pos, how)

设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效

30

os.lstat(path)

像stat(),但是没有软链接

31

os.major(device)

从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。

32

os.makedev(major, minor)

以major和minor设备号组成一个原始设备号

33

os.makedirs(path[, mode])

递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。

34

os.minor(device)

从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。

35

os.mkdir(path[, mode])

以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。

36

os.mkfifo(path[, mode])

创建命名管道,mode 为数字,默认为 0666 (八进制)

37

os.mknod(filename[, mode=0600, device])

创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。

38

os.open(file, flags[, mode])

打开一个文件,并且设置需要的打开选项,mode参数是可选的

39

os.openpty()

打开一个新的伪终端对。返回 pty 和 tty的文件描述符。

40

os.pathconf(path, name)

返回相关文件的系统配置信息。

41

os.pipe()

创建一个管道. 返回一对文件描述符(r, w) 分别为读和写

42

os.popen(command[, mode[, bufsize]])

从一个 command 打开一个管道

43

os.read(fd, n)

从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。

44

os.readlink(path)

返回软链接所指向的文件

45

os.remove(path)

删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。

46

os.removedirs(path)

递归删除目录。

47

os.rename(src, dst)

重命名文件或目录,从 src 到 dst

48

os.renames(old, new)

递归地对目录进行更名,也可以对文件进行更名。

49

os.rmdir(path)

删除path指定的空目录,如果目录非空,则抛出一个OSError异常。

50

os.stat(path)

获取path指定的路径的信息,功能等同于C API中的stat()系统调用。

51

os.stat_float_times([newvalue])

决定stat_result是否以float对象显示时间戳

52

os.statvfs(path)

获取指定路径的文件系统统计信息

53

os.symlink(src, dst)

创建一个软链接

54

os.tcgetpgrp(fd)

返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组

55

os.tcsetpgrp(fd, pg)

设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。

56

os.tempnam([dir[, prefix]])

Python3 中已删除。返回唯一的路径名用于创建临时文件。

57

os.tmpfile()

Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。

58

os.tmpnam()

Python3 中已删除。为创建一个临时文件返回一个唯一的路径

59

os.ttyname(fd)

返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。

60

os.unlink(path)

删除文件路径

61

os.utime(path, times)

返回指定的path文件的访问和修改的时间。

62

os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])

输出在文件夹中的文件名通过在树中游走,向上或者向下。

63

os.write(fd, str)

写入字符串到文件描述符 fd中. 返回实际写入的字符串长度

64

os.path 模块

获取文件的属性信息。

三十一 Python3 错误和异常

Python 有两种错误很容易辨认:语法错误和异常。

31.1 语法错误

while True print(‘Hello world’)

File “”, line 1, in ?

while True print(‘Hello world’)

^

SyntaxError: invalid syntax

#函数 print() 被检查到有错误,是它前面缺少了一个冒号(:)。语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。

31.2 异常

即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

10 * (1/0)

Traceback (most recent call last):

File “”, line 1, in ?

ZeroDivisionError: division by zero

4 + spam*3

Traceback (most recent call last):

File “”, line 1, in ?

NameError: name ‘spam’ is not defined

‘2’ + 2

Traceback (most recent call last):

File “”, line 1, in ?

TypeError: Can’t convert ‘int’ object to str implicitly

异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。

31.3 异常处理

try语句按照如下方式工作;

首先,执行try子句(在关键字try和关键字except之间的语句)

如果没有异常发生,忽略except子句,try子句执行后结束。

如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。

如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError, TypeError, NameError):

pass

最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

import sys

try:
f = open(‘myfile.txt’)
s = f.readline()
i = int(s.strip())
except OSError as err:
print(“OS error: {0}”.format(err))
except ValueError:
print(“Could not convert data to an integer.”)
except:
print(“Unexpected error:”, sys.exc_info()[0])
raise

try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。例如:

for arg in sys.argv[1:]:
try:
f = open(arg, ‘r’)
except IOError:
print(‘cannot open’, arg)
else:
print(arg, ‘has’, len(f.readlines()), ‘lines’)
f.close()

31.4 抛出异常

Python 使用 raise 语句抛出一个指定的异常。例如:

raise NameError(‘HiThere’)

Traceback (most recent call last):

File “”, line 1, in ?

NameError: HiThere

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

try:
raise NameError(‘HiThere’)
except NameError:
print(‘An exception flew by!’)
raise

An exception flew by!

Traceback (most recent call last):

File “”, line 2, in ?

NameError: HiThere

31.5 用户自定义异常

可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

class MyError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)


try:
    raise MyError(2 * 2)
except MyError as e:
    print('My exception occurred, value:', e.value)

在这个例子中,类 Exception 默认的 init() 被覆盖。

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

class Error(Exception):
“”“Base class for exceptions in this module.”""
pass

class InputError(Error):
“”"Exception raised for errors in the input.

Attributes:
    expression -- input expression in which the error occurred
    message -- explanation of the error
"""

def __init__(self, expression, message):
    self.expression = expression
    self.message = message

class TransitionError(Error):
“”"Raised when an operation attempts a state transition that’s not
allowed.

Attributes:
    previous -- state at beginning of transition
    next -- attempted new state
    message -- explanation of why the specific transition is not allowed
"""

def __init__(self, previous, next, message):
    self.previous = previous
    self.next = next
    self.message = message

31.5 定义清理行为

try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:

try:
raise KeyboardInterrupt
finally:
print(‘Goodbye, world!’)

以上例子不管 try 子句里面有没有发生异常,finally 子句都会执行。

如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。

下面是一个更加复杂的例子(在同一个 try 语句里包含 except 和 finally 子句):

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")

>>> divide(2, 1)

result is 2.0

executing finally clause

>>> divide(2, 0)

division by zero!

executing finally clause

>>> divide(“2”, “1”)

executing finally clause

Traceback (most recent call last):

File “”, line 1, in ?

File “”, line 3, in divide

TypeError: unsupported operand type(s) for /: ‘str’ and ‘str’

31.6 预定义的清理行为

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。

这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:

for line in open(“myfile.txt”):
print(line, end="")

以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。

关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:

with open(“myfile.txt”) as f:
for line in f:
print(line, end="")

以上这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。

三十二 面向对象技术简介

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

方法:类中定义的函数。

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

局部变量:定义在方法中的变量,只作用于当前实例的类。

实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

实例化:创建一个类的实例,类的具体对象。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

32.1 类定义

语法格式如下:

class ClassName:

.

.

.

类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。

32.2 类对象

类对象支持两种操作:属性引用和实例化。

属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。

类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:

class MyClass:
“”“一个简单的类实例”""
i = 12345

def f(self):
    return 'hello world'

实例化类

x = MyClass()

访问类的属性和方法

print(“MyClass 类的属性 i 为:”, x.i)
print(“MyClass 类的方法 f 输出为:”, x.f())

以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。

执行以上程序输出结果为:

MyClass 类的属性 i 为: 12345

MyClass 类的方法 f 输出为: hello world

类有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

def init(self):
self.data = []

类定义了 init() 方法,类的实例化操作会自动调用 init() 方法。如下实例化类 MyClass,对应的 init() 方法就会被调用:

x = MyClass()

当然, init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。例如:

class Complex:
def init(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i) # 输出结果:3.0 -4.5

32.3 self代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

class Test:
def prt(self):
print(self)
print(self.class)

t = Test()
t.prt()

<main.Test instance at 0x100771878>

main.Test

从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

class Test:
def prt(runoob):
print(runoob)
print(runoob.class)

t = Test()
t.prt()

32.4 类的方法

在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。

类定义

class people:
# 定义基本属性
name = ‘’
age = 0
# 定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0

# 定义构造方法
def __init__(self, n, a, w):
    self.name = n
    self.age = a
    self.__weight = w

def speak(self):
    print("%s 说: 我 %d 岁。" % (self.name, self.age))

实例化类

p = people(‘runoob’, 10, 30)
p.speak()

runoob 说: 我 10 岁。

32.5 继承

Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。派生类的定义如下所示:

class DerivedClassName(BaseClassName1):

.

.

.

需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。

BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:

类定义

class people:
# 定义基本属性
name = ‘’
age = 0
# 定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0

# 定义构造方法
def __init__(self, n, a, w):
    self.name = n
    self.age = a
    self.__weight = w

def speak(self):
    print("%s 说: 我 %d 岁。" % (self.name, self.age))

单继承示例

class student(people):
grade = ‘’

def __init__(self, n, a, w, g):
    # 调用父类的构函
    people.__init__(self, n, a, w)
    self.grade = g

# 覆写父类的方法
def speak(self):
    print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))

s = student(‘ken’, 10, 60, 3)
s.speak()

ken 说: 我 10 岁了,我在读 3 年级

32.6 多继承

Python同样有限的支持多继承形式。多继承的类定义形如下例:

class DerivedClassName(Base1, Base2, Base3):

.

.

.

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

类定义

class people:
# 定义基本属性
name = ‘’
age = 0
# 定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0

# 定义构造方法
def __init__(self, n, a, w):
    self.name = n
    self.age = a
    self.__weight = w

def speak(self):
    print("%s 说: 我 %d 岁。" % (self.name, self.age))

单继承示例

class student(people):
grade = ‘’

def __init__(self, n, a, w, g):
    # 调用父类的构函
    people.__init__(self, n, a, w)
    self.grade = g

# 覆写父类的方法
def speak(self):
    print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))

另一个类,多重继承之前的准备

class speaker():
topic = ‘’
name = ‘’

def __init__(self, n, t):
    self.name = n
    self.topic = t

def speak(self):
    print("我叫 %s,我是一个演说家,我演讲的主题是 %s" % (self.name, self.topic))

多重继承

class sample(speaker, student):
a = ‘’

def __init__(self, n, a, w, g, t):
    student.__init__(self, n, a, w, g)
    speaker.__init__(self, n, t)

test = sample(“Tim”, 25, 80, 4, “Python”)
test.speak() # 方法名同,默认调用的是在括号中排前地父类的方法

我叫 Tim,我是一个演说家,我演讲的主题是 Python

32.7 方法重写

class Parent: # 定义父类
def myMethod(self):
print (‘调用父类方法’)

class Child(Parent): # 定义子类
def myMethod(self):
print (‘调用子类方法’)

c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child, c).myMethod() # 用子类对象调用父类已被覆盖的方法

super() 函数是用于调用父类(超类)的一个方法。

32.8 类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

类的方法

在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量

def count(self):
    self.__secretCount += 1
    self.publicCount += 1
    print (self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)

print (counter.__secretCount) # 报错,实例不能访问私有变量

类的私有方法实例如下

class Site:
def init(self, name, url):
self.name = name # public
self.__url = url # private

def who(self):
    print('name  : ', self.name)
    print('url : ', self.__url)

def __foo(self):  # 私有方法
    print('这是私有方法')

def foo(self):  # 公共方法
    print('这是公共方法')
    self.__foo()

x = Site(‘菜鸟教程’, ‘www.runoob.com’)
x.who() # 正常输出
x.foo() # 正常输出
x.__foo() # 报错

你可能感兴趣的:(python基础)