《Python 简明教程》学习笔记

《python 简明教程》python 入门的一个非常好的文档。如需下载,请点击这里(密码:grjj)。最近又看了一遍,把里面一些容易忽略的知识点记录下来。

运算符

  • ** 乘方,2**3=8
  • // 取商的整数部分,10//3=3
  • & 按位与,5&3=1
  • | 按位或,5|3=7
  • ^ 按位异或,5^3=6
  • ~ 按位取反,~5=-6,取反后数的正负反转,且正数要比负数绝对值小 1
  • and、or、not 就是 Java 里面的 &&、||、!,但是在 python 里面 &&、||、!是非法字符

数据结构

  • python 里面常用的数据结构有列表(list)、元组(tuple)、字典(dic) 和集合 (set)
  1. list, 用方括号 [] 括起来,里面元素用逗号分隔,元素有序可变
    • 增加元素用 append() 方法,删除元素用 del 方法
  2. tuple,用圆括号 () 括起来,里面元素用逗号分隔,元素有序不可变
    • 仅有一个元素时也要加 ,,避免与运算符优先级混淆
    • 常用于打印语句,如 print "name:%s,age: %d" %(name,age)
  3. dic,用花括号 {} 括起来,里面元素用逗号分隔,元素无序可变,每个元素是用冒号: 分隔的键值对
    • 通过 dic[k] 访问元素,dic[newK]=newV 增加元素,del dic[k] 删除元素
    • 遍历的方法为 for k,v in dic.items():, 实际上 dic.items() 会返回一个元组的列表
    • 判断某一个 k 是否在 dic if k in dic:
  4. 序列,序列不是一种具体的数据结构,而是一类数据结构,字符串,列表和元组均属于序列,序列有一些通用的方法
    • 通过 len() 获取序列的长度
    • 表示序列的范围:[a:b] 表示下表 a 到 b-1,[a:] 表示从下标 a 到最后一个,[:b] 表示从第一个 (也就是 0) 到下标 b-1,[:] 表示所有元素,默认步长为 1,也可以添加多一个参数变为 [a:b:c], 这时步长为 c,与 range () 函数相似
    • 对于一个序列,复制这个序列与给这个序列使用一个别名不同,详见下面代码
1
2
3
4
5
6
7
list1=[1,2,3]  
list2=list1 #别名
list3=list1[:] #复制
del list1[1]
print list2
print list3

控制语句

  • python 的控制语句有 if,while,for,continue,break,但是没有 switch
  • if、while 判断条件的判断条件均没有括号
  • while、for 语句均有一个 可选的 else 语句,while 语句条件不成立时退出 while 并执行 else 语句;for 语句中的 else 语句则在 for 循环后执行一次;但是如果在 while 和 for 循环里面遇到 break 退出程序,则不会执行 else 语句
  • for i in k: 语句里,k 可以是任何序列,包括字符串、列表、元组、字典等
  • for 里面常用的 range 函数的范围不包括第二个参数,默认步长为 1,可通过第三个参数选择步长
1
2
range(1,5) --> 1,2,3,4  
range(1,5,2)-->1,3

函数

  • 函数没有 return 语句时默认返回一个 None(没有任何东西的特殊类)
  • pass 语句表示一个空的语法句
  • 文档字符串:用来描述函数或者类的功能,一般格式:首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
        def printMax(x, y):  
'''Prints the maximum of two numbers.

The two values must be integers.'''

```
文档字符串也可以通过函数或类的`__doc__`属性获取

- 一些常见的函数
- `range()`,一般用于for循环
- `dir(module)`,返回module的名称列表,不提供module值时默认是当前module
- `len(arr)`,用于获取序列arr的长度,arr可以是list、tuple、dic或者是string
- `os.system(command)`,执行系统命令`command`
- `time.strftime()`,按指定格式输出当前系统时间,如`time.strftime("%Y-%m-%d %H:%M:%S")`
- `time.sleep(t)`,一般用于循环,让系统休眠t秒
- `string.startswith(str)`,字符串对象的方法,判断字符串string是否以 str开头
- `string.find(str)`,字符串对象的方法,判断 str是否在字符串string里面
- `string.join(list)`,字符串对象的方法,用字符串 string 连接list列表

## 模块

- 可以导入的模块有两种:(1)标准模块,常见的有os、sys(2)自定义模块,就是.py结尾的python文件
- `import `操作会在`sys.path`列出的目录列表里面查找需要import的模块
- 为了使导入模块的操作更快,会在第一次导入模块时创建模块的pyc文件(字节编译文件)
- 每个模块都有一个`__name__`,当模块被直接执行时,该值为__main__

## 类

- 语法 `class 类名:`
- 类方法与普通函数形式上最大区别在于类方法的第一个形参必须为`self`,且该形参不需要实参,`self`类似于Java中的`this`指针
- `__init__`为构造函数,`__del__`为析构函数
- 所有的类成员都是公开的,而以双下划线开头的成员是属于类的,是私有的,作为惯例,一般属于类的成员都以单下划线开头
- 继承,语法 `class son(father):`,注意**子类不会自动调用父类的构造函数,因此必须显示调用**,但是不调用时也没有报错。

## 异常捕获

- 语法

```
try:
可能抛出异常的方法
except (错误或异常的元组): #没有指定异常时捕获所有的错误异常
处理
finally:
无论是否有异常均要执行

其他一些用法

  • python 程序第一行的 #! 目的是确定使用哪个解释器,一般在 Linux 平台下写的是 #!/usr/bin/env python 而不是直接写 python 解析器的位置,目的是即使程序在其他机子上跑时也能够找得到 python 解析器;而且程序迁移到 windows 下也不会报错问题,但是 #!/usr/bin/env python 并不适用于 Windows 默认的 cmd 窗口,假如直接在 dos/powershell 下输入 python 的文件名,是会用文件关联的程序打开(关联程序可以通过右键设置打开方式来设定)。也可在 Windows 下安装一个 git shell,在 git shell 下输入 python 的文件名即可执行。

  • 可以通过内置的 help ( ) 函数来找到函数和类的帮助信息,实际上 help ( ) 是通过抽取文档字符串(DocStrings,也就是函数和类的__doc__属性)并打印输出的

  • 字符串或者程序在一行放不下时通过反斜杠 \ 可以在下一行继续写,

  • 字符串前加上 u 或者 U 表示采用 Unicode 编码,字符串的连接可以使用加号 +

  • print 语句的一些技巧:在 for 循环的 print 最后加逗号可以避免分行;print str*i 可以重复输出 i 个 str

  • 强制类型转换一般形式是被转换的内容用圆括号括起来,类型不用扩。如 str(5) 是从整数转为字符串 ,int(raw_input('input an integer')) 是从字符串转为整形

  • 列表综合:从一个已有的列表导出一个新的列表。实例如下:

1
2
3
4
5
6
7
list1=[1,2,3,4,5]  
list2=[i*2 for i in list1 if i>2] #list2=[6,8,10]
```
也可从一个列表导出一个字典(dict只能接受一个参数,这里为一个列表)
```py
l1=[1,2,3]
timesten=dict([(v,v*10) for v in l1 if i >1])#timesten={2:20,3:30}
  • 函数形参为元组和字典:可用 * 和 ** 加在形参前,代表这是元组和字典,但是不加也能够正常使用。加上的目的是为了能让函数接受不定参数,例子如下:
1
2
3
4
5
def add(x, *args):  
total = x
for arg in args:
total += arg
return total

这里的 *args 表示参数数目不定,可以看成一个元组,把第一个参数后面的参数当作元组中的元素。运行

1
2
3
4
>>>print add(1, 2, 3, 4)  
10
>>>print add(1, 2)
3

这样定义的函数不能使用关键词传入参数,要使用关键词,可以这样:

1
2
3
4
5
6
def add(x, **kwargs):  
total = x
for arg, value in kwargs.items():
print "adding ", arg
total += value
return total

这里的 **kwargs 表示参数数目不定,相当于一个字典,关键词和值对应于键值对。运行如下

1
2
3
4
5
>>>print add(10, y=11, z=12, w=13)  
adding y
adding z
adding w
46