Python学习记录3

  • 为什么匿名函数叫匿名函数?

Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。
好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。

引用自这里,这篇博文还提到了python应用的两个场合,函数式编程和闭包

  • 闭包
    闭包跟程序里面有函数的区别是,后者是直接在母函数内执行,而前者返回定义的子函数。
    闭包使得局部变量可以在函数外面被访问,有点像只有一个方法的类。

请参考这里

  • python中的函数究竟是什么?听说类也可以作为函数调用是怎么回事?

见这里

  • 神马都是对象,不仅函数是对象,连类都是对象。

  • 类方法和静态方法
    类是一个对象,对象可以有方法,类方法就是跟类绑定在一起的方法;静态方法跟普通函数最大的不同就是要用类或者实例进行调用。

  • for循环的运行过程
    首先调用方法iter获取迭代器,每次循环调用next获取元素

  • 函数跟方法居然不一样!!!!
    定义在类中的不一定就是方法,方法和函数的主要区别还是是否从属于某个实例。要将类里面的当作函数,我们要输入一个类,还记得我们定义类中的方法的时候输入一个self参数了吗?
    更加详细见这里

  • 为什么定义方法的时候一定要输入参数self呢?
    ??

  • 为什么有了列表还要有元组?
    详细请见这里
    两者的区别:最重要的一点是tuple是不可变类型,大小固定,而 list 是可变类型、数据可以动态变化。

不可变所以操作起来快,占用空间少。
元组不可变可以当作字典的键,

  • python常犯错误
    注意4、5、6

  • ==和is的区别
    ==强调的是值的相等,而is是内存地址的相同与否

  • 变量是对象的一个引用,参数就是变量。
    变量本身没有类型信息,类型信息存储在对象中,这和C/C++中的变量有非常大的出入(C中的变量是一段内存区域)

  • Python 函数中,参数是传值,还是传引用?

  • 生成器与迭代器的区别
    功能一样,但是实现不一样,前者更加优雅,生成器就像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")
  • 字符编解码理解
    解码通常是将密文解为明文,字节流是比较晦涩的,而字符串是比较明朗,因此,编解码如下
Python学习记录3_第1张图片
Paste_Image.png

更多编码的知识请看这里

  • 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)

你可能感兴趣的:(Python学习记录3)