第十五章 更多python的内容

第十五章 更多python的内容

特殊的方法

特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]这样的索引操作(就像列表和元组一样),那么你只需要实现__getitem__()方法就可以了。
__init__(self,...) 这个方法在新建对象恰好要被返回使用之前被调用。
__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

使用list comprehension代替以上代码:
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

def make_repeater(n):
    return lambda s: s*n
twice = make_repeater(2)
print twice('word')
print twice(5)
输出:
wordword
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


关于质数判定的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']"
>>> 
-----------------------------

反引号·

其实它就在感叹号的前面,在你输入的是否是上面的一个小点,其实他就是反引号.
——————————————————————————————————————————————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值