第十五章 更多python的内容
特殊的方法
特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]这样的索引操作(就像列表和元组一样),那么你只需要实现__getitem__()方法就可以了。
__init__(self,...) 这个方法在新建对象恰好要被返回使用之前被调用。
__del__(self) 恰好在对象要被删除之前调用。
__str__(self) 在我们对对象使用print语句或是使用str()的时候调用。
__lt__(self,other)当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。
__getitem__(self,key)使用x[key]索引操作符的时候调用。
__len__(self) 对序列对象使用内建的len()函数的时候调用。
__del__(self) 恰好在对象要被删除之前调用。
__str__(self) 在我们对对象使用print语句或是使用str()的时候调用。
__lt__(self,other)当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。
__getitem__(self,key)使用x[key]索引操作符的时候调用。
__len__(self) 对序列对象使用内建的len()函数的时候调用。
——————————————————————————————————————————————————————————————
列表推导式
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print listtwo
输出:[6, 8]
转自http://www.cainiao8.com/python/basic/python_14_list_comprehension.html
list comprehension替代嵌套循环
常规的嵌套循:
常规的嵌套循:
for x in [1,2,3]:
for y in [1,2,3]:
z = x*y
print str(x)+'*'+str(y)+' is: '+str(z)
输出:
1*1 is: 1
1*2 is: 2
1*3 is: 3
2*1 is: 2
2*2 is: 4
2*3 is: 6
3*1 is: 3
3*2 is: 6
3*3 is: 9
1*2 is: 2
1*3 is: 3
2*1 is: 2
2*2 is: 4
2*3 is: 6
3*1 is: 3
3*2 is: 6
3*3 is: 9
print [x*y for x in [1,2,3] for y in [1,2,3]]
输出:[1, 2, 3, 2, 4, 6, 3, 6, 9]
——————————————————————————————————————————————————————————————————————
在函数中接收元组和列表
当要使函数接收元组或字典形式的参数时,有一种特殊的方法,它分别使用*和**前缀。这种发放在函数需要获取可变数量的参数的时候特别有用。
>>> def powersum(power, *args):
'''Return the sum of each argument raised to specified power.'''
total = 0
for i in args:
total += pow(i, power)
return total
>>> powersum(2, 3, 4)# 3的平方+4的平方
25
>>> powersum(2, 10)
100
>>>
由于在args变量前有*前缀,所有多余的函数参数都会作为一个元组存储在args中。
如果使用的是**前缀,多余的参数则会被认为是一个字典的键/值对。
>>> def fun(p,**args):
print args
>>> fun(1,a=2,b=3,c=4,d=5)
{'a': 2, 'c': 4, 'b': 3, 'd': 5}
>>>
——————————————————————————————————————————————————
lambda形式
lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。
就等于是定义一个没有名字而且只有return语句的function。
比如:
lambda a,b:a+b
实际上就等于
def f(a,b):
return a+b
比如:
lambda a,b:a+b
实际上就等于
def f(a,b):
return a+b
def make_repeater(n):
return lambda s: s*n
twice = make_repeater(2)
print twice('word')
print twice(5)
输出:
wordword
10
——————————————————————————————————————————————————————————————
10
m = lambda x,y,z: (x-y)*z
print m(3,1,2)
输出:4
——————————————————————————————————————————————————————————————
exec和eval语句
转自http://tieba.baidu.com/p/1733788981
exec语句用来执行储存在字符串或文件中的包含Python代码的语句。
eval语句用来计算存储在字符串中的有效Python表达式
eval()是执行一个表达式,既然是表达式,就有返回值 比如a=eval('1+1'),
exec是执行一段代码,没有返回值
>>> exec("for i in range(5):print(i)")
0
1
2
3
4
>>> eval("for i in range(5):print(i)") # eval只能处理表达式,所以错了
Traceback (most recent call last):
File "<pyshell#71>", line 1, in <module>
eval("for i in range(5):print(i)") # eval只能处理表达式,所以错了
File "<string>", line 1
for i in range(5):print(i)
^
SyntaxError: invalid syntax
>>> al=eval("1+1");ec=exec("1+1")#exec没有返回值,所以错了
SyntaxError: invalid syntax
——————————————————————————————————————————————————
assert语句
转自http://www.cnblogs.com/herbert/archive/2013/01/12/2857233.html
assert语句用来声明某个条件是真的。例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<pyshell#96>", line 1, in <module>
assert len(mylist) >= 1
AssertionError
>>>
assert语句是一种插入调试断点到程序的一种便捷的方式。可以避免不必要的未知错误。
assert语句的使用格式:assert 表达式1,表达式2
这个语句是等价于下面的个句式:
if __debug__:
if not expression: raise AssertionError
if not expression: raise AssertionError
关于质数判定的assert使用示例
>>> def isPrime(n):
"""This function return a number is a prime or not"""
assert n >= 2
from math import sqrt
for i in range(2, int(sqrt(n))+1):
if n % i == 0:
return False
return True
>>> isPrime(1)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
isPrime(1)
File "<pyshell#2>", line 3, in isPrime
assert n >= 2
AssertionError
>>> isPrime(93)
False
>>> isPrime(2)
True
>>>
_________________________________________________________________________________________________
repr函数
repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。
(可参考第十四章笔记)
(可参考第十四章笔记)
>>> i = []
>>> i.append('item')
>>> i
['item']
>>> repr(i)
"['item']"
>>> `i` #反引号
"['item']"
>>>
-----------------------------
反引号·
其实它就在感叹号的前面,在你输入的是否是上面的一个小点,其实他就是反引号.
——————————————————————————————————————————————————————————————————