题目:摘自Quant面试中的算法\编程\机器学习题讨论帖文兄:Quant面试中的算法\编程\机器学习题讨论帖zhuanlan.zhihu.comPython中的函数作为一个object的好处是什么?

简要介绍Python的垃圾回收机制

Python中有虚函数么?Python里的类继承与C++有什么不同?

为什么当定义一个函数时将list作为缺省参数(default parameter)是一个不好的做法?

请直接说出下面一段代码的输出结果并解释

def append(number, number_list = []):
number_list.append(number)
return number_list
print(append(1))
print(append(2)
def create_multipliers()
return [lambda x: i * x for i in range(5)]
for multiplier in create_multipliers():
print(multiplier(2))

1、答:Python中万物皆对象。函数也不例外。对象具有的三个通用属性:id、types和value函数均具备。

总结来看,函数作为对象(object)有如下特点。函数可以赋值给一个变量

例如:

def mi(x):
return x*x*x
a = mi
a(3)

输出结果为27。函数可以储存在容器

例如:

def mi(x):
return x*x*x
list = [mi,6,8]
list[0](3)

输出结果也为27。函数可以作为参数传递给另一个函数

例如:

def mi(x):
return x*x*x
def double(func):
return func(2)
double(mi)

输出结果为8。函数可以作为返回值

例如:

def mi(x):
return x*x*x
def double(x):
return mi(x)
double(5)

输出结果为125。函数可以嵌套

例如:

def get_length(text):
def clean(t):
return t[1:]
new_text = clean(text)
return new_text,len(new_text)
get_length('abcd')

输出结果为('bcd', 3)。实现_call__的类也可以作为函数。(这个暂时没搞明白)

2、答:还不理解,需要进一步学习。

3、答:还不理解,需要进一步学习。

4、为什么当定义一个函数时将list作为缺省参数(default parameter)是一个不好的做法?

答:python中缺省参数和函数是绑定的。当一个函数有一个默认参数,并且默认参数是空的可变类型时(dict和list),该可变类型只初始化一次,之后的每次操作,都在前一次的操作基础上操作。但是对于默认参数是不可变的类型时(tuple和字符串和数字),不会有这种情况。

5、第一题的输出结果为

[1]

[1,2]

原因同4。

第二题输出结果为

def create_multipliers()
return [lambda x: i * x for i in range(5)]
for multiplier in create_multipliers():
print(multiplier(2))
8
8
8
8
8

题中def create_multipliers()后少了一个冒号。

原因为由于Python中的“后期绑定”行为——闭包中用到的变量只有在函数被调用的时候才会被赋值。所以,在上面的代码中,任何时候,当返回的函数被调用时,Python会在该函数被调用时的作用域中查找 i 对应的值(这时,循环已经结束,所以 i 被赋上了最终的值——4)。

解决方法。利用默认参数来生成一个匿名的函数以便实现我们想要的结果。

def create_multipliers():
return [lambda x,i = i: i * x for i in range(5)]
for multiplier in create_multipliers():
print(multiplier(2))