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

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에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Numpy를 사용하여 다차원 배열을 어떻게 생성합니까?Numpy를 사용하여 다차원 배열을 어떻게 생성합니까?Apr 29, 2025 am 12:27 AM

다음 단계를 통해 Numpy를 사용하여 다차원 배열을 만들 수 있습니다. 1) Numpy.array () 함수를 사용하여 NP.Array ([[1,2,3], [4,5,6]]과 같은 배열을 생성하여 2D 배열을 만듭니다. 2) np.zeros (), np.ones (), np.random.random () 및 기타 함수를 사용하여 특정 값으로 채워진 배열을 만듭니다. 3) 서브 어레이의 길이가 일관되고 오류를 피하기 위해 배열의 모양과 크기 특성을 이해하십시오. 4) NP.Reshape () 함수를 사용하여 배열의 모양을 변경하십시오. 5) 코드가 명확하고 효율적인지 확인하기 위해 메모리 사용에주의를 기울이십시오.

Numpy 어레이에서 '방송'의 개념을 설명하십시오.Numpy 어레이에서 '방송'의 개념을 설명하십시오.Apr 29, 2025 am 12:23 AM

BroadcastingInnumpyIsamethodtoperformoperationsonArraysoffferentShapesByAutomicallyAligningThem.itsimplifiesCode, enourseadability, andboostsperformance.here'showitworks : 1) smalraysarepaddedwithonestomatchdimenseare

데이터 저장을 위해 목록, Array.Array 및 Numpy Array 중에서 선택하는 방법을 설명하십시오.데이터 저장을 위해 목록, Array.Array 및 Numpy Array 중에서 선택하는 방법을 설명하십시오.Apr 29, 2025 am 12:20 AM

forpythondatastorage, chooselistsforflexibilitywithmixeddatatypes, array.arrayformemory-effic homogeneousnumericaldata, andnumpyarraysforadvancednumericalcomputing.listsareversatilebutlessefficipforlargenumericaldatasets.arrayoffersamiddlegro

파이썬 목록을 사용하는 것이 배열을 사용하는 것보다 더 적절한 시나리오의 예를 제시하십시오.파이썬 목록을 사용하는 것이 배열을 사용하는 것보다 더 적절한 시나리오의 예를 제시하십시오.Apr 29, 2025 am 12:17 AM

pythonlistsarebetterthanarraysformanagingDiversEdatatypes.1) 1) listscanholdementsofdifferentTypes, 2) thearedynamic, weantEasyAdditionSandremovals, 3) wefferintufiveOperationsLikEslicing, but 4) butiendess-effectorlowerggatesets.

파이썬 어레이에서 요소에 어떻게 액세스합니까?파이썬 어레이에서 요소에 어떻게 액세스합니까?Apr 29, 2025 am 12:11 AM

toaccesselementsInapyThonArray : my_array [2] AccessHetHirdElement, returning3.pythonuseszero 기반 인덱싱 .1) 사용 positiveAndnegativeIndexing : my_list [0] forthefirstelement, my_list [-1] forstelast.2) audeeliciforarange : my_list

파이썬에서 튜플 이해력이 가능합니까? 그렇다면, 어떻게 그리고 그렇지 않다면?파이썬에서 튜플 이해력이 가능합니까? 그렇다면, 어떻게 그리고 그렇지 않다면?Apr 28, 2025 pm 04:34 PM

기사는 구문 모호성으로 인해 파이썬에서 튜플 이해의 불가능성에 대해 논의합니다. 튜플을 효율적으로 생성하기 위해 튜플 ()을 사용하는 것과 같은 대안이 제안됩니다. (159 자)

파이썬의 모듈과 패키지는 무엇입니까?파이썬의 모듈과 패키지는 무엇입니까?Apr 28, 2025 pm 04:33 PM

이 기사는 파이썬의 모듈과 패키지, 차이점 및 사용법을 설명합니다. 모듈은 단일 파일이고 패키지는 __init__.py 파일이있는 디렉토리이며 관련 모듈을 계층 적으로 구성합니다.

파이썬에서 Docstring이란 무엇입니까?파이썬에서 Docstring이란 무엇입니까?Apr 28, 2025 pm 04:30 PM

기사는 Python의 Docstrings, 사용법 및 혜택에 대해 설명합니다. 주요 이슈 : 코드 문서 및 접근성에 대한 문서의 중요성.

See all articles

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구