Python 진급-함수 기본 매개 변수(상세 설명)

기본 매개 변수
python 은 함수 호출 을 간소화 하기 위해 기본 매개 변수 체 제 를 제공 합 니 다.

def pow(x, n = 2):

 r = 1
 while n > 0:
  r *= x
  n -= 1
 return r
이렇게 하면 pow 함 수 를 호출 할 때 마지막 매개 변 수 를 생략 하고 쓰 지 않 을 수 있 습 니 다.

print(pow(5)) # output: 25
기본 매개 변수 가 있 는 함 수 를 정의 할 때 다음 과 같이 주의해 야 합 니 다.
필수 매개 변 수 는 앞 에 있어 야 합 니 다.기본 매개 변 수 는 뒤에 있 습 니 다.
기본 매개 변 수 를 설정 하 시 겠 습 니까?일반적으로 매개 변수 값 이 작 게 변 하 는 것 을 기본 매개 변수 로 설정 합 니 다.
python 표준 라 이브 러 리 실천
python 내장 함수:

print(*objects, sep=' ', end='
', file=sys.stdout, flush=False)
함수 서명 을 통 해 알 수 있 듯 이 print(hello python)와 같은 간단 한 호출 된 인쇄 문 구 를 사용 하여 실제 적 으로 많은 기본 값 이 들 어 왔 고 기본 매개 변 수 는 함수 호출 을 매우 간단 하 게 만 들 었 습 니 다.
2.잘못된 기본 매개 변수
공식 예제 주 소 를 참조 하 십시오:

def bad_append(new_item, a_list=[]):
 a_list.append(new_item)
 return a_list

print(bad_append('1'))
print(bad_append('2'))
이 예제 는 예상 한 대로 인쇄 되 지 않 았 습 니 다.

['1']
['2']
인쇄 된 것 입 니 다:

['1']
['1', '2']
사실 이 오류 문 제 는 기본 매개 변수 가 아니 라 기본 매개 변수 초기 화 에 대한 이해 가 잘못 되 었 습 니 다.
3.기본 매개 변수 초기 화
실제로 기본 매개 변수의 값 은 정의 할 때 한 번 만 계산 되 기 때문에 기본 매개 변수 호출 함 수 를 사용 할 때마다 기본 매개 변수 값 은 같 습 니 다.
우 리 는 직관 적 인 예 로 설명 한다.

import datetime as dt
from time import sleep


def log_time(msg, time=dt.datetime.now()):

 sleep(1) #       
 print("%s: %s" % (time.isoformat(), msg))

log_time('msg 1')
log_time('msg 2')
log_time('msg 3')
이 프로그램 을 실행 하면 출력 은:

2017-05-17T12:23:46.327258: msg 1
2017-05-17T12:23:46.327258: msg 2
2017-05-17T12:23:46.327258: msg 3
sleep(1)를 사용 하여 스 레 드 를 1 초 동안 멈 추 더 라 도 프로그램 이 빨리 실행 되 는 요 소 를 제거 합 니 다.출력 에서 세 번 호출 하여 인쇄 한 시간 은 같 습 니 다.즉,세 번 호출 에서 기본 매개 변수 time 의 값 은 같 습 니 다.
위의 예 는 문 제 를 완전히 설명 할 수 없 을 수도 있 습 니 다.다음은 기본 매개 변수의 메모리 주 소 를 관찰 하 는 방식 으로 설명 합 니 다.
우선 내장 함수 id(object)를 알 아야 합 니 다.
id(object)
Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
CPython implementation detail: This is the address of the object in memory.
즉,id(object)함수 가 대상 의 유일한 표 지 를 되 돌려 줍 니 다.이 표 지 는 대상 의 생명 주기 동안 유일 하고 변 하지 않 는 정수 이다.겹 치 는 생명주기 에서 두 대상 은 같은 id 값 을 가 질 수 있 습 니 다.
CPython 해석 기 구현 중 id(object)의 값 을 대상 으로 하 는 메모리 주소 입 니 다.
다음 예제 에서 id(object)함 수 를 사용 하여 문 제 를 명확 하 게 설명 합 니 다.

def bad_append(new_item, a_list=[]):
 
 print('address of a_list:', id(a_list))
 a_list.append(new_item)
 return a_list

print(bad_append('1'))
print(bad_append('2'))
output:

address of a_list: 31128072
['1']
address of a_list: 31128072
['1', '2']
두 번 bad 호출append,기본 매개 변수 alist 의 주 소 는 같 습 니 다.
그리고 alist 는 가 변 대상 입 니 다.append 방법 으로 새로운 요 소 를 추가 하면 list 대상 의 재 생 성,주소 의 재 분 배 를 초래 하지 않 습 니 다.이렇게 해서'마침'은 기본 매개 변수 가 가리 키 는 주소 에서 대상 을 수정 하고 다음 호출 에서 이 주 소 를 다시 사용 할 때 지난번 의 수정 을 볼 수 있 습 니 다.
그러면 상기 출력 이 나타 나 는 것 은 이상 하지 않다.왜냐하면 그들 은 원래 같은 메모리 주 소 를 가리 키 기 때문이다.
4.가 변 과 가 변 하지 않 는 기본 매개 변수
기본 매개 변수 가 가 변 유형 대상 과 가 변 유형 대상 을 가리 킬 때 서로 다른 행동 을 나타 낸다.
가 변 기본 매개 변수의 표현 은 상소 예시 와 같다.
기본 매개 변수
먼저 예 시 를 보 자.

def immutable_test(i = 1):
 print('before operation, address of i', id(i))
 i += 1
 print('after operation, address of i', id(i))
 return i
 
print(immutable_test())
print(immutable_test())
Output:

before operation, address of i 1470514832
after operation, address of i 1470514848
2
before operation, address of i 1470514832
after operation, address of i 1470514848
2
두 번 째 호출 시 기본 매개 변수 i 의 값 은 첫 번 째 호출 의 영향 을 받 지 않 음 이 분명 합 니 다.i 가 가리 키 는 것 은 가 변 적 이지 않 은 대상 이기 때문에 i 의 조작 은 메모리 재 분 배 를 초래 하고 대상 을 다시 만 들 수 있 습 니 다.그러면 함수 에서 i+=1 이후 이름 i 는 다른 주 소 를 가리 키 고 있 습 니 다.기본 매개 변수 규칙 에 따라 다음 호출 시 i 가 가리 키 는 주소 인지 함수 정의 시 부 여 된 주소 인지 이 주소 의 값 1 은 변경 되 지 않 았 습 니 다.
사실 가 변 기본 매개 변수 와 가 변 기본 매개 변 수 를 여기에 두 고 토론 하 는 것 은 큰 가치 가 없다.다른 언어 에서 이른바 값 전달 이 냐 인용 전달 이 냐 하 는 것 처럼 기본 매개 변수 에 만 영향 을 미 치 는 것 이 아니다.
5.최고의 실천
가 변 적 이지 않 은 기본 매개 변수의 여러 번 호출 은 아무런 영향 을 주지 않 습 니 다.가 변 적 인 기본 매개 변수의 여러 번 호출 결 과 는 예상 에 부합 되 지 않 습 니 다.그러면 가 변 기본 인 자 를 사용 할 때 함수 정의 시 한 번 만 초기 화 할 수 없고 호출 할 때마다 초기 화 해 야 합 니 다.
가장 좋 은 실천 은 함 수 를 정의 할 때 가 변 기본 매개 변수의 값 을 None 로 지정 하고 함수 체 내부 에서 기본 매개 변수의 값 을 다시 연결 하 는 것 입 니 다.다음은 위의 두 가지 가 변 기본 매개 변수 예제 에 대한 가장 좋 은 실천 응용 입 니 다.

def good_append(new_item, a_list = None):

 if a_list is None:
  a_list = []

 a_list.append(new_item)
 return a_list

print(good_append('1'))
print(good_append('2'))
print(good_append('c', ['a', 'b']))

import datetime as dt
from time import sleep

def log_time(msg, time = None):

 if time is None:
  time = dt.datetime.now()

 sleep(1)
 print("%s: %s" % (time.isoformat(), msg))

log_time('msg 1')
log_time('msg 2')
log_time('msg 3')
이상 의 Python 진급-함수 기본 매개 변수(상세 설명)는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 도 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기