https://www.runoob.com/python3/python3-tutorial.htm

语言特点
Python语言的关键字比较少,它没有分号、begin、end等标记,代码块使用空格或制表符缩进的方式来分隔。Python与JavaScript、PHP、Perl等语言类似,它不需要另外声明变量、直接赋值即可创建一个新的变量。Python的变量创建后会对应一种类型,它可根据赋值表达式的内容决定变量的类型。Python在内部建立了管理这些变量的机制,不同类型的变量需要类型转换。Python语言应用于数据库、网络、图形图像、数学计算、Web开发、操作系统扩展等领域。有许多第三方库支持Python。Python 3发布于2008年底,是一次重大的升级。Python 3的有些改进不向后与Python 2兼容,因此Python 2始终与Python 3并行地向前发展。全面了解Python 3和Python 2之间的差异,可参阅What’s New in Python 3.0(http://docs.python.org/3/whatsnew/3.0.html)。工具2to3(http://docs.python.org/3/library/2to3.html)几乎能将任何Python 2程序自动转换为等价的Python 3程序。
注释:单行: #开头。多行:每行使用#。文档注释:使用三个引号包括起来(”””文档注释”””)。注释必须跟在定义体下面,不能在任意位置。
Python的缺点:运行速度慢(运行速度的瓶颈往往不在于Python代码,而是数据库的操作和网络调用);Python源码不能加密。
命名规则
保留词不可以用作变量名
and elif global or with
as else if pass yield
assert except import print
break exec in raise
class FALSE is return
continue finally lambda try
def for not TRUE
del from None while
end 可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例:

#!/usr/bin/python3
 
# Fibonacci series: 斐波纳契数列
# 两个元素的总和确定了下一个数
a, b = 0, 1
while b < 1000:
    print(b, end=',')
    a, b = b, a+b

输出结果
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
变量名、模块名、包名
通常采用小写,可使用下划线。例如:
rulemodule.py #模块名,即文件名
_rule=’rule information’ #_rule变量名,通常前缀有一个下划线的变量名为全局变量
类名、对象名
类首字母采用大写;
类中的方法名首字母小写,其后的每个单词的首字母大写;
对象名(类的实例)采用小写;
类外引用其属性和方法名时,以对象名作为前缀。
类的私有变量、私有方法以两个下划线作为前缀。
函数名
函数名通常采用小写,并用下划线或单词首字母大写增加名称的可读性。
导入的函数以模块名作前缀。
下例中,为演示导入函数前缀写法,使用了生成随机数的模块random。该模块有一个函数randrange(),该函数可以根据给定的数字范围生成随机数。其声明为:
randrange(start, stop[,step])
说明:
参数start表示生成随机数所在范围的开始数字。
参数stop表示生成随机数所在范围的结束数字,但不包括数字stop。
参数step表示步长。生成的随机数在[start, stop-1]的范围内,取值等于start+step。
运算
三类运算符的优先级:算术运算符优先级最高;关系运算符优先级次之;逻辑运算符优先级最低。以下表格列出了从最高到最低优先级的所有运算符:
运算符 描述
** 指数 (最高优先级)
~ + – 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ – 加法减法
>> << 右移,左移运算符
& 位 ‘AND’
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符

算术运算符和算术表达式
整数运算
加 + 减 – 乘 * 除 / 整除 // 求余 % 乘方 **
运算顺序:Python算术运算的规则与常规算术的规则相同。长度不受限制:与其他大多数编程语言不同,Python对整数的长度没有限制,可以执行数十位甚至数百数千位的整数运算。
浮点数运算
在Python中,浮点数是带小数点的数字。例如:-3.1、2.999和-4.0都是浮点数。所有适合用于整数的算术运算符都可用于浮点数,包括%(求余)和//(整除)
关系运算符和关系表达式
关系运算符 关系表达式 描述 优先级
< x<y 小于 优先级相等;但优先级大于==和!=
> x>y 大于
<= x<=y 小于等于
>= x>=y 大于等于
== x==y 等于 优先级相等
!= x!=y 不等于
逻辑运算符和逻辑表达式
逻辑运算符 逻辑表达式 描述 优先级
and x and y 逻辑与,当x为True时,才计算y 优先级相等
or x or y 逻辑或,当x为False时,才计算y
not not x 逻辑非 优先级大于and和or
基本逻辑运算符的真值表
p q p and q p or q not p
FALSE FALSE FALSE FALSE TRUE
FALSE TRUE FALSE TRUE TRUE
TRUE FALSE FALSE TRUE FALSE
TRUE TRUE TRUE TRUE FALSE
赋值运算符
运算符 描述 实例
= 简单的赋值运算符 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
位运算符
运算符 描述 实例
& 按位与运算符:参与运算的两个值,如果两个相应位都为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
成员运算符
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
运算符 描述 实例
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
身份运算符
运算符 描述 实例
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。
python的执行
python在执行时,首先会将.py文件中的源代码编译成python的byte code(字节码),然后再由python Virtual Machine(python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,python Virtual Machine与Java或.NET的Virtual Machine不同的是,python的Virtual Machine是一种更高级的Virtual Machine,和Java或.NET相比,python的Virtual Machine距离真实机器的距离更远。或者可以这么说,python的Virtual Machine是一种抽象层次更高的Virtual Machine。
PHYTHON的基本语法
python是一门解释型语言,因为不需要编译和链接的时间,它可以帮你省下一些开发时间。解释器可以交互式使用,这样就可以很方便的测试语言中的各种功能,以便于编写发布用的程序,或者进行自下而上的开发。还可以当它是一个随手可用的计算器。
python可以写出很紧凑和可读性很强的程序。用python写的程序通常比同样的C或C++程序要短得多,这是因为以下几个原因:
高级数据结构使你可以在一个单独的语句中表达出很复杂的操作;
语句的组织依赖于缩进,而不是begin/end块;
不需要变量或参数声明。
调用解释器
通常python的解释器被安装在目标机器的/usr/local/bin/python 目录下;把/usr/local/bin 目录放进你的UNIXShell的搜索路径里,确保它可以通过输入python来启动。输入一个文件结束符(UNIX上是Ctrl+D,Windwos上是Ctrl+Z)解释器会以0值退出(就是说,没有什么错误,正常退出--译者)
参数传递
调用解释器时,脚本名和附加参数之间会传入一个名为sys.argv的字符串列表。没有脚本和参数时,它至少也有一个元素:sys.argv[0]此时为空字符串。脚本名指定为‘-’(表示标准输入)时,sys.argv[0]被设置为‘-’,使用-c 指令时,sys.argv[0]被设定为‘-c ’。-c 命令之后的参数不会被python 解释器的选项处理机制所截获,而是留在sys.argv中,供脚本命令操作。
交互模式
从tty读取命令时,我们称解释器工作于交互模式。这种模式下它根据主提示符来执行,主提示符通常标识为三个大于号(“>>> ”);继续的部分被称为从属提示符,由三个点标识(“…”)。在第一行之前,解释器打印欢迎信息、版本号和授权提示:
python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32
Type “copyright”, “credits” or “license()” for more information.
>>>
错误处理
有错误发生时,解释器打印一个错误信息和栈跟踪(监视)器。交互模式下,它返回主提示符,如果从文件输入执行,它在打印栈跟踪器后以非零状态退出。(异常可以由try语句中的except子句来控制,这样就不会出现上文中的错误信息)有一些非常致命的错误会导致非零状态下退出,这由通常由内部矛盾和内存溢出造成。所有的错误信息都写入标准错误流;命令中执行的普通输出写入标准输出。在主提示符或附属提示符输入中断符(通常是Control-C or DEL)就会取消当前输入,回到主命令行。
执行python脚本
python脚本可以像Shell脚本那样直接执行,只要在脚本文件开头写一行命令,指定文件和模式:
#! /usr/bin/env python
“#!”必须是文件的前两个字符,目的是将程序路径通知解释器,在某些平台上,第一行必须以Unix风格的行结束符(“\n”)结束,不能用Mac(“\r”)或Windows(“\r\n”)的结束符。注意,“#”是python中是行注释的起始符。
脚本可以通过chmod命令指定执行模式和许可权。
$ chmod +x myscript.py
输入输出标志
区分输入和输出的方法是看是否有提示符(“>>> ”和“…”),想要重复这些例子的话,你就要在提示符显示后输入所有的一切;没有以提示符开始的行,是解释器输出的信息。需要注意的是示例中的从属提示符用于多行命令的结束,它表示你需要输入一个空行。
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=””:
print( x, end=” ” )
python中的注释以符号“#”起始,一直到当前行的结尾。注释可能出现在一行的开始,也可能跟在空格或程序代码之后,但不会出现在字符串中,字符串中的#号只代表#号。
数据类型
Python3 中有六个标准的数据类型:
Number(数字)
String(字符串)
List(列表)
Tuple(元组)
Set(集合)
Dictionary(字典)
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
Python中,字符串、列表和元组都属于序列。序列有一些通用的操作。包括:索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)、检查某个元素是否属于序列的成员(成员资格)、计算序列长度、找出最大元素和最小元素等。
元组相当于“只读”的数组,列表可以作为可变长度的数组使用,字典相当于Java中的HashTable类型。
内置的 type() 函数可以用来查询变量所指的对象类型。此外还可以用 isinstance 来判断。isinstance 和 type 的区别在于:type()不会认为子类是一种父类类型。isinstance()会认为子类是一种父类类型。
数据类型转换:有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数 描述
int(x [,base]) 将x转换为一个整数
float(x) 将x转换到一个浮点数
complex(real [,imag]) 创建一个复数
str(x) 将对象 x 转换为字符串
repr(x) 将对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 将序列 s 转换为一个元组
list(s) 将序列 s 转换为一个列表
set(s) 转换为可变集合
dict(d) 创建一个字典。d 必须是一个 (key, value)元组序列。
frozenset(s) 转换为不可变集合
chr(x) 将一个整数转换为一个字符
ord(x) 将一个字符转换为它的整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串
数值
解释器的行为就像是一个计算器。你可以向它输入一个表达式,它会返回结果。表达式的语法简明易懂:+,-,*,/和大多数语言中的用法一样(比如C或Pascal),括号用于分组。例如:

>>> 2+2
4
>>> (50-5*6)/4
5

等号(“=”)用于给变量赋值,被分配的值是只读的。

>>> width = 20
>>> height = 5*9
>>> width * height
900

同一个值可以同时赋给几个变量(多重赋值):

>>> x = y = z = 0 
>>>x,y,z=1,’two’,3.0
>>> x
0

Python有四种类型的数字,整数、长整数、浮点数和复数。当指定一个值时,Number 对象就会被创建:
var1 = 1
var2 = 10
可以使用del语句删除一些对象引用。del语句的语法是:
del var1[,var2[,var3[….,varN]]]
可以通过使用del语句删除单个或多个对象。例如:
del var
del var_a, var_b
Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示,复数的实部a和虚部b都是浮点型。
数学函数
函数 返回值 ( 描述 )
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]范围内。
三角函数
函数 描述
acos(x) 返回x的反余弦弧度值。
asin(x) 返回x的反正弦弧度值。
atan(x) 返回x的反正切弧度值。
atan2(y, x) 返回给定的 X 及 Y 坐标值的反正切值。
cos(x) 返回x的弧度的余弦值。
hypot(x, y) 返回欧几里德范数 sqrt(x*x + y*y)。
sin(x) 返回的x弧度的正弦值。
tan(x) 返回x弧度的正切值。
degrees(x) 将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x) 将角度转换为弧度
数学常量
常量 描述
pi 数学常量 pi(圆周率,一般以π来表示)
e 数学常量 e,e即自然常数(自然常数)。
字符串(string)
在Python中,字符串是除数字外最重要的数据类型。字符串无处不在:将字符串输出到屏幕上;从用户的键盘输入读取字符串;文件通常被视为大型字符串;网页大部分是由文本组成的。
字符串是一种聚合数据结构,可充分利用索引和切片—用于从字符串中提取子串。而Python正则表达式库,是一种用来处理字符串的微型语言,但功能强大。
python还可以通过几种不同的方法操作字符串。字符串用单引号或双引号标识:

>>> 'spam eggs'
'spam eggs'
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'

Python 使用反斜杠(\)转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串。另外,反斜杠(\)可以作为续行符,表示下一行是上一行的延续。也可以使用 “””…””” 或者 ”’…”’ 跨越多行。注意,Python 没有单独的字符类型,一个字符就是长度为1的字符串。与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = ‘m’会导致错误。
字符串可以用+运算符连接在一起,用*运算符重复。
替换函数
Python字符串自带了两个替换函数:
函数名 返回的字符串
s.replace(old,new) 将s中的每个old替换为new
s.expandtabs(n) 将s中的每个制表符扩展为空格,空格宽度为n
拆分函数
将字符串拆分成多个子串:
函数 返回的字符串
s.partition(t) 将s拆分为三个字符串(head、t和tail),其中head为t前面的子串,tail为t后面的子串。返回值为元组
s.rpartition(t) 与partition相同,但从s的右端开始搜索t。返回值为元组
s.split(t) 以t为分隔符,将s划分成一系列子串,并返回一个由这些子串组成的列表
s.rsplit(t) 与split相同,但从s的右端开始搜索t
s.splitlines() 返回一个由s中的各行组成的列表
改变大小写函数
函数名 返回的字符串
s.capitalize() 将s[0]改为大写,其余小写
s.lower() 让s的所有字母都小写
s.upper() 让s的所有字母都大写
s.swapcase() 将小写字母改为大写,并将大写字母改为小写
s.title() 让s的大小写符合标题的要求
常用函数
包括上面列出的函数
序号 方法及描述
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))
检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 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])
把 将字符串中的 str1 替换成 str2,如果 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))
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。
转义字符:在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符。如下表:
转义字符 描述
\(在行尾时) 续行符
\\ 反斜杠符号
\’ 单引号
\” 双引号
\a 响铃
\b 退格(Backspace)
\000 空
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。
\xyy 十六进制数,yy代表的字符,例如:\x0a代表换行
\other 其它的字符以普通格式输出
字符串运算符:下表实例变量a值为字符串 “Hello”,b变量值为 “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’ )
% 格式字符串
字符串格式化
Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。
符   号 描述
%c  格式化字符及其ASCII码
%s  格式化字符串
%d  格式化整数
%u  格式化无符号整型
%o  格式化无符号八进制数
%x  格式化无符号十六进制数
%X  格式化无符号十六进制数(大写)
%f  格式化浮点数字,可指定小数点后的精度
%e  用科学计数法格式化浮点数
%E  作用同%e,用科学计数法格式化浮点数
%g  %f和%e的简写
%G  %f 和 %E 的简写
%p  用十六进制数格式化变量的地址

None类型
None类型是一个特殊的常量,表示出错。
逻辑表达式:python中没有boolean类型,除了0以外,其他都是真。但是python中‘假’有很多种,包括None,0,0.0,“”(空字符串) ,[](空list),()(空元祖),{}(空字典)。
python中的逻辑运算符有:and , or , not
链表(列表list)
列表是Python中非常重要的数据类型,通常作为函数的返回类型。列表和元组相似,也是由一组元素组成。列表可包含任何类型的值:数字、字符串甚至序列。列表与元组的重要差别是列表是可变的,即可以在不复制的情况下添加、删除或修改列表元素。列表的创建,格式:
list=[元素1,元素2,…元素n] #定义n个元素组成的列表
list=[] #定义空列表
list=[x] #定义只包含一个元素的列表,与元组不同,最后的逗号不是必须的
说明:列表用方括号括起,其中元素用逗号分隔
python 已经有了几个复合数据类型,用于组织其它的值。最通用的是链表,它写为中括号之间用逗号分隔的一列值(子项),链表的子项不一定是同一类型的值。

>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]

链表也以零开始,可以被切片,联接,等等:

>>> a = ['spam', 'eggs', 100, 1234]
>>> a[0]
'spam‘
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
$$$
#!/usr/bin/python3
 
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) # 连接列表
Python 列表截取可以接收第三个参数,参数作用是截取的步长,以下实例在索引 1 到索引 4 的位置并设置为步长为 2(间隔一个位置)来截取字符串:如果第三个参数为负数表示逆向读取,以下实例用于翻转字符串:
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)

常用列表函数
函数 返回值
s.append(x) 在列表s末尾处添加元素x
s.count(x) 返回元素x在列表中出现的次数
s.extend(lst) 将lst的所有元素都添加到列表s末尾
s.index(x) 返回第一个x元素的索引
s.insert(i,x) 将元素x插入到索引i指定的元素前面,结果是s[i]=x
s.pop(i) 删除并返回s中索引为i的元素
s.remove(x) 删除s中的第一个x元素
s.reverse(x) 反转s中元素的排列顺序
s.sort() 将s的元素按升序排列
列表函数与方法
包括上面的部分函数
序号 函数
1 len(list)
列表元素个数
2 max(list)
返回列表元素最大值
3 min(list)
返回列表元素最小值
4 list(seq)
将元组转换为列表
序号 方法
1 list.append(obj)
在列表末尾添加新的对象
2 list.count(obj)
统计某个元素在列表中出现的次数
3 list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4 list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5 list.insert(index, obj)
将对象插入列表
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()
复制列表
列表脚本操作符
列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
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的列表截取与字符串操作类型,如下所示:

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

Python 表达式 结果 描述
L[2] ‘Taobao’ 读取第三个元素
L[-2] ‘Runoob’ 从右侧开始读取倒数第二个元素: count from the right
L[1:] [‘Runoob’, ‘Taobao’] 输出从第二个元素开始后的所有元素
嵌套列表
使用嵌套列表即在列表里创建其它列表,例如:
序号 函数
1 len(list)
列表元素个数
2 max(list)
返回列表元素最大值
3 min(list)
返回列表元素最小值
4 list(seq)
将元组转换为列表
元组(Tuples)
元组是一种不可变序列,即创建之后不能再做任何修改。元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组。元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串、数字甚至元组。元组通常代表一行数据,而元组中的元素代表不同的数据项。构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则。
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
元组的创建,格式:
tuple=(元素1,元素2,…元素n) #定义n个元素组成的元组
tuple=() #定义空元组
tuple=(元素1,) #定义单元素元组
一个元组由数个逗号分隔的值组成,元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号都可以,不过经常括号都是必须的(如果元组是一个更大的表达式的一部分)。

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>>u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

元组运算符
与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。
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 迭代
元组索引,截取
因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:
L = (‘Google’, ‘Taobao’, ‘Runoob’)
Python 表达式 结果 描述
L[2] ‘Runoob’ 读取第三个元素
L[-2] ‘Taobao’ 反向读取;读取倒数第二个元素
L[1:] (‘Taobao’, ‘Runoob’) 截取元素,从第二个开始后的所有元素。
内置函数
序号 方法及描述 实例
1 len(tuple) 计算元组元素个数。

>>> tuple1 = ('Google', 'Runoob', 'Taobao')
>>> len(tuple1)
3

2 max(tuple)

返回元组中元素最大值。 >>> tuple2 = (‘5’, ‘4’, ‘8’)
>>> max(tuple2)
‘8’
3 min(tuple)
返回元组中元素最小值。 >>> tuple2 = (‘5’, ‘4’, ‘8’)
>>> min(tuple2)
‘4’
4 tuple(seq)
将列表转换为元组。 >>> list1= [‘Google’, ‘Taobao’, ‘Runoob’, ‘Baidu’]
>>> tuple1=tuple(list1)
>>> tuple1
(‘Google’, ‘Taobao’, ‘Runoob’, ‘Baidu’)
字典(Dictionaries)
字典是Python重要的数据类型,字典是由“键—值”对组成的集合,字典中的“值”通过“键”来引用。
字典也称为关联数组、映射或散列表。
Python字典利用了“散列”方法,使用专门的散列函数完成,即字典中的每个键都被转换为一个数字—散列值。字典中值存储在一个底层列表中,并用散列值作为索引。访问值时,将提供的键转为散列值,再跳到列表的相应位置。使用“键”来访问字典值效率极高。另外与列表一样,字典也是可以改变的:可以添加、删除或修改“键—值”对。创建字典,格式:
dictionary={key1:value1, key2:value2, …, keyn:valuen)}#创建n个“键—值”对组成的字典
dictionar={} #创建空字典
注意,对于字典的键有两个限制:字典中的键必须独一无二,即在同一个字典中,任何两个键—值对都不能相同;键必须是不可变的。因此,字典键不能是列表、字典,对值没有这两个限制。
>>> tel= {‘jack’: 4098, ‘sape’: 4139}
>>> tel[‘guido’] = 4127
>>> tel
{‘sape’: 4139, ‘guido’: 4127, ‘jack’: 4098}
字典的访问:字典的访问与元组、列表有所不同,元组和列表是通过数字索引获取对应的值,而字典是通过key值获取相应的value值。格式:
value=dict[key]
说明:字典的添加、删除和修改只需执行一条赋值语句即可,例如:dict[’x’]=’value’,字典没有remove操作。删除字典元素可调用内置函数del()完成。
del dict[‘Name’] # 删除键 ‘Name’
dict.clear() # 清空字典
del dict # 删除字典

#!/usr/bin/python3
 
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()) # 输出所有值

构造函数 dict() 可以直接从键值对序列中构建字典以及示例中的其他构造方法:

>>>dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])
{'Taobao': 3, 'Runoob': 1, 'Google': 2}
 
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
 
>>> dict(Runoob=1, Google=2, Taobao=3)
{'Runoob': 1, 'Google': 2, 'Taobao': 3}

字典函数
函数名 返回的值
d.item() 返回一个由字典d的键—值对(key,value)组成的视图(view)
d.keys() 返回一个由字典d的键组成的视图
d.value() 返回一个有字典d的值组成的视图
d.get(key) 返回与key相关联的值
d.pop(key) 删除键key并返回与之相关联的值
d.popitem() 删除字典d中某个键—值对并返回相应的键—值对
d.clear() 删除字典d的所有元素
d.copy() 复制字典d
d.fromkeys(s,t) 创建一个新字典,其中的键来自s,值来自t
d.setdefault(key,v) 如果键key包含在字典d中,则返回其值;否则返回v并将(key,v)添加到字典d中
d.update(e) 将e中的键—值对添加到字典d中;e可能是字典,也可能是键—值对序列
内置函数与方法
序号 函数及描述 实例
1 len(dict)
计算字典元素个数,即键的总数。 >>> dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}
>>> len(dict)
3
2 str(dict)
输出字典,以可打印的字符串表示。 >>> dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}
>>> str(dict)
“{‘Name’: ‘Runoob’, ‘Class’: ‘First’, ‘Age’: 7}”
3 type(variable)
返回输入的变量类型,如果变量是字典就返回字典类型。 >>> dict = {‘Name’: ‘Runoob’, ‘Age’: 7, ‘Class’: ‘First’}
>>> type(dict)
<class ‘dict’>
序号 函数及描述
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()
返回一个迭代器,可以使用 list() 来转换为列表
8 radiansdict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9 radiansdict.update(dict2)
把字典dict2的键/值对更新到dict里
10 radiansdict.values()
返回一个迭代器,可以使用 list() 来转换为列表
11 pop(key[,default])
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
12 popitem()
随机返回并删除字典中的一对键和值(一般删除末尾对)。
序列(Sequence)
序列包括string,list,tuple,它们都有一些通用的操作。
in 判断某个object是不是在一个sequence中;
len(seq)得到sequence的长度;
通过下标获取其中的元素,seq[i];
通过带冒号的下标获取子sequence,seq[start:end];
用+表示连接两个sequence;
用*表示重复一个sequence,“a”*3表示“aaa”
集合
在Python中,集合是一系列不重复的元素。集合类似于字典,但只包含键,而没有相关联的值。在Python中,集合是相对较新的功能,在其还不支持集合时,一般使用字典模拟集合。集合分两类:可变集合(set)和不可变集合(frozenset)。对于可变集合,可添加和删除元素,而不可变集合一旦创建就不能更改。与字典一样,集合的元素排列顺序也是不确定的。集合没有列表和字典用得多,本章简要介绍,详细内容可参阅:https://docs.python.org/3/library/stdtypes.html#set
集合基本功能:包括关系测试和消除重复元素。集合对象还支持union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集,即异或)等数学运算。大括号或set()函数可以用来创建集合。注意:想要创建空集合,必须使用set() 而不是{}。

#!/usr/bin/python3
 
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 中不同时存在的元素

添加元素

s.add( x )

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Runoob'}

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

s.update( x )
x 可以有多个,用逗号分开。

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

移除元素
语法格式如下:
s.remove( x )
将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook")   # 不存在会发生错误
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Facebook'

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

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook")  # 不存在不会发生错误
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}

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

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

输出结果:
$ python3 test.py
Runoob
多次执行测试结果都不一样。
然而在交互模式,pop 是删除集合的第一个元素(排序后的集合的第一个元素)。

>>>thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
>>> thisset.pop()
'Facebook'
>>> print(thisset)
{'Google', 'Taobao', 'Runoob'}

计算集合元素个数
语法格式如下:
len(s)
计算集合 s 元素个数。

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3

清空集合
语法格式如下:
s.clear()

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()

判断元素是否在集合中存在
语法格式如下:

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

>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False

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

if<expr1>: <one_line_statement>
$$$
if <expr1>:
    <statement-block>
$$$
if <expr1>:
    <statement-block>
else:
    <statement-block>
$$$
if <expr1>:
    <statement-block>
    elif<expr2>:
        <statement-block>
    elif<expr3>:
        <statement-block>
...
    else:
        <statement-block>

嵌套结构

if 表达式1:
    语句
    if 表达式2:
        语句
    elif 表达式3:
        语句
    else:
        语句
elif 表达式4:
    语句
else:
    语句

使用说明
if后面的表达式可以是任何表达式,除了None,0,“”(空字符串),[](空list),{}(空Dictionary),()(空Tuple)以外,其他都是真。
表达式以冒号分割。
若是一行的简单表达式,可以直接跟在冒号后面。
若是多行的表达式,就要使用缩进的方式,表示一组语句。python认为同样缩进长度的语句是一组。
python中没有switch语句,使用elif来完成这个功能。
else表示条件不满足时应该执行的语句,别忘了后面的冒号。
for循环语句——语法格式

for x in <sequence>:
<statement-block>
else:
<else-block>

使用说明
sequence表示任何string,tuple,dictionary。
break语句可以强制退出循环。
continue语句可以继续执行下一次循环。
else语句是可有可无的。若有,则表示如果每个序列中的元素都循环到了,那么就执行else-block。
else语句可以理解为,如果循环没有被break语句强行中断,或者说循环正常结束后,就会执行else中的语句。
while循环语句——语法格式

while <expr1>:
<block>
else:
<else-block>

使用说明
只要expr1是真,那么就一直执行block中的语句。
如果没有break跳出循环,也就是expr1为假的时候,执行else block中的语句。
break和continue 语句
以及循环中的else 子句
break语句和C中的类似,用于跳出最近的一级for或while循环。continue 语句是从C中借鉴来的,它表示循环继续执行下一次迭代。循环可以有一个else子句;它在循环迭代完整个列表(对于for)或执行条件为false(对于while)时执行,但循环被break中止的情况下不会执行。
break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。实例如下:

#!/usr/bin/python3
 
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!")

执行以上脚本输出结果为:
当前字母为 : R
当前字母为 : u
当前字母为 : n
当前字母为 : o
当前字母为 : o
当期变量值为 : 10
当期变量值为 : 9
当期变量值为 : 8
当期变量值为 : 7
当期变量值为 : 6
Good bye!
continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

#!/usr/bin/python3
 
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!")

执行以上脚本输出结果为:
当前字母 : R
当前字母 : u
当前字母 : n
当前字母 : b
当前变量值 : 9
当前变量值 : 8
当前变量值 : 7
当前变量值 : 6
当前变量值 : 4
当前变量值 : 3
当前变量值 : 2
当前变量值 : 1
当前变量值 : 0
Good bye!
循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false(以while循环)导致循环终止时被执行,但循环被break终止时不执行。如下实例用于查询质数的循环例子:

#!/usr/bin/python3
 
for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, '等于', x, '*', n//x)
            break
    else:
        # 循环中没有找到元素
        print(n, ' 是质数')

 

执行以上脚本输出结果为:
2 是质数
3 是质数
4 等于 2 * 2
5 是质数
6 等于 2 * 3
7 是质数
8 等于 2 * 4
9 等于 3 * 3
pass语句
Python pass是空语句,它用于那些语法上必须要有什么语句,但程序上什么也不要做的场合,是为了保持程序结构的完整性。pass不做任何事情,一般用做占位语句,如下实例:

>>>while True:
...     pass  # 等待键盘中断 (Ctrl+C)
$$$
>>> while True:
... pass # Busy-wait for keyboard interrupt...
最小的类:
>>>class MyEmptyClass:
...     pass

以下实例在字母为 o 时 执行 pass 语句块:

#!/usr/bin/python3
 
for letter in 'Runoob': 
   if letter == 'o':
      pass
      print ('执行 pass 块')
   print ('当前字母 :', letter)
 
print ("Good bye!")

执行以上脚本输出结果为:
当前字母 : R
当前字母 : u
当前字母 : n
执行 pass 块
当前字母 : o
执行 pass 块
当前字母 : o
当前字母 : b
Good bye!
迭代器与生成器
迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象都可用于创建迭代器:
实例(Python 3.0+)

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

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

实例(Python 3.0+)

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

执行以上程序,输出结果如下:
1 2 3 4
也可以使用 next() 函数:
实例(Python 3.0+)

#!/usr/bin/python3

import sys # 引入 sys 模块

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

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

执行以上程序,输出结果如下:
1
2
3
4
创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。如果你已经了解面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。更多内容查阅:Python3 面向对象
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
创建一个返回数字的迭代器,初始值为1,逐步递增1:实例(Python 3.0+)

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

执行输出结果为:
1
2
3
4
5
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
在 20 次迭代后停止执行:
实例(Python 3.0+)

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)

执行输出结果为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
生成器
在Python中,使用了yield的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
以下实例使用yield实现斐波那契数列:
实例(Python 3.0+)

#!/usr/bin/python3
 
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), end=" ")
    except StopIteration:
        sys.exit()

执行以上程序,输出结果如下:
0 1 1 2 3 5 8 13 21 34 55
python函数
函数定义

def <function_name> ( <parameters_list> ):
<code block>

说明:
function_name是函数名称,冒号用来分割函数的内容。
parameters_list是参数列表。参数也没有类型,可以传递任何类型的值给函数,由函数的内容定义函数的接口。如果传递的参数类型不是函数想要的,那么函数可以抛出异常。
code block是和if,while一样的代码,应该有相同的缩进。
函数没有返回值类型,return可以返回任意类型。
必须参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:
实例(Python 3.0+)

#!/usr/bin/python3
 
#可写函数说明
def printme( str ):
   "打印任何传入的字符串"
   print (str)
   return
 # 调用 printme 函数,不加参数会报错
printme()

以上实例输出结果:
Traceback (most recent call last):
File “test.py”, line 10, in <module>
printme()
TypeError: printme() missing 1 required positional argument: ‘str’
默认参数
最有用的形式是给一个或多个参数指定默认值。这样创建的函数可以在调用时使用更少的参数。
def ask_ok(prompt, retries=4, complaint=’Yes or no, please!’):
while True:
ok = raw_input(prompt)
if ok in (‘y’, ‘ye’, ‘yes’): return 1
if ok in (‘n’, ‘no’, ‘nop’, ‘nope’): return 0
这个函数还可以用以下的方式调用:
ask_ok(‘Do you really want to quit?’),
或者像这样:
ask_ok(‘OK to overwrite the file?’,2)。
关键字参数
函数可以通过参数关键字的形式来调用,形如“keyword = value”。例如,以下的函数:
def parrot(voltage, state=’a stiff’, action=’voom’, type=’Norwegian Blue’):
print(“–This parrot wouldn’t”, action)
print(“if you put”, voltage, “Volts through it.”)
print(“–Lovely plumage, the”, type print “–It’s”, state, “!”)
可以用以下的任一方法调用:
parrot(1000)
parrot(action = ‘VOOOOOM’, voltage = 1000000)
parrot(‘a thousand’, state = ‘pushing up the daisies’)
参数列表中的每一个关键字都必须来自于形式参数,每个参数都有对应的关键字。
形式参数有没有默认值并不重要。
实际参数不能一次赋多个值。
形式参数不能在同一次调用中同时使用位置和关键字绑定值。
不定长参数
一个最不常用的选择是可以让函数调用可变个数的参数。这些参数被包装进一个拓扑。在这些可变个数的参数之前,可以有零到多个普通的参数:
def fprintf(file, format, *args):
file.write(format % args)
嵌套函数
这种机制提供了一个函数范围的概念,某些函数只在某些函数的内容才能看到。如果需要公开的话,可以通过返回值返回内部函数。

>>> def outfun(a,b):
... def innerfun(x,y):
... return x+y
... return innerfun(a,b)

匿名函数
通过lambda关键字,可以创建很小的匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。这里有一个函数返回它的两个参数的和:“lambda a, b: a+b”。lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda形式可以从包含范围内引用变量:

>>> def make_incrementor(n):
return lambda x: x + n...
>>> f = make_incrementor(42)
>>> f(0)
42

>>> f = lambda a,b: a+b
>>> f(1,2)
3

>>> f("abc","def")
'abcdef'

文档字符串
第一行应该是关于对象用途的简介。简短起见,不用明确的陈述对象名或类型,因为它们可以从别的途径了解到。这一行应该以大写字母开头,以句号结尾。如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔。接下来的文档应该有一或多段描述对象的调用约定、边界效应等。

>>> def my_function():
... """Do nothing, but document it
.... 
.... No, really, it doesn't do anything
.... """
... pass
... 
>>> print my_function.__doc__
this function do nothing, just demostratethe use of the doc string.

变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:

>>> import builtins
>>> dir(builtins)
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 变量定义在 if 语句块中,但外部还是可以访问的。如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:

>>> def test():
...     msg_inner = 'I am from Runoob'
... 
>>> msg_inner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'msg_inner' is not defined
>>>

从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
实例(Python 3.0+)

#!/usr/bin/python3
 
total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2 # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total

#调用sum函数
sum( 10, 20 )
print (“函数外是全局变量 : “, total)
以上实例输出结果:
函数内是局部变量 : 30
函数外是全局变量 : 0
global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
以下实例修改全局变量 num:
实例(Python 3.0+)

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

以上实例输出结果:
1
123
123
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:
实例(Python 3.0+)

#!/usr/bin/python3
 
def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

以上实例输出结果:
100
100
另外有一种特殊情况,假设下面这段代码被运行:
实例(Python 3.0+)

#!/usr/bin/python3
 
a = 10
def test():
    a = a + 1
    print(a)
test()

以上程序执行,报错信息如下:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 5, in test
    a = a + 1
UnboundLocalError: local variable 'a' referenced before assignment

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。
修改 a 为全局变量,通过函数参数传递,可以正常执行输出结果为:
实例(Python 3.0+)

#!/usr/bin/python3
 
a = 10
def test(a):
    a = a + 1
    print(a)
test(a)

执行输出结果为:
11

数据结构
列表
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]

注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。
将列表当做堆栈使用
列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 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]

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

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

列表推导式
列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
这里我们将列表中每个数值乘三,获得一个新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

现在我们玩一点小花样:
>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
这里我们对序列里每一个元素逐个调用某方法:
>>> freshfruit = [‘ banana’, ‘ loganberry ‘, ‘passion fruit ‘]
>>> [weapon.strip() for weapon in freshfruit]
[‘banana’, ‘loganberry’, ‘passion fruit’]
我们可以用 if 子句作为过滤器:
>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]
以下是一些关于循环和其它技巧的演示:
>>> 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]
列表推导式可以使用复杂表达式或嵌套函数:
>>> [str(round(355/113, i)) for i in range(1, 6)]
[‘3.1’, ‘3.14’, ‘3.142’, ‘3.1416’, ‘3.14159’]
嵌套列表解析
Python的列表还可以嵌套。
以下实例展示了3X4的矩阵列表:
>>> matrix = [
… [1, 2, 3, 4],
… [5, 6, 7, 8],
… [9, 10, 11, 12],
… ]
以下实例将3X4的矩阵列表转换为4X3列表:
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
以下实例也可以使用以下方法来实现:

>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

另外一种实现方法:

>>> transposed = []
>>> for i in range(4):
...     # the following 3 lines implement the nested listcomp
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

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

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

也可以用 del 删除实体变量:
>>> del a
元组和序列
元组由若干逗号分隔的值组成,例如:
>>> t = 12345, 54321, ‘hello!’
>>> t[0]
12345
>>> t
(12345, 54321, ‘hello!’)
>>> # Tuples may be nested:
… u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, ‘hello!’), (1, 2, 3, 4, 5))
如你所见,元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号, 不过括号通常是必须的(如果元组是更大的表达式的一部分)。
集合
集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。
可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典,下一节我们会介绍这个数据结构。
以下是一个简单的演示:
>>> 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 中唯一的字母
{‘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 中的字母,但不同时在 a 和 b 中
{‘r’, ‘d’, ‘b’, ‘m’, ‘z’, ‘l’}
集合也支持推导式:
>>> a = {x for x in ‘abracadabra’ if x not in ‘abc’}
>>> a
{‘r’, ‘d’}
字典
另一个非常有用的 Python 内建数据类型是字典。
序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。
理解字典的最佳方式是把它看做无序的键=>值对集合。在同一个字典之内,关键字必须是互不相同。
一对大括号创建一个空的字典:{}。
这是一个字典运用的简单例子:
>>> 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
构造函数 dict() 直接从键值对元组列表中构建字典。如果有固定的模式,列表推导式指定特定的键值对:
>>> dict([(‘sape’, 4139), (‘guido’, 4127), (‘jack’, 4098)])
{‘sape’: 4139, ‘jack’: 4098, ‘guido’: 4127}
此外,字典推导可以用来创建任意键和值的表达式词典:
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
如果关键字只是简单的字符串,使用关键字参数指定键值对有时候更方便:
>>> dict(sape=4139, guido=4127, jack=4098)
{‘sape’: 4139, ‘jack’: 4098, ‘guido’: 4127}
遍历技巧
在字典中遍历时,关键字和对应的值可以使用 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.
要反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数:
>>> for i in reversed(range(1, 10, 2)):
… print(i)

9
7
5
3
1
要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:
>>> basket = [‘apple’, ‘orange’, ‘apple’, ‘pear’, ‘orange’, ‘banana’]
>>> for f in sorted(set(basket)):
… print(f)

apple
banana
orange
pear
输入和输出
输出格式美化
Python两种输出值的方式: 表达式语句和 print() 函数。
第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。
str(): 函数返回一个用户易读的表达形式。
repr(): 产生一个解释器易读的表达形式。
例如
>>> s = ‘Hello, Runoob’
>>> str(s)
‘Hello, Runoob’
>>> repr(s)
“‘Hello, Runoob'”
>>> 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 的任何对象
… repr((x, y, (‘Google’, ‘Runoob’)))
“(32.5, 40000, (‘Google’, ‘Runoob’))”
这里有两种方式输出一个平方与立方的表:
>>> for x in range(1, 11):
… print(repr(x).rjust(2), repr(x*x).rjust(3), end=’ ‘)
… # 注意前一行 ‘end’ 的使用
… print(repr(x*x*x).rjust(4))

1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1, 11):
… print(‘{0:2d} {1:3d} {2:4d}’.format(x, x*x, x*x*x))

1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
注意:在第一个例子中, 每列间的空格由 print() 添加。
这个例子展示了字符串对象的 rjust() 方法, 它可以将字符串靠右, 并在左边填充空格。
还有类似的方法, 如 ljust() 和 center()。 这些方法并不会写任何东西, 它们仅仅返回新的字符串。
另一个方法 zfill(), 它会在数字的左边填充 0,如下所示:
>>> ’12’.zfill(5)
‘00012’
>>> ‘-3.14’.zfill(7)
‘-003.14’
>>> ‘3.14159265359’.zfill(5)
‘3.14159265359’
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))

Google ==> 1
Runoob ==> 2
Taobao ==> 3
如果你有一个很长的格式化字符串, 而你不想将它们分开, 那么在格式化时通过变量名而非位置会是很好的事情。
最简单的就是传入一个字典, 然后使用方括号 [] 来访问键值 :
>>> 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
旧式字符串格式化
% 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串. 例如:
>>> import math
>>> print(‘常量 PI 的值近似为:%5.3f。’ % math.pi)
常量 PI 的值近似为:3.142。
因为 str.format() 比较新的函数, 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format().
读取键盘输入
Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。
input 可以接收一个Python表达式作为输入,并将运算结果返回。
实例
#!/usr/bin/python3
str = input(“请输入:”);
print (“你输入的内容是: “, str)
这会产生如下的对应着输入的结果:
请输入:菜鸟教程
你输入的内容是: 菜鸟教程
读和写文件
open() 将会返回一个 file 对象,基本语法格式如下:
open(filename, mode)
filename:包含了你要访问的文件名称的字符串值。
mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
不同模式打开文件的完全列表:
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
下图很好的总结了这几种模式:

模式 r r+ w w+ a a+
读 + + + +
写 + + + + +
创建 + + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +
以下实例将字符串写入到文件 foo.txt 中:
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo.txt”, “w”)
f.write( “Python 是一个非常好的语言。\n是的,的确非常好!!\n” )
# 关闭打开的文件
f.close()
第一个参数为要打开的文件名。
第二个参数描述文件如何使用的字符。 mode 可以是 ‘r’ 如果文件只读, ‘w’ 只用于写 (如果存在同名文件则将被删除), 和 ‘a’ 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. ‘r+’ 同时用于读写。 mode 参数是可选的; ‘r’ 将是默认值。
此时打开文件 foo.txt,显示如下:
$ cat /tmp/foo.txt
Python 是一个非常好的语言。
是的,的确非常好!!
文件对象的方法
本节中剩下的例子假设已经创建了一个称为 f 的文件对象。
f.read()
为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
以下实例假定文件 foo.txt 已存在(上面实例中已创建):
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo.txt”, “r”)
str = f.read()
print(str)
# 关闭打开的文件
f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。
是的,的确非常好!!
f.readline()
f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo.txt”, “r”)
str = f.readline()
print(str)
# 关闭打开的文件
f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。
f.readlines()
f.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo.txt”, “r”)
str = f.readlines()
print(str)
# 关闭打开的文件
f.close()
执行以上程序,输出结果为:
[‘Python 是一个非常好的语言。\n’, ‘是的,的确非常好!!\n’]
另一种方式是迭代一个文件对象然后读取每行:
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo.txt”, “r”)
for line in f:
print(line, end=”)
# 关闭打开的文件
f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。
是的,的确非常好!!
这个方法很简单, 但是并没有提供一个很好的控制。 因为两者的处理机制不同, 最好不要混用。
f.write()
f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo.txt”, “w”)
num = f.write( “Python 是一个非常好的语言。\n是的,的确非常好!!\n” )
print(num)
# 关闭打开的文件
f.close()
执行以上程序,输出结果为:
29
如果要写入一些不是字符串的东西, 那么将需要先进行转换:
实例
#!/usr/bin/python3
# 打开一个文件
f = open(“/tmp/foo1.txt”, “w”)
value = (‘www.runoob.com’, 14)
s = str(value)
f.write(s)
# 关闭打开的文件
f.close()
执行以上程序,打开 foo1.txt 文件:
$ cat /tmp/foo1.txt
(‘www.runoob.com’, 14)
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/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’
f.close()
在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。
当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File “<stdin>”, line 1, in ?
ValueError: I/O operation on closed file
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try – finally 语句块要简短:
>>> with open(‘/tmp/foo.txt’, ‘r’) as f:
… read_data = f.read()
>>> f.closed
True
文件对象还有其他方法, 如 isatty() 和 trucate(), 但这些通常比较少用。
pickle 模块
python的pickle模块实现了基本的数据序列和反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
基本接口:
pickle.dump(obj, file, [,protocol])
有了 pickle 这个对象, 就能对 file 以读取的形式打开:
x = pickle.load(file)
注解:从 file 中读取一个字符串,并将它重构为原来的python对象。
file: 类文件对象,有read()和readline()接口。
实例 1
#!/usr/bin/python3
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
#!/usr/bin/python3
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()
错误和异常
语法错误
Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例
>>>while True print(‘Hello world’)
File “<stdin>”, line 1, in ?
while True print(‘Hello world’)
^
SyntaxError: invalid syntax
这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号(:)。
语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。
异常
即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:
>>>10 * (1/0)
Traceback (most recent call last):
File “<stdin>”, line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File “<stdin>”, line 1, in ?
NameError: name ‘spam’ is not defined
>>> ‘2’ + 2
Traceback (most recent call last):
File “<stdin>”, line 1, in ?
TypeError: Can’t convert ‘int’ object to str implicitly
异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。
错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。
异常处理
以下例子中,让用户输入一个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。

>>>while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")

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

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常。
异常处理并不仅仅处理那些直接发生在try子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。例如:

>>>def this_fails():
        x = 1/0
   
>>> try:
        this_fails()
    except ZeroDivisionError as err:
        print('Handling run-time error:', err)
   
Handling run-time error: int division or modulo by zero

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

>>>raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", 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 "<stdin>", line 2, in ?
NameError: HiThere

用户自定义异常
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 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)
   
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

在这个例子中,类 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

大多数的异常的名字都以”Error”结尾,就跟标准的异常命名一样。
定义清理行为
try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:

>>>try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
... 
Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

以上例子不管 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 "<stdin>", line 1, in ?
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

预定义的清理行为
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:

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

以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:

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

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

python类
类定义
定义一个类的时候,会创建一个新的命名空间,将其作为局部作用域使用——因此,所以对局部变量的赋值都引入新的命名空间。特别是函数定义将新函数的命名绑定于此。

class ClassName: 
<statement-1>
... 
<statement-N>

类对象引用
类对象支持两种操作:属性引用和实例化。
属性引用使用和python中所有的属性引用一样的标准语法:obj.name。类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:
class MyClass:
“A simple example class”
i= 12345
def f(self):
return ‘hello world‘
那么MyClass.i和MyClass.f是有效的属性引用,分别返回一个整数和一个方法对象。
类的实例化
类的实例化使用函数符号。只要将类对象看作是一个返回新的类实例的无参数函数即可。例如(假设沿用前面的类):
>>>x = MyClass()
以上创建了一个新的类实例并将该对象赋给局部变量x。这个实例化操作创建了一个空的对象。创建为有初始状态的类可以通过定义一个名为__init__() 的特殊方法来实现,像下面这样:
def__init__(self):
self.data= []
类定义了__init__() 方法的话,类的实例化操作会自动为新创建的类实例调用__init__() 方法。
类的继承
如果一种语言不支持继承就,“类”就没有什么意义。派生类的定义如下所示:
class DerivedClassName(BaseClassName):
<statement-1>

<statement-N>
命名BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。
类的多继承
python同样有限的支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>

<statement-N>
这里唯一需要解释的语义是解析类属性的规则。顺序是深度优先,从左到右。
python模块和包
模块(Module)
import 与 from…import:在 python 用 import 或者 from…import 来导入相应的模块。将整个模块(somemodule)导入,格式为: import somemodule。从某个模块中导入某个函数,格式为: from somemodule import somefunction。从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc。将某个模块中的全部函数导入,格式为: from somemodule import *。
一个module不过是一些函数,class放在一个*.py文件中,例如test.py:

"""
this only is a very simple test module
"""
age=0 # a sample attribute
def sayHello(): # a sample function in a module
print "Hello"
if __name__ == "__main__"
sayHello()

module的一些内置属性
__name__: 模块的名字
__file__ : 当前module的绝对路径
__dict__:
__doc__ :
__package__:
__path__:
包(Package)
Package是一组module的集合,用以下方法创建一个package。
在当前目录下创建一个目录testpackage;
在testpackage目录中创建一个空文件__init__.py;
在testpackage目录中创建一个testmodule.py文件,里面含有一些代码。
>>> import testpackage.testmodule
>>> testpackage.testmodule.sayHello()
Hello
Package是一种组织module的方法,提供了一个name space,防止发生名称冲突。
命名空间(name space)
命名空间是从命名到对象的映射。以下有一些命名空间的例子:内置命名(像abs()这样的函数,以及内置异常名)集,模块中的全局命名,函数调用中的局部命名。某种意义上讲对象的属性集也是一个命名空间。关于命名空间需要了解的一件很重要的事就是不同命名空间中的命名没有任何联系,例如两个不同的模块可能都会定义一个名为“maximize”的函数而不会发生混淆--用户必须以模块名为前缀来引用它们。
不同的命名空间在不同的时刻创建,有不同的生存期。包含内置命名的命名空间在python解释器启动时创建,会一直保留,不被删除。
术语表
argument 实参
attribute 属性
base class 基本类
block 块
character 字符
class 类
comment 注释
complex number 复数
derived class 导出类
dictionary 字典
escape sequence 转义符
exception 异常
expression 表达式
field 域
float 浮点数
function 函数
identifier 标识符
indentation 缩进
indexing 索引
instance 实例
integer 整数
list 列表
list comprehension 列表综合
literal constant 字面意义上的常量
logical line 逻辑行
long integer 长整数
method 方法
module 模块
namespace 名称空间
object 对象
operand 操作数
operator 运算符
parameter 形参
pickle 储存器
physical line 物理行
sequence 序列
shebang line 组织行
slicing 切片
statement 语句
string 字符串
subclass 子类
superclass 超类
tuple 元组
type 类型
variable 变量
日期显示格式
The table below shows all the codes that you can pass to the strftime() method.
Directive Meaning Example
%a Abbreviated weekday name. Sun, Mon, …
%A Full weekday name. Sunday, Monday, …
%w Weekday as a decimal number. 0, 1, …, 6
%d Day of the month as a zero-padded decimal. 01, 02, …, 31
%-d Day of the month as a decimal number. 1, 2, …, 30
%b Abbreviated month name. Jan, Feb, …, Dec
%B Full month name. January, February, …
%m Month as a zero-padded decimal number. 01, 02, …, 12
%-m Month as a decimal number. 1, 2, …, 12
%y Year without century as a zero-padded decimal number. 00, 01, …, 99
%-y Year without century as a decimal number. 0, 1, …, 99
%Y Year with century as a decimal number. 2013, 2019 etc.
%H Hour (24-hour clock) as a zero-padded decimal number. 00, 01, …, 23
%-H Hour (24-hour clock) as a decimal number. 0, 1, …, 23
%I Hour (12-hour clock) as a zero-padded decimal number. 01, 02, …, 12
%-I Hour (12-hour clock) as a decimal number. 1, 2, … 12
%p Locale’s AM or PM. AM, PM
%M Minute as a zero-padded decimal number. 00, 01, …, 59
%-M Minute as a decimal number. 0, 1, …, 59
%S Second as a zero-padded decimal number. 00, 01, …, 59
%-S Second as a decimal number. 0, 1, …, 59
%f Microsecond as a decimal number, zero-padded on the left. 000000 – 999999
%z UTC offset in the form +HHMM or -HHMM.
%Z Time zone name.
%j Day of the year as a zero-padded decimal number. 001, 002, …, 366
%-j Day of the year as a decimal number. 1, 2, …, 366
%U Week number of the year (Sunday as the first day of the week). All days in a new year preceding the first Sunday are considered to be in week 0. 00, 01, …, 53
%W Week number of the year (Monday as the first day of the week). All days in a new year preceding the first Monday are considered to be in week 0. 00, 01, …, 53
%c Locale’s appropriate date and time representation. Mon Sep 30 07:06:05 2013
%x Locale’s appropriate date representation. 09/30/13
%X Locale’s appropriate time representation. 7:06:05
%% A literal ‘%’ character. %

Leave a Reply

Your email address will not be published. Required fields are marked *