일반적인 인터뷰 질문에 의하면 파이썬 파이썬 폐쇄에 대해 이야기하기

여기에, 종종 일부 파이썬에 따라 우리는 보통 폐쇄에 파이썬과 관련된 문제에 대해 이야기 당신과 함께 질문을 참조!

주제 :

1. 폐쇄는 무엇입니까? 패키지를 폐쇄 정의?

2. 필기 간단한 폐쇄

로컬이 아닌 키워드 3. 변수 범위 지정 규칙?

폐쇄 4. 응용 프로그램

일반적인 인터뷰 질문에 의하면 파이썬 파이썬 폐쇄에 대해 이야기하기

 

답 포인트 :

1. 첫째, 우리는 변수 범위를 이해해야

예 # 
DEF의 TEST1 (A)
인쇄 (A)
프린트 (B)시 소정의 시간 단계를 수행 할 수있는 기능 번호.
#의 나가서 설명하자면 NameError : 글로벌 이름 'B'가 정의되지
TEST1. (1)
# 실시 두
. B = 6
DEF의 TEST2 (A)
인쇄 (A)
프린트 (B)
TEST2 # 1.6 (1)..
# 예 세
B의 = 6.
DEF 테스트 3 (a)
전단 (a)
기능을 실행 # 여전히이 시점에 제공되는 출력 (B)
#의 UnboundLocalError 로컬 변수 'B'전에 할당 참조
. B # 1 = 9 개 이상의 실시 회선 설정
TEST3 (1)

이러한 세 가지의 결과가 더 놀랄 것입니다 예를 들어 자바, 외부 전역 변수를 참조하는 비슷한 상황, 자바하지 오류와 같은 다른 언어를 배우고, 지역 변수는 다시 사용됩니다와 경우는 내부적으로 재 할당 값. 상황은 파이썬에서 동일하지 않습니다 그 기능을 컴파일 할 때, b는 지역 변수 인 것으로 판단, 동작 B 할당이 발견되었다, 그래서 당신은 b를 인쇄 할 때, 그것은 로컬 변수 B를 쿼리로 이동합니다, 우리는 어떤 과제를 찾을 수 없습니다 그것은 예외가 발생합니다.

이 설명에서 "유창 파이썬"을 참조 :

이것은 결함이 아니라 디자인 선택 : 파이썬은 변수를 선언 할 필요가 없습니다,하지만 몸 변수는 로컬 함수 정의에서 할당을 가정한다. 이것은, 자바 스크립트, 변수를 선언 할 필요가 없습니다 자바 스크립트의 동작보다 훨씬 더 있지만 지역 변수 (사용 VAR)와 같은 변수를 선언하는 것을 잊지 경우, 지식의 지역 변수의 전체 발생할 수 있습니다.

위 단어의 첫 번째 모습은 아주, 다음은,이 변수가 지역 변수임을 증명하는 변수에 할당이있는 경우 사실 단순히, 파이썬이 때문에,이 함수 본문에 믿는 설계, 이해하지 수 있으며, 그것은 단지 것이다 로컬 변수로부터 데이터를 판독한다. 이러한 디자인은 일부 잘못된 데이터로 이어지는 글로벌 변수의 값을 얻기 위해, 알지 못하고, 우리를 방지 할 수 있습니다.

해결책으로, 그것은 전역 변수의 우리의 사용을 설명하기 위해, 글로벌 키워드를 사용하는 것입니다. 다음 예는 다음과 같다 :

B = 6 
데프 TEST4 (a)
인쇄 (a)
글로벌 B # 1
잉크 (B) # 6
(B) = 9
인쇄 (b) # 9
TEST4 (1)

2. 폐쇄를 정의 간단히 말하면, 클로저의 개념은 우리가 함수 내 함수를 정의 할 때,이 기능은 외부 기능, 외부 함수의 리턴 값을 내부 임시 변수 내부 기능에 대한 참조 인 사용이며 우리는 폐쇄를 호출합니다. 비트 주위

다음과 같이 코드입니다 :

# 평균 코드를 산출하는 간단한 구현 

DEF의 get_avg () :
점수가 = [] # 외부 임시 변수

평균치 산출 # 내부 기능 : DEF inner_count_avg (발)
(발) # 외부 함수 scores.append를 임시 사용을 가변
환원 액 (점수) / LEN ( 스코어) #은 계산 평균 반환

# 외부 함수 inner_count_avg 창 내부 기능에 대한 참조를 반환

AVG = get_avg ()
인쇄 (AVG (10)) # 10
인쇄 (AVG를 (. 11)) # 10.5
...

3.nonlocal 키워드. 위의 코드는, 작은 결함, 반복 계산의 많은, 우리는 새로운 평균값의 새 값을 얻기 위해 통과 할 때, 다른 이전 시간의 합이 외부의 임시 변수에 저장 될 수있다. 그래서 우리는 자연스럽게 다음 코드의 생각 :

코드 번호가 평균의 계산의 간단한 구현 버전 향상 
DEF의 get_avg을 () :
스코어 0 = # 목록의 적분 값에 외부의 임시 변수는하기
의 변수를 추가하는 동안, 기록의 수 = 0 # 카운트
(inner_count_avg 데프 브로) : 평균 계산 # 내부 함수
임시 변수를 사용하여 + = 브로 # 외부 기능 점수
. = + COUNT 1 명
리턴 점수 / COUNT 번호는 계산 된 평균 반환
# 외부 함수 inner_count_avg 복귀 내부 함수에 대한 참조를 반환
평균 = get_avg ()
인쇄 (AVG (10)) # 오류
...

변수 행동 규칙 : 이유이 오류는 점 1을 참조하십시오. 점수 + = 브로는 사실 점수 = 점수 + 계산해 할당하여, 그것을 로컬 변수의 점수를 고려하기 때문이다. 점수 카운트가 지역 변수 둘 다 get_ave 함수 내에서 정의되어 있기 때문에 우리는 글로벌 키워드를 사용하는 방법이 없습니다. 우리는 목록을 사용 않는 이유, 그것은이 문제를 표시하지 않는 이유는 무엇입니까? 우리가 list.append () 메소드를 사용하고 있기 때문에 잘 이해, 그것은 할당이 없습니다. 당신은 간단하게 변경 가능한 객체 (즉, 우리가 추가 및 삭제와 변수 주소 값이 변하지을하고 그것의 몇 가지 방법을 호출하여 변경할 수 있습니다) 생각할 수있는이 문제가 존재하지 않는, 다음이 변경 가능한 개체를하지 않습니다.

우리는 파이썬 3에서 로컬이 아닌 키워드가이 문제를 해결 소개 :

# 평균의 간단한 계산 코드 두개의 개선 된 버전을 달성 
DEF의 get_avg을 () :
스코어 0 = # 목록의 적분 값에 외부의 임시 변수는하기
의 변수를 추가하는 동안, 기록의 수 = 0 # 카운트
(inner_count_avg 데프 브로) 평균치 산출 # 내부 함수
비 로컬 COUNT는 스코어
스코어가 + # = 임시 변수를 사용하여 브로 외부 기능
. = + COUNT 1 명
리턴 점수 / COUNT 번호는 계산 된 평균 반환
외부 함수 내부 기능을 리턴 # inner_count_avg 반환 참조
AVG get_avg = ()
인쇄 (AVG (10)) # 에러

당신은 환경에서 파이썬이 그것을 해결하는 방법을해야한다고 말할 수 있는가? 사실 EMM ~, 그것은 방법이다, 생각은 불변의 개체 변수 객체가 될 수 있습니다 될 것입니다. 특정 코드는 다음과 같이 :

# - * - 코딩 :. UTF-8 - * - 
클래스 점수 :
패스
DEF () get_avg :
클래스 오브젝트에 S = 점수 () 중 #
= s.scores 정수 나눗셈이 분획 파이썬 2 버려진다는 0.0 # 참고 때문에 정의하는 부동 소수점
s.count = 0
DEF의 inner_get_avg (발)
. s.count + = 1
s.scores + = 브로가
s.scores를 리턴 / s.count
inner_get_avg 반환
AVG get_avg = ()
인쇄 (AVG (10)) # 10.0
인쇄 (평균 (11)) # 10.5

폐쇄 4. 응용 프로그램 : 첫째 장식은 장식은 함수가 장식 할 수정 새로운 기능을 추가 달성하는 것입니다. 우리는 기능을 수정하는 함수 내부에있는 경우 대부분의 경우가 폐쇄에 사용되는 장식한다. 간단한 예 :

DEF 데코 (FUNC) : 로컬 변수 FUNC의 # 외부 함수 
DEF 래퍼 (* 인수 ** kwargs로) : # 래퍼 함수의 매개를 통해 전달되는 수락
(** kwargs로 * 인수 FUNC를 반환 ) #을 로컬 외부 함수를 이용하여 변수 FUNC의
반환 warpper의
@decorator의
DEF의 basic_func (이름) :
'내 이름은'인쇄 이름
#은 동일합니다
decorator_func (FUNC)

계산이 반복 될 때 우리가 볼 수있는 전에 평균의 또 다른 적용 예는 효율을 향상시킬 수있다. 둘째,이, 더 중요한 애플리케이션 시나리오이다 "지연 평가"이 기능의 사용이다, 이것은 장고의 검색어 세트에 반영하고있다. 우리는 ORM의 SQL 쿼리를 사용 할 때, 자주 필터를 높이기 위해 다른 판단 조건에 따라, + 필터 시간이 정말 최종 결과가 실제로 쿼리를 수행 할 수 쿼리를 수행하지 않습니다.

여기 또한, 우리가 일반적으로 파이썬의 폐쇄에 대해 이야기 당신과 함께 볼 몇 가지 파이썬 일반적인 면접 질문에 따라, 하를 추가 할 수있는 상호 보완적인 파트너 환영 메시지가있다! 나는 우리가 서로 배울 수있는, 아 진행 바랍니다!

추천

출처www.cnblogs.com/cherry-tang/p/11202194.html