>  기사  >  백엔드 개발  >  Python 인터뷰에서 테스트해야 하는 코드 질문

Python 인터뷰에서 테스트해야 하는 코드 질문

不言
不言앞으로
2019-02-23 10:25:204592검색

Python 인터뷰에서 테스트해야 하는 코드 질문

이 기사의 내용은 Python 인터뷰에서 테스트해야 하는 코드 질문에 대한 것입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

관련 기사 추천: "2020 Python 인터뷰 질문 요약(최신)"

질문 1: 다음 코드의 출력은 무엇입니까? 답을 말하고 설명하세요.

class Parent(object):
    x = 1
 
class Child1(Parent):
    pass
 
class Child2(Parent):
    pass
 
print Parent.x, Child1.x, Child2.x
Child1.x = 2
print Parent.x, Child1.x, Child2.x
Parent.x = 3
print Parent.x, Child1.x, Child2.x

답은

1 1 1
1 2 1
3 2 3

입니다. 여러분을 혼란스럽게 하거나 놀라게 할 수 있는 것은 마지막 줄의 출력이 3 2 1 대신 3 2 3이라는 것입니다. Parent.x의 값을 변경하면 Child2.x의 값도 변경되지만 동시에 Child1.x의 값은 변경되지 않는 이유는 무엇입니까?

이 답변의 핵심은 Python에서 클래스 변수가 내부적으로 사전으로 처리된다는 것입니다. 현재 클래스의 사전에 변수 이름이 없으면 참조된 변수 이름을 찾을 때까지 조상 클래스(예: 부모 클래스)를 검색합니다(참조된 변수 이름이 자신의 클래스에도 없고 참조된 변수 이름도 아닌 경우). 조상 클래스) 클래스에서는 AttributeError 예외가 발생합니다.

따라서 상위 클래스에서 x = 1로 설정하면 해당 클래스와 해당 하위 클래스에 대한 참조에서 클래스 변수 X가 값 1을 갖게 됩니다. 이는 첫 번째 print 문의 출력이 1 1 1이기 때문입니다.

나중에 해당 하위 클래스 중 하나라도 값을 재정의하면(예: Child1.x = 2 문 실행) 값은 하위 클래스에서만 변경됩니다. 이것이 두 번째 print 문의 출력이 1 2 1인 이유입니다.

마지막으로 상위 클래스에서 값이 변경된 경우(예를 들어 Parent 문을 실행합니다. 하위 클래스는 Child2입니다). 이것이 세 번째 인쇄 출력이 3 2 3인 이유입니다.

질문 2: 다음 코드의 출력은 무엇입니까? 답과 설명을 들려주세요.

def p1(x,y):
    print("%s/%s = %s" % (x, y, x/y))

def p2(x,y):
    print("%s//%s = %s" % (x, y, x//y))

p1(5,2)
p1(5.,2)
p2(5,2)
p2(5.,2.)
5/2 = 2
5.0/2.0=2.5
5/2=2
5/2=2

Answer

이 답변은 실제로 Python 2를 사용하는지 Python 3을 사용하는지에 따라 다릅니다.

Python 3에서 원하는 출력은 다음과 같습니다.

5/2 = 2.5
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

Python 2에서 위 코드의 출력은 다음과 같습니다.

5/2 = 2
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

기본적으로 두 피연산자가 모두 정수인 경우 Python 2는 자동으로 정수 계산을 수행합니다. 결과적으로 5/2의 값은 2인 반면 5./2의 값은 "2.5``입니다.

그러나 Python 2에서는 이 동작을 재정의할 수 있습니다(예: Python에서 원하는 것과 동일한 결과를 얻기 위해). Python 3 결과), 다음 가져오기를 추가하여:

from__future__ import pision
또한 "이중 대시"(//) 연산자는 피연산자의 유형에 관계없이 항상 정수 나누기를 수행하므로 5.0// 2.0 값은 2.0입니다.

참고: Python 3에서 / 연산자는 부동 소수점 나누기를 수행하고 // 정수 나누기를 수행합니다(즉, 몫에는 10 // 3과 같은 나머지가 없습니다. 결과는 3입니다. 나머지는 잘립니다. 그리고 (-7) // 3의 결과는 -3입니다. 이 알고리즘은 다른 많은 프로그래밍 언어와 다릅니다. 정수 나누기 연산은 다음 방향으로 값을 취한다는 점에 유의해야 합니다. 0. Python 2에서 /는 정수 나누기입니다. 이는 Python 3의 // 연산자와 동일합니다.)

질문 3: 다음 코드는 무엇을 출력합니까?

list = ['a', 'b', 'c', 'd', 'e']
print list[10:]

Answer
위 내용은 다음과 같습니다. 코드는 [ ]를 출력하고 IndexError를 발생시키지 않습니다. 예상한 대로 목록 인덱스를 초과하는 멤버에 액세스하려고 하면 IndexError가 발생합니다(예: 위 목록의 list[10]에 액세스). 목록 멤버 수를 초과하는 인덱스로 시작하는 목록에 액세스하면 IndexError가 발생하고 빈 목록만 반환됩니다.

버그가 발생하고 이 문제를 추적하기가 어렵습니다.

질문 4: 다음은 무엇입니까? 답을 제시하고 설명해주세요.

def multipliers():
    return [lambda x : i * x for i in range(4)]

print [m(2) for m in multipliers()]

원하는 결과

Answer

위 코드의 출력은 [0, 2, 4, 6] 대신 [6, 6, 6, 6]입니다.

이 이유는 지연 바인딩 때문입니다. 이는 Python의 클로저에 의해 호출될 때 클로저의 변수가 내부 함수에 있음을 의미합니다. 따라서 결과는 multipliers()에 의해 반환된 함수가 호출될 때 i의 값은 다음과 같습니다. 호출될 때 주변 스코프에서 조회되고, 그때쯤에는 무엇이든 반환됩니다. 함수가 호출되고 for 루프가 완료되며 i의 최종 값은 3입니다. 따라서 반환되는 각 함수의 곱셈 값은 3입니다. 따라서 위 코드에는 2와 같은 값이 전달되고 6이라는 값이 반환됩니다. (예: 3 x 2)

(顺便说下,正如在 The Hitchhiker’s Guide to Python 中指出的,这里有一点普遍的误解,是关于 lambda 表达式的一些东西。一个 lambda 表达式创建的函数不是特殊的,和使用一个普通的 def 创建的函数展示的表现是一样的。)

这里有两种方法解决这个问题

最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如:

def multipliers():
    return [lambda x, i=i : i * x for i in range(4)]

另外一个选择是,你可以使用 functools.partial 函数

from functools import partial
from operator import mul

def multipliers():
    return [partial(mul, i) for i in range(4)]

问题五:以下的代码的输出将是什么? 说出你的答案并解释?

def extendList(val, list=[]):
    list.append(val)
    return list

list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')

print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

你将如何修改 extendList 的定义来产生期望的结果

以上代码的输出为:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

许多人会错误的认为 list1 应该等于 [10] 以及 list3 应该等于 [‘a’]。认为 list 的参数会在 extendList 每次被调用的时候会被设置成它的默认值 [ ]。

尽管如此,实际发生的事情是,新的默认列表仅仅只在函数被定义时创建一次。随后当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。

因此,list1 和 list3 是操作的相同的列表。而 "`list2是操作的它创建的独立的列表(通过传递它自己的空列表作为list"参数的值)。

extendList 函数的定义可以做如下修改,但,当没有新的 list 参数被指定的时候,会总是开始一个新列表,这更加可能是一直期望的行为。

def extendList(val, list=None):
    if list is None:
        list = []
    list.append(val)
    return list

使用这个改进的实现,输出将是:

list1 = [10]
list2 = [123]
list3 = ['a']

相关学习推荐:python视频教程

위 내용은 Python 인터뷰에서 테스트해야 하는 코드 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제