이 기사의 내용은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!