- 为什么匿名函数叫匿名函数?
Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。
好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。
引用自这里,这篇博文还提到了python应用的两个场合,函数式编程和闭包
- 闭包
闭包跟程序里面有函数的区别是,后者是直接在母函数内执行,而前者返回定义的子函数。
闭包使得局部变量可以在函数外面被访问,有点像只有一个方法的类。
请参考这里
- python中的函数究竟是什么?听说类也可以作为函数调用是怎么回事?
见这里
神马都是对象,不仅函数是对象,连类都是对象。
类方法和静态方法
类是一个对象,对象可以有方法,类方法就是跟类绑定在一起的方法;静态方法跟普通函数最大的不同就是要用类或者实例进行调用。for循环的运行过程
首先调用方法iter获取迭代器,每次循环调用next获取元素函数跟方法居然不一样!!!!
定义在类中的不一定就是方法,方法和函数的主要区别还是是否从属于某个实例。要将类里面的当作函数,我们要输入一个类,还记得我们定义类中的方法的时候输入一个self参数了吗?
更加详细见这里为什么定义方法的时候一定要输入参数self呢?
??为什么有了列表还要有元组?
详细请见这里
两者的区别:最重要的一点是tuple是不可变类型,大小固定,而 list 是可变类型、数据可以动态变化。
不可变所以操作起来快,占用空间少。
元组不可变可以当作字典的键,
python常犯错误
注意4、5、6==和is的区别
==强调的是值的相等,而is是内存地址的相同与否变量是对象的一个引用,参数就是变量。
变量本身没有类型信息,类型信息存储在对象中,这和C/C++中的变量有非常大的出入(C中的变量是一段内存区域)生成器与迭代器的区别
功能一样,但是实现不一样,前者更加优雅,生成器就像ios,迭代器就像android代码这样写更优雅
注意3(使用enumerate)、4(字符串连接)、8(该使用队列的地方要使用队列)、9(序列解包)、
- enumerate用法
colors = ['red', 'green', 'blue', 'yellow']
for color in enumerate(colors):
print ('--->', color)
输出:
---> (0, 'red')
---> (1, 'green')
---> (2, 'blue')
---> (3, 'yellow')
这样可以方便我们这样子写
colors = ['red', 'green', 'blue', 'yellow']
for i, color in enumerate(colors):
print (i, '--->', color)
输出:
0 ---> red
1 ---> green
2 ---> blue
3 ---> yellow
- 如何让字符串连接更高效
字符串连接时,普通的方式可以用 + 操作
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
s = names[0]
for name in names[1:]:
s += ', ' + name
print (s)
pythonic
print (', '.join(names))
join 是一种更加高效的字符串连接方式,使用 + 操作时,每执行一次+操作就会导致在内存中生成一个新的字符串对象,遍历8次有8个字符串生成,造成无谓的内存浪费。而用 join 方法整个过程只会产生一个字符串对象。
- 队列
from collections import deque
names = deque(['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie'])
names.popleft()
names.appendleft('mark')
- 遍历字典的高效方法
方法一每次都要计算hash值,方法二在python3中使用迭代器
# 方法一
for k in d:
print (k, '--->', d[k])
# 方法二
for k, v in d.items():
print (k, '--->', v)
- 获取字典元素
d = {'name': 'foo'}
if d.has_key('name'):
print(d['name'])
else:
print('unkonw')
pythonic
d.get("name", "unknow")
- 字符编解码理解
解码通常是将密文解为明文,字节流是比较晦涩的,而字符串是比较明朗,因此,编解码如下
更多编码的知识请看这里
i += x 与 i = i + x的区别
元类就是类的类,真正的类
平常的我们所说的类其实也是一种对象,创建这些类(其实是对象)的类
详细看这里协程
协程是消费者,有点像回调函数,得到数据的地方用yield。
首先生产者将消费者作为参数调入,在生产者中生产出数据后,调用消费者.send,这个时候就会回去消费中消费数据,然后再回来。
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)