1. 高阶函数
1
2
3
4
5
6
7
8
9
10
|
# 类似于递归函数,常见于Java,C#自定义接口中
def
cmd_ignore_case(s1,s2)
u1
=
s1.upper()
u2
=
s2.upper()
if
u1 < u2:
return
-
1
if
u1 > u2:
return
1
return
0
sorted
([
'about'
,
'bobo'
,
'Zone'
,
'dangerous'
], cmd_ignore_case)
|
2. 面向对象---定义
1
2
3
4
5
6
7
8
9
10
11
|
# 面向对象
class
Student(
object
):
pass
# 实例绑定一个属性:
s
=
Student()
s.name
=
'King'
# 定义一个函数作为实例方法
from
types
import
MethodType
s.set_age
=
MethodType(set_age, s, Student)
# 所有实例全部绑定方法
Student.set_score
=
MethodType(set_score,
None
, Student)
|
3. 对象的浅拷贝与深拷贝
1
2
3
4
5
6
7
|
# 谈论这个话题的就只有对象了 list , tuple , class , dict etc
# 浅拷贝 只复制对象的值(或者说被引用)
1.
切片
list
[:]
2.
工厂函数
list
()
dict
()
3.
copy模块的copy函数
# 深拷贝 复制值还要另开辟新的空间地址
1.
copy模块的deepcopy函数
|
4. 面向对象---属性
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
Student(
object
):
# 此处特殊的写法 @ 就是装饰器的用法
# 此属性有 getter,setter 操作类的成员
@property
def
score(
self
):
return
self
._score
@score
.setter
def
score(
self
, value):
if
not
isinstance
(value,
int
):
raise
ValueError(
'score must be an integer!'
)
if
value <
0
or
value >
100
:
raise
ValueError(
'score must between 0 ~ 100!'
)
self
._score
=
value
|
5. 面向对象---多重继承 Minix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class
animal(
object
):
@property
def
alive(
self
):
return
self
._alive
@alive
.setter
def
alive(
self
, value):
self
._alive
=
value
class
bunkMinix(
object
):
def
bunk(
self
):
print
(
'bunk'
)
# 这里的dog对象不但继承了animal还继承实现了bunkMinix
class
dog(animal, bunkMinix):
@property
def
name(
self
):
return
self
._name
@name
.setter
def
name(
self
, value):
self
._name
=
value
.
.
# mixin多重继承 主线一般是单继承
class
Dog(Mammal, bunkMinix, eatMixin):
pass
|
6. 类的常用内置函数
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
47
|
# 用tuple定义允许绑定的属性名称
__slots__
=
(
'name'
,
'age'
)
.
# 默认类的调用打印信息 dog()
__str__ 类似于Java语言 toString()
.
# 调试信息给开发者看
__repr__ 类似于C
#语言 @debug
.
# 迭代如果有可iter元素
__iter__ 类似与C
#语言 IEnumerable接口概念
# 出现了__iter__就必须要出现 next() 方法
例:
class
Fib(
object
):
def
__init__(
self
):
self
.a,
self
.b
=
0
,
1
# 初始化两个计数器a,b
def
__iter__(
self
):
return
self
# 实例本身就是迭代对象,故返回自己
def
next
(
self
):
self
.a,
self
.b
=
self
.b,
self
.a
+
self
.b
# 计算下一个值
if
self
.a >
100000
:
# 退出循环的条件
raise
StopIteration();
return
self
.a
# 返回下一个值
.
# __getitem__ 取iter单个元素 类似与C#语言 对象索引器
class
Fib(
object
):
def
__getitem__(
self
, n):
a, b
=
1
,
1
for
x
in
range
(n):
a, b
=
b, a
+
b
return
a
.
__getattr__ 动态返回对象中没有定义的属性
class
Student(
object
):
def
__init__(
self
):
self
.name
=
'Michael'
def
__getattr__(
self
, attr):
if
attr
=
=
'score'
:
return
99
.
# 判断类是否能被调用
__call__
callable
()
例:
def
__call__(
self
):
print
(
'My name is %s.'
%
self
.name)
s
=
Student(
'King'
)
s()
|
7. 异常处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# try..catch..finnlly
try
:
print
'try...'
r
=
10
/
0
print
'result:'
, r
except
ZeroDivisionError, e:
print
'except:'
, e
finally
:
print
'finally...'
print
'END'
.
# 自定义异常处理
class
FooError(StandardError):
print
(
'这是一个自定义错误!!'
)
def
foo(s):
n
=
int
(s)
if
n
=
=
0
:
raise
FooError(
'invalid value: %s'
%
s)
return
10
/
n
|
8. 调试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 开启命令行调试功能(在Python开启pdb是多么惬意的一件事情)
python
-
m pdb err.py
l [n,m | main ] 查看当前指定代码或者main函数
set
listsize
20
只显示
20
行源代码
.
b [n | main] 设置断点,如果不设置则指定 n 下一步
info breakpoints 查看所有断点
.
变量名 查看当前变量的值
q 退出调试功能
.
n 调试到下一步不进入内部函数
n m 调试器走几步
s 调试到内部函数中
c 直到下一个断点
.
# 调试器从代码开头运行到最后,万一代码多怎么办?
# 需要调试的地方加入,这样我们就可以在命令行中不需要输入 -m pdb了
import
pdb
pdb.set_trace()
|
关于调试更多详情请见: docs.python.org
9. 文件读写
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
|
# 文件读 默认是只读状态打开文件
f
=
open
(
'/Users/King/hhvm.conf'
)
print
f.read(
30
)
for
line
in
f.readlines():
print
(line.strip())
# 把末尾的'\n'删掉
f.close()
#
# with可以偷懒少掉 close() 这一步
with
open
(
'/Users/King/hhvm.conf'
,
'r'
) as f:
print
f.read()
#
# 二进制模式要加 b
f
=
open
(
'/Users/King/test.jpg'
,
'rb'
)
f.read()
#
# 要读取非ASCII编码的文本文件,就必须以二进制模式打开,再解码。
f
=
open
(
'/Users/King/gbk.txt'
,
'rb'
)
u
=
f.read().decode(
'gbk'
)
print
u
#
# 文件编码的另一种解决方案
import
codecs
with codecs.
open
(
'/Users/King/gbk.txt'
,
'r'
,
'gbk'
) as f:
f.read()
# u'\u6d4b\u8bd5'
#
# 文件写 模式替换为 w
# 对应方法为 wirte writeLine 编码与读雷同也有两种方案
|
测试: 如果你能看懂下面的代码,证明初级部分的Python已经没有问题,接下来就是Python标准库的学习了
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
|
import
time
import
threading
import
Queue
#
class
Controm(threading.Thread):
def
__init__(
self
, queue):
threading.Thread.__init__(
self
)
self
._queue
=
queue
#
def
run(
self
):
while
True
:
msg
=
self
._queue.get()
if
isinstance
(msg,
str
)
and
msg
=
=
'quit'
:
break
print
'client message %s'
%
msg
print
'bye'
#
def
Proceser():
queue
=
Queue.Queue()
worker
=
Controm(queue)
worker.start()
#
start_time
=
time.time()
while
time.time()
-
start_time <
5
:
queue.put(
'msg %s'
%
time.time())
time.sleep(
1
)
queue.put(
'quit'
)
#
worker.join()
#
if
__name__
=
=
'__main__'
:
Proceser()
|
Update: 后续会进行Python标准库的更新...
本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1391811,如需转载请自行联系原作者