Python--闭包

Python--闭包

写这个博客还得起源于潜水快一个学期的老班在班群里提的一个问题:

1
2
3
4
5
6
7
functions = []
for i in range(5):
    def func(x):
        return x + i
    functions.append(func)
for f in functions:
    print(f(12))

输出结果都是16,原因?

Read more
Python-class

Python-class

2020/10/25更新 整合了内容

Python面向对象编程

ps:相对熟悉的知识就不仔细列出了

定义与实例

  • class定义一个对象
  • 类的实例是以函数的形式调用类对象来创建的,__init__()为构造函数,__del__()为析构函数

作用域规则

  • Python类中没有作用域,这与C++,Java不同。而需要显示使用self的原因在于Python没有提供显示声明变量的方式(如:int x;),因此无法知道在方法中要赋值的变量是不是局部变量,或者是否要保存为实例属性,而显示self可以解决这一问题。

继承

  • super(cls, instance)会返回一个特殊对象,该对象支持在基类上执行属性查找。你可以通过super获取基类,调用基类的函数。在Python3中,super中的参数可以不要。
  • 多继承不要使用不要使用不要使用

多态动态绑定和鸭子类型

  • 动态绑定(在继承背景下使用,也成多态),obj.attr,首先搜索实例本身,然后是实例的类定义,然后是基类,查找会返回第一个匹配项
  • 动态绑定在于其不受对象obj的类型影响,因此如果执行像obj.name这样的查找,对于所有拥有name属性的obj都适用。这种行为有时候被称作“鸭子类型”(duck typing),这个名称来源于一个谚语:“如果看起来,叫声像而且走起路来像鸭子,那么它就是鸭子”。
Read more
Python-base-general

Python-base-general

Python 基础的一些补充

生成器

概念

如果使用yield语句, 可以让函数生成一个结果序列,而不仅仅是一个值
如:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>>def countdown(n):
print("Counting down!")
while n > 0:
yield n
n -= 1
>>>countdown(5)
<generator object countdown at 0x00000289CCDB0888>
>>>c = countdown(5)
>>>c.__next__()
Counting down!
5
>>>c.__next__()
4
  • __next__()调用使生成器函数一直运行,到下一条语句为之。此时__next__()将返回传递给yield的值,而且函数将暂时中止执行,再次调用next时,将执行yield之后的语句的,持续到函数返回为止。
    通常不会手动调用__next__(),而是使用for in 循环
Read more