天天看点

Python高频面试题-211.解释filter函数的工作原理12. Python是按引用调用还是按值调用?13. 如何使用reverse函数反转一个列表?14. 字符串乘法是如何工作的?15. 列表乘法是如何工作的?16. 类中的“self”指的是什么?17. 如何在Python中连接列表?18. 浅拷贝和深拷贝之间有什么区别?19. 列表和数组有什么区别?20. 如何连接两个数组?

11.解释filter函数的工作原理

Filter函数顾名思义,是用来按顺序过滤元素。

每个元素都被传递给一个函数,如果函数返回True,则在输出序列中返回该元素;如果函数返回False,则将其丢弃。

def add_three(x):

    if x % 2 == 0:

        return True        

    else:

        return Falseli = [1,2,3,4,5,6,7,8][i for i in filter(add_three, li)]

#=> [2, 4, 6, 8]

注意上面所有不能被2整除的元素如何被删除的。

12. Python是按引用调用还是按值调用?

如果你在谷歌上搜索这个问题并阅读前几页,你就要准备好进入语义的迷宫了。你最好只是了解它的工作原理。

不可变对象(如字符串、数字和元组等)是按值调用的。请注意下面的例子,当在函数内部修改时,name的值在函数外部不会发生变化。name的值已分配给内存中该函数作用域的新块。

name = 'chr'

def add_chars(s):

   s += 'is'

   print(s)

add_chars(name)    

print(name)

#=> chris

#=> chr

可变对象(如列表等)是通过引用调用的。注意下面的例子中,函数外部定义的列表在函数内部的修改是如何影响到函数外部的。函数中的参数指向内存中存储li值的原始块。

li = [1,2]

def add_element(seq):

   seq.append(3)

   print(seq)

add_element(li)    

print(li)

#=> [1, 2, 3]

13. 如何使用reverse函数反转一个列表?

下面的代码对一个列表调用reverse()函数,对其进行修改。该方法没有返回值,但是会对列表的元素进行反向排序。

li = ['a','b','c']

li.reverse()

#=> ['a', 'b', 'c']

#=> ['c', 'b', 'a']

14. 字符串乘法是如何工作的?

让我们看看将字符串" cat"乘以3的结果。

'cat' * 3

#=> 'catcatcat'

该字符串将自身连接3次。

15. 列表乘法是如何工作的?

我们来看看将列表[1,2,3]乘以2的结果。

[1,2,3] * 2

#=> [1, 2, 3, 1, 2, 3]

输出的列表包含了重复两次的列表[1,2,3]的内容。

16. 类中的“self”指的是什么?

“self”引用类本身的实例。这就是我们赋予方法访问权限并且能够更新方法所属对象的能力。

下面,将self传递给__init__(),使我们能够在初始化时设置实例的颜色。

class Shirt:

    def __init__(self, color):

        self.color = color

s = Shirt('yellow')

s.color

#=> 'yellow'

17. 如何在Python中连接列表?

将2个列表相加,就是将它们连接在一起。但请注意,数组的工作方式不是这样的。

a = [1,2]

b = [3,4,5]

a + b

#=> [1, 2, 3, 4, 5]

18. 浅拷贝和深拷贝之间有什么区别?

我们将在一个可变对象(列表)的上下文中讨论这个问题,对于不可变的对象,浅拷贝和深拷贝的区别并不重要。

我们将介绍三种情况。

1. 引用原始对象。这将新对象li2指向li1所指向的内存中的同一位置。因此,我们对li1所做的任何更改也会在li2中发生。

li1 = [['a'],['b'],['c']]

li2 = li1

li1.append(['d'])

print(li2)

#=> [['a'], ['b'], ['c'], ['d']]

2. 创建原始对象的浅拷贝副本。我们可以使用list()构造函数来实现这一点。浅拷贝创建一个新对象,但是用对原始对象的引用填充它。因此,向原始列表li3中添加新对象不会传播到li4中,但是修改li3中的一个对象将传播到li4中。

li3 = [['a'],['b'],['c']]

li4 = list(li3)

li3.append([4])

print(li4)

#=> [['a'], ['b'], ['c']]

li3[0][0] = ['X']

#=> [[['X']], ['b'], ['c']]

3. 创建一个深拷贝副本。这是用copy.deepcopy()完成的。现在,这两个对象是完全独立的,并且对其中一个对象所做的更改不会对另外一个对象产生影响。

import copy

li5 = [['a'],['b'],['c']]

li6 = copy.deepcopy(li5)

li5.append([4])

li5[0][0] = ['X']

print(li6)

19. 列表和数组有什么区别?

注意:Python的标准库有一个array(数组)对象,但在这里,我特指常用的Numpy数组。

列表存在于python的标准库中。数组由Numpy定义。

列表可以在每个索引处填充不同类型的数据。数组需要同构元素。

列表上的算术运算可从列表中添加或删除元素。数组上的算术运算按照线性代数方式工作。

列表还使用更少的内存,并显著具有更多的功能。

20. 如何连接两个数组?

记住,数组不是列表。数组来自Numpy和算术函数,例如线性代数。

我们需要使用Numpy的连接函数concatenate()来实现。

import numpy as np

a = np.array([1,2,3])

b = np.array([4,5,6])

np.concatenate((a,b))

#=> array([1, 2, 3, 4, 5, 6])