w3cschool-Python3 教程

 https://www.w3cschool.cn/python3/

Python 特点

  • 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
  • 2.易于阅读:Python代码定义的更清晰。
  • 3.易于维护:Python的成功在于它的源代码是相当容易维护的。
  • 4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。
  • 5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。
  • 6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。
  • 7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
  • 8.数据库:Python提供所有主要的商业数据库的接口。
  • 9.GUI编程:Python支持GUI可以创建和移植到许多系统调用。
  • 10.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

Python3 安装

     Unix & Linux 平台安装 Python:

     以下为在 Unix & Linux 平台上安装 Python 的简单步骤:

  • 打开 WEB 浏览器访问 https://www.python.org/downloads/source/
  • 选择适用于 Unix/Linux 的源码压缩包。
  • 下载及解压压缩包 Python-3.x.x.tgz3.x.x 为你下载的对应版本号。
  • 如果你需要自定义一些选项修改 Modules/Setup

     Windows 平台安装 Python:

     以下为在 Windows 平台上安装 Python 的简单步骤:

     MAC 平台安装 Python:

      MAC 系统一般都自带有 Python2.7 版本 的环境,你也可以在链接 https://www.python.org/downloads/mac-osx/ 上下载最新版安装。

在 Unix/Linux 设置环境变量

  • 在 csh shell: 输入 
    setenv PATH "$PATH:/w3cschool/local/bin/python"
    按下 Enter。
  • 在 bash shell (Linux) 输入 :
    export PATH="$PATH:/w3cschool/local/bin/python" 
    按下 Enter 。
  • 在 sh 或者 ksh shell 输入: 
    PATH="$PATH:/w3cschool/local/bin/python"
    按下 Enter。

注意: /w3cschool/local/bin/python 是 Python 的安装目录。

在 Windows 设置环境变量

 注意!在python安装的时候勾选自动添加python到path路径可可以免去配置环境这个过程,本教程介绍的是当在命令提示符中输入python显示指令不存在的情况下需要进行的操作。

在环境变量中添加 Python 目录:

在命令提示符中(cmd) : 输入

path=%path%;C:\Python 

按下"Enter"。

注意: C:\Python 是 Python 的安装目录。

python软件介绍

python安装完后,在开始菜单会有如下的一个文件夹:

python安装文件夹

他们分别是:

 

  • IDLE:由python之父开发的一个小型的python开发环境,可以用来解释执行python代码,也可以用来写python脚本。
  • Python:这个就是python的解释器,可以用来解释执行python代码,使用命令行调用python命令的时候就是运行的这个程序。
  • Python Manuals:这个是python的使用手册,可以用来学习python的基础使用。
  • Python Module Docs:这个是python的模块文档,可以用来学习模块的使用。

python代码执行方式

 

python代码的执行方式有两种,一种是交互型的解释执行方式,另一种是将python写成脚本代码的形式,然后使用解释器执行,两种执行方式有所不同:

交互型执行方式

这种执行方式类似人与人之间的对话,写一句代码执行一句代码。这种类型类似人的交互行为,所以被称为交互执行方式,使用这种交互方式最大的特点是:在命令行界面中有​>>>​作为每行代码的开头。如下图所示:

python解释器

接下来本手册中的代码只要是带有>>>的都是在交互型解释器中运行后的结果,没有>>>的代码都是python脚本代码。

进入交互型解释器的方式有如下几种方式:

 

  • 命令行方式:按win + r键,输入cmd,点击回车,进入命令行界面,然后输入python,点击回车,即可进入命令行界面,在命令行中输入python并按回车执行,即可进入命令行界面。
  • 运行方式:按win + r键,输入python,点击回车,即可直接进入python解释器页面。
  • 直接运行程序:安装的python中里面有一个选项是python,直接点击这个选项就可以进入python解释器。
  • IDLE:安装的python中里面有一个选项是IDLE,直接点击后进入的也是python解释器。

 

IDLE shell界面

交互型编程在代码调试中比较常见,更好的交互型编程的体验可以了解ipython或者jupyter notebook。

如何退出?

在交互型解释器中输入​exit()​按回车即可退出。

Python 3 解释器

Linux/Unix 的系统上,Python 解释器通常被安装在 /usr/local/python3 这样的有效路径(目录)里。

我们可以将路径 /usr/local/python3/bin 添加到您的 Linux/Unix 操作系统的环境变量中(最好参照您 Python 的安装路径进行添加),这样您就可以通过 shell 终端输入下面的命令来启动 Python 。

$ PATH=$PATH:/user/local/python3/bin/python #设置环境变量
$ python3 --vesion
Python 3.7.6

在 Window 系统下你可以通过以下命令来设置 Python 的环境变量,假设你的 Python 安装在 C:\Python37 下:

set path=%path%;C:\python37

Python VSCode 配置

准备工作:

  • 安装 Python 3
  • 安装 VS Code
  • 安装 VS Code Python 扩展和Pylance拓展

安装 VS Code

VSCode 安装比较简单,打开官网 https://code.visualstudio.com/,下载软件包,一步步安装即可

Python3 基础语法

 Python 保留字

保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个关键词模块,我们可以使用它来查看当前版本的所有保留字:

>>> import keyword
>>> keyword.kwlist

['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

Python3 编程第一步

接下来尝试输出变量值:

i = 1024 * 1024
print('i 的值为:', i)

end 关键字

关键字 end 可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下:

# 两个元素的总和确定了下一个数
a, b = 0, 1
while b < 1024:
    print(b, end=',')
    a, b = b, a+b

最后尝试使用 if 条件控制  

age = int(input("请输入你家狗狗的年龄: "))
print("")
if age < 0:
	print("请输入正确的年龄。")
elif age == 1:
	print("相当于 14 岁的人。")
elif age == 2:
	print("相当于 22 岁的人。")
elif age > 2:
	human = 22 + (age -2)*5
	print("对应人类年龄: ", human)
### 退出提示,本地环境下可以使用这样的退出提示使代码更易用
input('点击 enter 键退出')

Python3 基本数据类型

Python 3 中有六个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Sets(集合)
  • Dictionaries(字典)

Numbers(数字)

Python 3 支持 int(整型)、float(浮点型)、bool(布尔型)、complex(复数)。

数值类型的赋值和计算都是很直观的,就像大多数语言一样。内置的 type() 函数可以用来查询变量所指的对象类型。

>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'><class 'float'><class 'bool'><class 'complex'>

此外还可以用isinstance来判断:

>>>a=111
>>>isinstance(a,int)
True
>>>

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

注意:在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。

当你指定一个值时,Number 对象就会被创建:

var1 = 1
var2 = 10

您也可以使用 del 语句删除一些对象引用。

del 语句的语法是:

del var1[,var2[,var3[....,varN]]]

您可以通过使用 del 语句删除单个或多个对象。例如:

 

del var
del var_a, var_b

数值运算:

>>> 5 + 4  # 加法
9
>>> 4.3 - 2 # 减法
2.3
>>> 3 * 7  # 乘法
21
>>> 2 / 4  # 除法,得到一个浮点数
0.5
>>> 2 // 4 # 除法,得到一个整数
0
>>> 17 % 3 # 取余 
2
>>> 2 ** 5 # 乘方
32

注意:

  • 1、Python 可以同时为多个变量赋值,如 a, b = 1, 2。
  • 2、一个变量可以通过赋值指向不同类型的对象。
  • 3、数值的除法(/)总是返回一个浮点数,要获取整数使用​//​操作符。
  • 4、在混合计算时,Python 会把整型转换成为浮点数。

String(字符串)

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

>>> s = 'Yes,he doesn\'t'
>>> print(s, type(s), len(s))
Yes,he doesn't  <class 'str'> 14

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

>>> print('C:\some\name')
C:\some
ame
>>> print(r'C:\some\name')
C:\some\name

另外,反斜杠可以作为续行符,表示下一行是上一行的延续。还可以使用"""..."""或者'''...'''跨越多行。

字符串可以使用 + 运算符串连接在一起,或者用 * 运算符重复:

>>> print('str'+'ing', 'my'*3)
string mymymy

Python 中的字符串有两种索引方式,第一种是从左往右,从 0 开始依次增加;第二种是从右往左,从 -1 开始依次减少。

注意,没有单独的字符类型,一个字符就是长度为 1 的字符串。

>>> word = 'Python'
>>> print(word[0], word[5])
P n
>>> print(word[-1], word[-6])
n P

还可以对字符串进行切片,获取一段子串。用冒号分隔两个索引,形式为变量[头下标:尾下标]。

截取的范围是前闭后开的(头下标取,尾下标不取),并且两个索引都可以省略:

>>> word = 'ilovepython'
>>> word[1:5]
'love'
>>> word[:]
'ilovepython'
>>> word[5:]
'python'
>>> word[-10:-6]
'love'

与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如 word[0] = 'm' 会导致错误

注意:

  • 1、反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。
  • 2、字符串可以用 + 运算符连接在一起,用 * 运算符重复。
  • 3、Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
  • 4、Python 中的字符串不能改变。

List(列表)

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

列表是写在方括号之间、用逗号分隔开的元素列表。列表中元素的类型可以不相同:

>>> a = ['him', 25, 100, 'her']
>>> print(a)
['him', 25, 100, 'her']

和字符串一样,列表同样可以被索引和切片,列表被切片后返回一个包含所需元素的新列表。详细的在这里就不赘述了。

列表还支持串联操作,使用 + 操作符:

>>> a = [1, 2, 3, 4, 5]
>>> a + [6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]

与 Python 字符串不一样的是,列表中的元素是可以改变的:

>>> a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9
>>> a[2:5] = [13, 14, 15]
>>> a
[9, 2, 13, 14, 15, 6]
>>> a[2:5] = []   # 删除
>>> a
[9, 2, 6]

List 内置了有很多方法,例如 append()、pop() 等等,这在后面会讲到。

注意:

  • 1、List 写在方括号之间,元素用逗号隔开。
  • 2、和字符串一样,List 可以被索引和切片。
  • 3、List 可以使用 + 操作符进行拼接。
  • 4、List 中的元素是可以改变的。

Tuple(元组)

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

元组中的元素类型也可以不相同:

>>> a = (1991, 2014, 'physics', 'math')
>>> print(a, type(a), len(a))
(1991, 2014, 'physics', 'math') <class 'tuple'> 4

元组与字符串类似,可以被索引且下标索引从 0 开始,也可以进行截取/切片(看上面,这里不再赘述)。

其实,可以把字符串看作一种特殊的元组。

>>> tup = (1, 2, 3, 4, 5, 6)
>>> print(tup[0], tup[1:5])
1 (2, 3, 4, 5)
>>> tup[0] = 11  # 修改元组元素的操作是非法的

虽然 tuple 的元素不可改变,但它可以包含可变的对象,比如 list 列表。

构造包含 0 个或 1 个元素的 tuple 是个特殊的问题,所以有一些额外的语法规则:

tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号

另外,元组也支持用 + 操作符:

>>> tup1, tup2 = (1, 2, 3), (4, 5, 6)
>>> print(tup1+tup2)
(1, 2, 3, 4, 5, 6)

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

注意:

  • 1、与字符串一样,元组的元素不能修改。
  • 2、元组也可以被索引和切片,方法都是一样的。
  • 3、注意构造包含 0 或 1 个元素的元组的特殊语法规则。
  • 4、元组也可以使用 + 操作符进行拼接。

Sets(集合)

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

基本功能是进行成员关系测试和消除重复元素。

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

>>> student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
>>> print(student)   # 重复的元素被自动去掉
{'Jim', 'Jack', 'Mary', 'Tom', 'Rose'}
>>> 'Rose' in student  # membership testing(成员测试)
True
>>> # set可以进行集合运算
... 
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'b', 'c', 'd', 'r'}
>>> a - b     # a和b的差集
{'b', 'd', 'r'}
>>> a | b     # a和b的并集
{'l', 'm', 'a', 'b', 'c', 'd', 'z', 'r'}
>>> a & b     # a和b的交集
{'a', 'c'}
>>> a ^ b     # a和b中不同时存在的元素
{'l', 'm', 'b', 'd', 'z', 'r'}

Dictionaries(字典)

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

字典是一种映射类型(mapping type),它是一个无序的键值对(key-value)集合。

关键字(key)必须使用不可变类型,也就是说list和包含可变类型的 tuple 不能做关键字。

在同一个字典中,关键字(key)必须互不相同。

>>> dic = {}  # 创建空字典
>>> tel = {'Jack':1557, 'Tom':1320, 'Rose':1886}
>>> tel
{'Tom': 1320, 'Jack': 1557, 'Rose': 1886}
>>> tel['Jack']   # 主要的操作:通过key查询
1557
>>> del tel['Rose']  # 删除一个键值对
>>> tel['Mary'] = 4127  # 添加一个键值对
>>> tel
{'Tom': 1320, 'Jack': 1557, 'Mary': 4127}
>>> list(tel.keys())  # 返回所有key组成的list
['Tom', 'Jack', 'Mary']
>>> sorted(tel.keys()) # 按key排序
['Jack', 'Mary', 'Tom']
>>> 'Tom' in tel       # 成员测试
True
>>> 'Mary' not in tel  # 成员测试
False

构造函数 dict() 直接从键值对 sequence 中构建字典,当然也可以进行推导,如下:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'jack': 4098, 'sape': 4139, 'guido': 4127}

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

>>> dict(sape=4139, guido=4127, jack=4098)
{'jack': 4098, 'sape': 4139, 'guido': 4127}

另外,字典类型也有一些内置的函数,例如 clear()、keys()、values() 等。

注意:

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

Python3 运算符

Python 语言支持以下类型的运算符:

Python 算术运算符

以下假设变量 a 为 10,变量 b 为 21:

运算符描述实例
+ 加 - 两个对象相加 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.0//2.0 输出结果 4.0

以下实例演示了 Python 所有算术运算符的操作:

#!/usr/bin/python3
#coding=utf-8

a = 21
b = 10
c = 0

c = a + b
print ("a+b 的值为:", c)

c = a - b
print ("a-b 的值为:", c)

c = a * b
print ("a*b 的值为:", c)

c = a / b
print ("a/b 的值为:", c)

c = a % b
print ("a%b 的值为:", c)

# 修改变量 a 、b 、c
a = 2
b = 3
c = a**b 
print ("a**b 的值为:", c)

a = 10
b = 5
c = a//b 
print ("a//b 的值为:", c)

以上实例输出结果:

a+b 的值为: 31

a-b 的值为: 11

a*b 的值为: 210

a/b 的值为: 2.1

a%b 的值为: 1

a**b 的值为: 8

a//b 的值为: 2


Python 比较运算符

以下假设变量 a 为 10,变量 b 为 20:

运算符描述实例
== 等于 -- 比较对象是否相等 (a == b) 返回 False。
!= 不等于 -- 比较两个对象是否不相等 (a != b) 返回 True.
> 大于 -- 返回 x 是否大于 y (a > b) 返回 False。
< 小于 -- 返回 x 是否小于 y。 (a < b) 返回 True。
>= 大于等于 -- 返回 x 是否大于等于 y。 (a >= b) 返回 False。
<= 小于等于 -- 返回 x 是否小于等于 y。 (a <= b) 返回 True。

所有比较运算符返回 1 表示真,返回 0 表示假。这分别与特殊的变量 True 和 False 等价。注意:True和False的首字母为大写。

以下实例演示了 Python 所有比较运算符的操作:

#!/usr/bin/python3
#coding=utf-8

a = 21
b = 10
c = 0

if ( a == b ):
    print ("a 等于 b")
else:
    print ("a 不等于 b")

if ( a != b ):
    print ("a 不等于 b")
else:
    print ("a 等于 b")

if ( a < b ):
    print ("a 小于 b")
else:
    print ("a 大于等于 b")

if ( a > b ):
    print ("a 大于 b")
else:
    print ("a 小于等于 b")

# 修改变量 a 和 b 的值
a = 5;
b = 20;
if ( a <= b ):
    print ("a 小于等于 b")
else:
    print ("a 大于  b")

if ( a >= b ):
    print ("a 大于等于 b")
else:
    print ("a 小于 b")

以上实例输出结果:

a 不等于 b

a 不等于 b

a 大于等于 b

a 大于 b

a 小于等于 b

a 小于 b


Python 赋值运算符

以下假设变量 a 为 10,变量 b 为 20:

运算符描述实例
= 简单的赋值运算符 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

以下实例演示了 Python 所有赋值运算符的操作:

#!/usr/bin/python3
#coding=utf-8

a = 21
b = 10
c = 0

c = a + b
print ("1 - c 的值为:", c)

c += a
print ("2 - c 的值为:", c)

c *= a
print ("3 - c 的值为:", c)

c /= a 
print ("4 - c 的值为:", c)

c = 2
c %= a
print ("5 - c 的值为:", c)

c **= a
print ("6 - c 的值为:", c)

c //= a
print ("7 - c 的值为:", c)

以上实例输出结果:

1 - c 的值为: 31
2 - c 的值为: 52
3 - c 的值为: 1092
4 - c 的值为: 52.0
5 - c 的值为: 2
6 - c 的值为: 2097152
7 - c 的值为: 99864

Python 位运算符

按位运算符是把数字看作二进制来进行计算的。Python 中的按位运算法则如下:

下表中变量 a 为 60,b 为 13。

  按位与运算(a&b) 按位或运算(a|b)按位异或(a^b) 
 a(60)的二进制表示 0011 1100  0011 1100  0011 1100 
 b(13)的二进制表示 0000 1101 0000 1101  0000 1101 
 运算结果 0000 1100 0011 1101 0011 0001
 结果的十进制表示  12  61  49
  按位取反(~a)左移(a<<2)右移(a>>2) 
 a(60)的二进制表示 0011 1100  0011 1100  0011 1100 
 运算结果 1100 0011  1111 0000 0000 1111
 运算结果的十进制表示  -61  240  15
注:关于原码,补码和反码:
原码:假设机器字长为n,原码就是用一个n位的二进制数,其中最高位为符号位:正数是0,负数是1。剩下的表示概数的绝对值,位数如果不够就用0补全。
反码:在原码的基础上,符号位不变其他位取反,也就是就是0变1,1变0。
补码:在反码的基础上加1。  
PS:正数的原、反、补码都一样,0的原码跟反码都有两个,因为这里0被分为+0和-0。
按位取反和反码有一定的相似之处但又不尽相同(反码符号位不取反)。
在计算机中,是以补码的形式存放数据的。1100 0011刚好对应-61。(注意,-61需要使用九位来进行存储,其中八位存储数据,一位为符号位,下文的原码转反码运算可以看出第八位是用来进行数据存储的,所以不能作为符号位)
-61的原码->0011 1101->反码->1100 0010->补码->11100 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 (~a ) 输出结果 -61 ,二进制解释: 1100 0011
<< 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补 0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111

以下实例演示了 Python 所有位运算符的操作:

#!/usr/bin/python3
#coding=utf-8

a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0

c = a & b;        # 12 = 0000 1100
print ("1 - c 的值为:", c)

c = a | b;        # 61 = 0011 1101 
print ("2 - c 的值为:", c)

c = a ^ b;        # 49 = 0011 0001
print ("3 - c 的值为:", c)

c = ~a;           # -61 = 1100 0011
print ("4 - c 的值为:", c)

c = a << 2;       # 240 = 1111 0000
print ("5 - c 的值为:", c)

c = a >> 2;       # 15 = 0000 1111
print ("6 - c 的值为:", c)

以上实例输出结果:

1 - c 的值为: 12
2 - c 的值为: 61
3 - c 的值为: 49
4 - c 的值为: -61
5 - c 的值为: 240
6 - c 的值为: 15

Python 逻辑运算符

Python 语言支持逻辑运算符,以下假设变量 a 为 10, b 为 20:

运算符逻辑表达式描述实例
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

以上实例输出结果:

#!/usr/bin/python3
#coding=utf-8

a = 10
b = 20

if ( a and b ):
    print ("1 - 变量 a 和 b 都为 true")
else:
    print ("1 - 变量 a 和 b 有一个不为 true")

if ( a or b ):
    print ("2 - 变量 a 和 b 都为 true,或其中一个变量为 true")
else:
    print ("2 - 变量 a 和 b 都不为 true")

# 修改变量 a 的值
a = 0
if ( a and b ):
    print ("3 - 变量 a 和 b 都为 true")
else:
    print ("3 - 变量 a 和 b 有一个不为 true")

if ( a or b ):
    print ("4 - 变量 a 和 b 都为 true,或其中一个变量为 true")
else:
    print ("4 - 变量 a 和 b 都不为 true")

if not( a and b ):
    print ("5 - 变量 a 和 b 都为 false,或其中一个变量为 false")
else:
    print ("5 - 变量 a 和 b 都为 true")

以上实例输出结果:

1 - 变量 a 和 b 都为 true
2 - 变量 a 和 b 都为 true,或其中一个变量为 true
3 - 变量 a 和 b 有一个不为 true
4 - 变量 a 和 b 都为 true,或其中一个变量为 true
5 - 变量 a 和 b 都为 false,或其中一个变量为 false

Python 成员运算符

除了以上的一些运算符之外,Python 还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

运算符描述实例
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

以下实例演示了 Python 所有成员运算符的操作:

#!/usr/bin/python3
#coding=utf-8
a = 10
b = 20
list = [1, 2, 3, 4, 5 ];

if ( a in list ):
    print ("1 - 变量 a 在给定的列表中 list 中")
else:
    print ("1 - 变量 a 不在给定的列表中 list 中")

if ( b not in list ):
    print ("2 - 变量 b 不在给定的列表中 list 中")
else:
    print ("2 - 变量 b 在给定的列表中 list 中")

# 修改变量 a 的值
a = 2
if ( a in list ):
    print ("3 - 变量 a 在给定的列表中 list 中")
else:
    print ("3 - 变量 a 不在给定的列表中 list 中")

以上实例输出结果:

1 - 变量 a 不在给定的列表中 list 中
2 - 变量 b 不在给定的列表中 list 中
3 - 变量 a 在给定的列表中 list 中

Python 身份运算符

身份运算符用于比较两个对象的存储单元

运算符描述实例
is is 是判断两个标识符是不是引用自一个对象 x is y, 如果 id(x) 等于 id(y) , is 返回结果 True
is not is not 是判断两个标识符是不是引用自不同对象 x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 True

以下实例演示了 Python 所有身份运算符的操作:

#!/usr/bin/python3
#coding=utf-8

a = 20
b = 20

if ( a is b ):
    print ("1 - a 和 b 有相同的标识")
else:
    print ("1 - a 和 b 没有相同的标识")

if ( id(a) == id(b) ):
    print ("2 - a 和 b 有相同的标识")
else:
    print ("2 - a 和 b 没有相同的标识")

# 修改变量 b 的值
b = 30
if ( a is b ):
    print ("3 - a 和 b 有相同的标识")
else:
    print ("3 - a 和 b 没有相同的标识")

if ( a is not b ):
    print ("4 - a 和 b 没有相同的标识")
else:
    print ("4 - a 和 b 有相同的标识")

以上实例输出结果:

1 - a 和 b 有相同的标识
2 - a 和 b 有相同的标识
3 - a 和 b 没有相同的标识
4 - a 和 b 没有相同的标识

Python 运算符优先级

以下表格列出了从最高到最低优先级的所有运算符:

运算符描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 比较运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not or and 逻辑运算符

 

  •  括号因为不是运算符所以没有纳入本表,但算术式中一旦出现括号,就要先算括号内的内容。
  • 同一级运算符的优先级从左往右进行计算。

 

以下实例演示了 Python 所有运算符优先级的操作:

#!/usr/bin/python3
#coding=utf-8
a = 20
b = 10
c = 15
d = 5
e = 0

e = (a + b) * c / d       #( 30 * 15 ) / 5
print ("(a + b) * c / d 运算结果为:",  e)

e = ((a + b) * c) / d     # (30 * 15 ) / 5
print ("((a + b) * c) / d 运算结果为:",  e)

e = (a + b) * (c / d);    # (30) * (15/5)
print ("(a + b) * (c / d) 运算结果为:",  e)

e = a + (b * c) / d;      #  20 + (150/5)
print ("a + (b * c) / d 运算结果为:",  e)

以上实例输出结果:

(a + b) * c / d 运算结果为: 90.0
((a + b) * c) / d 运算结果为: 90.0
(a + b) * (c / d) 运算结果为: 90.0
a + (b * c) / d 运算结果为: 50.0

Python3 数字

Python 数字类型转换

有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。

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

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

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

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

  •  

数学函数

函数返回值 ( 描述 )
abs(x) 返回数字的绝对值,如abs(-10) 返回 10
ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5

cmp(x, y)

如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x<y) 替换
exp(x) 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x) 返回数字的下舍整数,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,...) 返回给定参数的最大值,参数可以为序列。
min(x1, x2,...) 返回给定参数的最小值,参数可以为序列。
modf(x) 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y) x**y 运算后的值。
round(x [,n])

返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。

其实准确的说是保留值将保留到离上一位更近的一端。

sqrt(x) 返回数字x的平方根。

 

随机数函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

Python包含以下常用随机数函数:

函数描述
choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random() 随机生成下一个实数,它在[0,1)范围内。
seed([x]) 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst) 将序列的所有元素随机排序
uniform(x, y) 随机生成下一个实数,它在[x,y]范围内。

 

python3 序列

在编程语言中,将以某种方式(比如通过编号)组合起来数据元素(如数字,字符串乃至其他数据结构)集合称为数据结构。在python中,最基本的数据结构为序列(sequence,简写为seq)

所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。

 

在 Python 中,​​序列类型包括字符串、列表、元组、集合和字典​​,这些序列支持以下几种通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作

字符串也是一种常见的序列(所以以下的例子以字符串作为),它也可以直接通过索引访问字符串内的字符。

序列索引

序列中,每个元素都有属于自己的编号(索引)。从起始元素开始,索引值从 0 开始递增,如图 1 所示。

 

序列索引值示意图

除此之外,Python 还支持索引值是负数,此类索引是从右向左计数,换句话说,从最后一个元素开始计数,从索引值 -1 开始,如图 2 所示。

序列切片

切片操作是访问序列中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列。
序列实现切片操作的语法格式如下:

sname[start : end : step]

其中,各个参数的含义分别是:

  • sname:表示序列的名称;
  • start:表示切片的开始索引位置(包括该位置),此参数也可以不指定,会默认为 0,也就是从序列的开头进行切片;
  • end:表示切片的结束索引位置(不包括该位置),如果不指定,则默认为序列的长度;
  • step:表示在切片过程中,隔几个存储位置(包含当前位置)取一次元素,也就是说,如果 step 的值大于 1,则在进行切片去序列元素时,会“跳跃式”的取元素。如果省略设置 step 的值,则最后一个冒号就可以省略。

例如,对字符串“W3Cschool”进行切片:

str="W3Cschool"
#取索引区间为[0,2]之间(不包括索引2处的字符)的字符串
print(str[:2])
#隔 1 个字符取一个字符,区间是整个字符串
print(str[::2])
#取整个字符串,此时 [] 中只需一个冒号即可
print(str[:])

运行结果为:

W3
WCcol
W3Cschool

序列相加

Python 中,支持两种类型相同的序列使用“+”运算符做相加操作,它会将两个序列进行连接,但不会去除重复的元素。

这里所说的“类型相同”,指的是“+”运算符的两侧序列要么都是列表类型,要么都是元组类型,要么都是字符串。

例如,前面章节中我们已经实现用“+”运算符连接 2 个(甚至多个)字符串,如下所示:

protocol = "https://"
url = "www.w3cschool.cn"
print(protocol+url)

输出结果为:

https://www.w3cschool.cn

序列相乘

Python 中,使用数字 n 乘以一个序列会生成新的序列,其内容为原来序列被重复 n 次的结果。例如:

str="W3Cschool"
print(str*3)

输出结果为:

W3CschoolW3CschoolW3Cschool

比较特殊的是,列表类型在进行乘法运算时,还可以实现初始化指定长度列表的功能。例如如下的代码,将创建一个长度为 5 的列表,列表中的每个元素都是 None,表示什么都没有。

#列表的创建用 [],可以指定长度
list = [None]*5
print(list)

输出结果为:

[None, None, None, None, None]

检查元素是否包含在序列中

Python 中,可以使用 in 关键字检查某元素是否为序列的成员,其语法格式为:

value in sequence​

其中,value 表示要检查的元素,sequence 表示指定的序列。
例如,检查字符‘C’是否包含在字符串“W3Cschool”中,可以执行如下代码:

str="W3Cschool"
print('C'in str)

运行结果为:

True

和 in 关键字用法相同,但功能恰好相反的,还有 not in 关键字,它用来检查某个元素是否不包含在指定的序列中,比如说:

str="W3Cschool"
print('A' not in str)

输出结果为:

True

和序列相关的内置函数

Python提供了几个内置函数(表 3 所示),可用于实现与序列相关的一些常用操作。

表 3 序列相关的内置函数
函数功能
len() 计算序列的长度,即返回序列中包含多少个元素。
max() 找出序列中的最大元素。注意,对序列使用 sum() 函数时,做加和操作的必须都是数字,不能是字符或字符串,否则该函数将抛出异常,因为解释器无法判定是要做连接操作(+ 运算符可以连接两个序列),还是做加和操作。
min() 找出序列中的最小元素。
list() 将序列转换为列表。
str() 将序列转换为字符串。
sum() 计算元素和。
sorted() 对元素进行排序。
reversed() 反向序列中的元素。
enumerate() 将序列组合为一个索引序列,多用在 for 循环中。

 部分序列不能应用其中的部分函数,比如字典中不能直接使用list,详细的函数介绍请参阅相应数据类型的函数介绍。

 

Python3 字符串

字符串(string,简写为str)是 Python 中最常用的数据类型之一。我们可以使用引号( ' 或 " )来创建字符串。

创建字符串很简单,只要为变量分配一个值即可。例如:

var1 = 'Hello World!' 
var2 = "W3Cschool"

Python 访问字符串中的值

Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。

Python 访问子字符串,可以使用方括号 ​[]​来截取字符串(这种方式也被称为切片),字符串的截取的语法格式如下:

变量[头下标:尾下标]

以下代码都是取字符C:

str="W3cschool"
print(str[2:3]) #使用截取方式,用正序进行截取
print(str[2:-6])#使用截取方式,正序和倒序混合使用
print(str[-7:-6])#使用截取方式,使用倒序进行截取
print(str[-7])#使用负索引获取单个字符C
print(str[2])#使用正索引获取单个字符C

Python 字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 ​%s​ 的字符串中。

在 Python 中,字符串的格式化使用与 C/C++中的printf函数有着一样的语法。

例如

#!/usr/bin/python3 
name = "小明"
age = 10
print ("我叫 %s 今年 %d 岁!" % (name, age))

python字符串格式化符号:

    符   号描述
      ​%c  格式化字符及其ASCII码
     ​ %s  格式化字符串
  ​   %d  格式化整型
      ​%u  格式化无符号整型
     ​ %o  格式化无符号八进制数
      ​%x  格式化无符号十六进制数
      ​%X  格式化无符号十六进制数(大写)
     ​ %f  格式化浮点数字,可指定小数点后的精度
     ​ %e  用科学计数法格式化浮点数
      ​%E  作用同​%e​,用科学计数法格式化浮点数
      ​%g  ​%f​和​%e​的简写
      ​%G  ​%f ​和​ %E​ 的简写
      ​%p  用十六进制数格式化变量的地址

格式化操作符辅助指令:

符号功能
* 定义宽度或者小数点精度
- 用做左对齐
+ 在正数前面显示加号( + )
<sp> 在正数前面显示空格
# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0 显示的数字前面填充'0'而不是默认的空格
% '%%'输出一个单一的'%'
(var) 映射变量(字典参数)
m.n. m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

Python 的字符串内建函数

Python 的字符串常用内建函数如下:

序号方法及描述
1

capitalize()
将字符串的第一个字符转换为大写

2

center(width, fillchar)

返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。
3

count(str, beg= 0,end=len(string))

返回 str 在 string 里面出现的次数,如果指定 beg 或者 end,则返回指定范围内 str 出现的次数
4

bytes.decode(encoding="utf-8", errors="strict")

Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。
5

encode(encoding='UTF-8',errors='strict')

以 encoding 指定的编码格式编码字符串,如果出错默认报​ValueError​异常,除非 errors 指定的是'ignore'或者'replace'
6

endswith(suffix, beg=0, end=len(string))
检查字符串是否以指定的字符串结束,如果指定了beg 或 end 则检查指定的范围内是否以指定的字符串结束,如果是,返回 True,否则返回 False.

7

expandtabs(tabsize=8)

把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 。
8

find(str, beg=0, end=len(string))

检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回-1
9

index(str, beg=0, end=len(string))

跟find()方法一样,只不过如果str不在字符串中会报一个异常。
10

isalnum()

如果字符串至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
11

isalpha()

如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False
12

isdigit()

如果字符串只包含数字则返回 True 否则返回 False..
13

islower()

如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
14

isnumeric()

如果字符串中只包含数字字符,则返回 True,否则返回 False
15

isspace()

如果字符串中只包含空白,则返回 True,否则返回 False.
16

istitle()

如果字符串是标题化的(见 title())则返回 True,否则返回 False
17

isupper()

如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
18

join(seq)

以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
19

len(string)

返回字符串长度
20

ljust(width[, fillchar])

返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。
21

lower()

转换字符串中所有大写字符为小写.
22

lstrip()

截掉字符串左边的空格或指定字符。
23

maketrans()

创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
24

max(str)

返回字符串 str 中最大的字母。
25

min(str)

返回字符串 str 中最小的字母。
26

replace(old, new [, max])

把 将字符串中的 old 替换成 new,如果 max 指定,则替换不超过 max 次。
27

rfind(str, beg=0,end=len(string))

类似于 find()函数,不过是从右边开始查找.
28

rindex( str, beg=0, end=len(string))

类似于 index(),不过是从右边开始.
29

rjust(width,[, fillchar])

返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串
30

rstrip()

删除字符串末尾的空格或指定字符。
31

split(str="", num=string.count(str))

以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
32

splitlines([keepends])

按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
33

startswith(substr, beg=0,end=len(string))

检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。
34

strip([chars])

在字符串上执行 lstrip()和 rstrip()
35

swapcase()

将字符串中大写转换为小写,小写转换为大写
36

title()

返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
37

translate(table, deletechars="")

根据 str 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中
38

upper()

转换字符串中的小写字母为大写
39

zfill (width)

返回长度为 width 的字符串,原字符串右对齐,前面填充0
40

isdecimal()

检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。

 

Python3 列表

列表(list)也是最常用的 Python 数据类型之一,它以一个方括号内包含多个其他数据项(字符串,数字等甚至是另一个列表),数据项间以逗号作为分隔的数据类型。

列表的数据项不需要具有相同的类型。(这点是与其他语言的数组的一个区别)

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

list1 = ['Google', 'W3Cschool', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]
print ("list1: ", list1)
print ("list2: ", list2)

 

Python列表脚本操作符

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

如下所示:

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 迭代

Python列表截取与拼接

Python的列表截取与字符串操作类似,如下所示:

L=['Google', 'W3Cschool', 'Taobao']

操作:

Python 表达式结果描述
L[2] 'Taobao' 读取第三个元素
L[-2] 'W3Cschool' 从右侧开始读取倒数第二个元素
L[1:] ['W3Cschool', 'Taobao'] 输出从第二个元素开始后的所有元素

 

Python列表函数&方法

Python列表包含以下函数:

序号函数
1 len(list)
列表元素个数
2 max(list)
返回列表元素最大值
3 min(list)
返回列表元素最小值
4 list(seq)
将序列(元组,集合等)转换为列表

Python列表包含以下方法:

序号方法
1 list.append(obj)
在列表末尾添加新的对象
2 list.count(obj)
统计某个元素在列表中出现的次数
3 list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4 list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5 list.insert(index, obj)
在列表的index的地方插入一个对象
6 list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7 list.remove(obj)
移除列表中某个值的第一个匹配项
8 list.reverse()
反向排列列表中元素
9 list.sort( key=None, reverse=False)
对原列表进行排序
10 list.clear()
清空列表
11 list.copy()
复制列表

 

Python3 元组

Python 的元组(tuple,简写为tup)与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号​()​,列表使用方括号​[]​。

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

如下实例:

tup1 = ('Google', 'W3CSchool', 1997, 2020)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d" # 不需括号也可以
print(type(tup3))

元组运算符

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

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, 1 2 3 迭代

 

Python3 字典

键必须是唯一的,但值则不必(上表中Danna和Alice的键是不同的,值却是相同的)。

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

一个简单的字典实例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

也可如此创建字典:

dict1 = { 'abc': 456 }
dict2 = { 'abc': 123, 98.6: 37 }

字典内置函数&方法

Python 字典包含了以下内置函数:

序号函数及描述实例
1 len(dict)
计算字典元素个数,即键的总数。
>>> dict = {'Name': 'W3CSchool', 'Age': 7, 'Class': 'First'}
>>> len(dict)
3
2 str(dict)
以可打印的字符串输出字典。
>>> dict = {'Name': 'W3CSchool', 'Age': 7, 'Class': 'First'}
>>> str(dict)
"{'Name': 'W3CSchool', 'Class': 'First', 'Age': 7}"
3 type(variable)
返回输入的变量类型,如果变量是字典就返回字典类型。
>>> dict = {'Name': 'W3CSchool', 'Age': 7, 'Class': 'First'}
>>> type(dict)
<class 'dict'>

Python 字典包含了以下内置方法:

序号函数及描述
1 radiansdict.clear()
删除字典内所有元素
2 radiansdict.copy()
返回一个字典的浅复制
3 radiansdict.fromkeys()
创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
4 radiansdict.get(key, default=None)
返回指定键的值,如果值不在字典中返回default值
5 key in dict
如果键在字典dict里返回true,否则返回false
6 radiansdict.items()
以列表返回可遍历的(键, 值) 元组数组
7 radiansdict.keys()
以列表返回一个字典所有的键
8 radiansdict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9 radiansdict.update(dict2)
把字典dict2的键/值对更新到dict里
10 radiansdict.values()
以列表返回字典中的所有值

 

Python3 集合

集合(set)是一个无序的不重复元素序列。因此在每次运行的时候集合的运行结果的内容都是相同的,但元素的排列顺序却不是固定的,所以本章中部分案例的运行结果会出现与给出结果不同的情况(运行结果不唯一)。

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

创建格式:

parame = {value01,value02,...}
或者
set(value)

 

a-b(a集合中b没有的元素)  b          
 集合a  b  a      
 a|b(并集)  b  a
 集合b        a  l
 a&b(交集)        a      
 a^b(不同时包含于a和b的元素)    

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

 

集合内置方法完整列表

方法描述
add() 为集合添加元素
clear() 移除集合中的所有元素
copy() 拷贝一个集合
difference() 返回多个集合的差集
difference_update() 移除集合中的元素,该元素在指定的集合也存在。
discard() 删除集合中指定的元素
intersection() 返回集合的交集
intersection_update() 返回集合的交集。
isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
issubset() 判断指定集合是否为该方法参数集合的子集。
issuperset() 判断该方法的参数集合是否为指定集合的子集
pop() 随机移除元素
remove() 移除指定元素
symmetric_difference() 返回两个集合中不重复的元素集合。
symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
union() 返回两个集合的并集
update() 给集合添加元素

 

Python3 条件控制

另一种常见的用法是:

if condition_1:
    statement_block_1
else:
    statement_block_2

Python 中用 elif 代替了else if,所以if语句的关键字为:if – elif – else。

if condition_1:
    statement_block_1
elif condition_2:
    statement_block_2
else:
    statement_block_3

match-case语句的结构一般如下所示:

match variable: #这里的variable是需要判断的内容
    case ["quit"]: 
        statement_block_1 # 对应案例的执行代码,当variable="quit"时执行statement_block_1    case ["go", direction]: 
        statement_block_2
    case ["drop", *objects]: 
        statement_block_3
    ... # 其他的case语句
    case _: #如果上面的case语句没有命中,则执行这个代码块,类似于Switch的default
        statement_block_default

 

Python3 循环

2022-01-12 10:19 更新

本章节将为大家介绍 Python 循环语句的使用。

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

Python 循环语句的控制结构图如下所示:


while 循环

Python 中 while 语句的一般形式:

while 判断条件:
    statements

同样需要注意冒号和缩进。另外,在Python中没有 do-while 循环。

以下实例使用了 while 来计算 1 到 100 的总和:

#!/usr/bin/env python3
n = 100
sum = 0
counter = 1
while counter <= n:
    sum = sum + counter     
    counter += 1  
print('Sum of 1 until %d: %d' % (n,sum)) 

执行结果如下:

Sum of 1 until 100: 5050

for 语句

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

for 循环的一般格式如下:

for <variable> in <sequence>:
  <statements>
else:
 <statements>

Python for循环实例:

>>> languages = ["C", "C++", "Perl", "Python"] 
>>> for x in languages:
...     print (x)
... 
C
C++
Perl
Python
>>> 

以下 for 实例中使用了 break 语句,break 语句用于跳出当前循环体:

#!/usr/bin/env python3
edibles = ["ham", "spam","eggs","nuts"]
for food in edibles:
    if food == "spam":
        print("No more spam please!")
        break
    print("Great, delicious " + food)
else:
    print("I am so glad: No spam!")
print("Finally, I finished stuffing myself")

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

break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。

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

循环语句可以有 else 子句;它在穷尽列表(以 for 循环)或条件变为假(以 while 循环)循环终止时被执行,但

Python3 迭代器与生成器

迭代器

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

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

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

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

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

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

Python3 函数

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

 

Python3 数据结构

列表

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

将列表当作队列使用

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

>>> 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
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham']) 

Python3 模块

 

模块是一个包含所有你定义的函数和变量的文件,其后缀名是 .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 解释器自动查找所需模块的路径的列表。

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

比如一个模块的名称是 A.B, 那么他表示一个包 A 中的子模块 B 。

用户可以每次只导入一个包里面的特定模块,比如:

import sound.effects.echo

Python3 输入和输出

输出格式美化

Python 两种输出值的方式: 表达式语句和 print() 函数。(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以用 sys.stdout 引用。)

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

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

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

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

读和写文件

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

open(filename, mode)

实例:

>>> f = open('/tmp/workfile', 'w')
  • 第一个参数为要打开的文件名。
  • 第二个参数描述文件如何使用的字符。 mode 可以是 'r' 如果文件只读, 'w' 只用于写 (如果存在同名文件则将被删除), 和 'a' 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. 'r+' 同时用于读写。 mode 参数是可选的; 'r' 将是默认值。

文件对象的方法

本节中剩下的例子假设已经创建了一个称为 f 的文件对象。

f.read()

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

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

>>> f.read()
'This is the entire file.\n'
>>> f.read()
''

f.readline()

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

>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''

f.readlines()

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

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

>>> f.readlines()
['This is the first line of the file.\n', 'Second line of the file\n']

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

>>> for line in f:
...     print(line, end='')
...
This is the first line of the file.
Second line of the file

这个方法很简单, 但是并没有提供一个很好的控制。 因为两者的处理机制不同, 最好不要混用。

f.write()

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

>>> f.write('This is a test\n')
15

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

>>> value = ('the answer', 42)
>>> s = str(value)
>>> f.write(s)
18

f.tell()

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

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/workfile', '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'

 

f.close()

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

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

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 对应的文件, 所以它最大不能超过文件大小。
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]])

返回唯一的路径名用于创建临时文件。
57

os.tmpfile()

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

os.tmpnam()

为创建一个临时文件返回一个唯一的路径。
59

os.ttyname(fd)

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

os.unlink(path)

删除文件路径。
61

os.utime(path, times)

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

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

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

os.write(fd, str)

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

 

Python3 错误和异常

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

Python3 面向对象

Python3 面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例图,Dog 是一个 Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。

Python 中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

对象可以包含任意数量和类型的数据。

类对象

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

属性引用使用和 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())

 

类的方法

在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数:

#!/usr/bin/python3

#类定义
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('W3Cschool',10,30)
p.speak()

继承

实例

#!/usr/bin/python3

#类定义
class people:

#单继承示例
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()

多继承

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

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N 

方法重写

如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:

#!/usr/bin/python3

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

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

 

类属性与方法

类的私有属性

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

类的方法

在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数

类的私有方法

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

实例如下:

#!/usr/bin/python3

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)  # 报错,实例不能访问私有变量

 

类的专有方法:

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 打印,转换
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__: 获得长度
  • __cmp__: 比较运算
  • __call__: 函数调用
  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __div__: 除运算
  • __mod__: 求余运算
  • __pow__: 乘方

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 被重定向时,后者也可以用于显示警告和错误信息。

>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one

大多脚本的定向终止都使用 "sys.exit()"。


字符串正则匹配

re 模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案:

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

如果只需要简单的功能,应该首先考虑字符串方法,因为它们非常简单,易于阅读和调试:

>>> 'tea for too'.replace('too', 'two')
'tea for two'

数学

math 模块为浮点运算提供了对底层 C 函数库的访问:

>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0

random 提供了生成随机数的工具。

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from range(6)
4

访问 互联网

有几个模块用于访问互联网以及处理网络通信协议。其中最简单的两个是用于处理从 urls 接收的数据的 urllib.request 以及用于发送电子邮件的 smtplib:

>>> from urllib.request import urlopen
>>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     line = line.decode('utf-8')  # Decoding the binary data to text.
...     if 'EST' in line or 'EDT' in line:  # look for Eastern Time
...         print(line)

<BR>Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()

注意第二个例子需要本地有一个在运行的邮件服务器。


日期和时间

datetime 模块为日期和时间处理同时提供了简单和复杂的方法。

支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。

该模块还支持时区处理:

>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

数据压缩

以下模块直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile。

>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

性能度量

有些用户对了解解决同一问题的不同方法之间的性能差异很感兴趣。Python 提供了一个度量工具,为这些问题提供了直接答案。

例如,使用元组封装和拆封来交换元素看起来要比使用传统的方法要诱人的多,timeit 证明了现代的方法更快一些。

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

相对于 timeit 的细粒度,:mod:profile 和 pstats 模块提供了针对更大代码块的时间度量工具。


测试模块

开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试

doctest 模块提供了一个工具,扫描模块并根据程序中内嵌的文档字符串执行测试。

测试构造如同简单的将它的输出结果剪切并粘贴到文档字符串中。

通过用户提供的例子,它强化了文档,允许 doctest 模块确认代码的结果是否与文档一致:

def average(values):
    """Computes the arithmetic mean of a list of numbers.

    >>> print(average([20, 30, 70]))
    40.0
    """
    return sum(values) / len(values)

import doctest
doctest.testmod()   # 自动验证嵌入测试

unittest 模块不像 doctest 模块那么容易使用,不过它可以在一个独立的文件里提供一个更全面的测试集:

import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        self.assertRaises(ZeroDivisionError, average, [])
        self.assertRaises(TypeError, average, 20, 30, 70)

unittest.main() # Calling from the command line invokes all tests

 

 

 

 

 

 

 

posted @ 2022-03-05 20:43  hanease  阅读(218)  评论(0编辑  收藏  举报