백엔드 개발 파이썬 튜토리얼 Python 인터뷰에서 테스트해야 하는 코드 질문

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

Feb 23, 2019 am 10:25 AM

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Apr 01, 2025 pm 05:09 PM

Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? 한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? Apr 01, 2025 pm 11:15 PM

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? 10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? 중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

정규 표현이란 무엇입니까? 정규 표현이란 무엇입니까? Mar 20, 2025 pm 06:25 PM

정규 표현식은 프로그래밍의 패턴 일치 및 텍스트 조작을위한 강력한 도구이며 다양한 응용 프로그램에서 텍스트 처리의 효율성을 높입니다.

Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Apr 01, 2025 pm 10:51 PM

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

인기있는 파이썬 라이브러리와 그 용도는 무엇입니까? 인기있는 파이썬 라이브러리와 그 용도는 무엇입니까? Mar 21, 2025 pm 06:46 PM

이 기사는 Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask 및 요청과 같은 인기있는 Python 라이브러리에 대해 설명하고 과학 컴퓨팅, 데이터 분석, 시각화, 기계 학습, 웹 개발 및 H에서의 사용에 대해 자세히 설명합니다.

문자열을 통해 객체를 동적으로 생성하고 방법을 파이썬으로 호출하는 방법은 무엇입니까? 문자열을 통해 객체를 동적으로 생성하고 방법을 파이썬으로 호출하는 방법은 무엇입니까? Apr 01, 2025 pm 11:18 PM

파이썬에서 문자열을 통해 객체를 동적으로 생성하고 메소드를 호출하는 방법은 무엇입니까? 특히 구성 또는 실행 해야하는 경우 일반적인 프로그래밍 요구 사항입니다.

See all articles