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 진급-함수 기본 매개 변수(상세 설명)는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 도 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.