Python 함수 매개 변수 분해
*args
와**kwargs
의 역방향 특성 을 정의 합 니 다.*args
와**kwars
는 함수 가 들 어 오 는 부정 확 한 수량의 실 삼 을 정의 할 수 있다.여기 서 함수 매개 변 수 는 여러 개 를 정의 하 는 것 으로 호출 할 때 하나의 집합 유형 대상(*또는*접두사 가 있 음),예 를 들 어
list
,tuple
,dict
,심지어generator
만 들 어 온 다음 에 함수 가 자동 으로 집합 대상 에서 대응 하 는 값 을 얻 을 수 있 습 니 다.아래 할당 시의 매개 변수 분해 와 Python 3.5 의 추가
*
**
작업 을 이해 할 수 있다 면 본 고 에서 설명 한 특성 을 이해 할 수 있 을 것 입 니 다.유일한 매개 변수 가 아 닌 집합 으로 함수 에 들 어 갈 때 는 앞 에
*
또는**
를 더 해 야 합 니 다.이 매개 변 수 는 전체 가 아 닌 함수 매개 변수 로 해 체 될 것 임 을 알 립 니 다.게다가 *
또는 **
자바 의@SafeVarargs
와 유사 한 효과 가 있 으 며,가장 가 까 운 것 은 스칼라 의foo(Array[String]("d", "e") : _*)
표기 법 이다.참조:자바 와 스칼라 가 변 삼 방식 을 호출 합 니 다.Python 의 할당 분해 작업
>>> a, b = [1, 2] # a, b = (1, 2)
>>> print(a, b)
1 2
>>> a, b = {'x': 1, 'y':2}
>>> print(a, b)
x y
>>> a, b = {'x': 1, 'y':2}.keys()
>>> print(a, b)
x y
>>> a, b = {'x': 1, 'y':2}.values()
>>> print(a, b)
1 2
>>> a, b = (x * x for x in range(2))
>>> print(a, b)
0 1
Python 3.5 의 추가 해체 작업
>>> [1, 2, *range(3), *[4, 5], *(6, 7)] # * ,flatten(unwrap)
[1, 2, 0, 1, 2, 4, 5, 6, 7]
>>> {'x': 1, **{'y': 2, 'z': 3}} # ** , flatten(unwrap)
{'x': 1, 'y': 2, 'z': 3}
어떤 것 은 함수 프로 그래 밍 중의 flatten
또는 unwrap
조작 과 같다.위의 기초 가 있 으 면 다시 원서 의 예 로 돌아 가 3-D 좌 표를 인쇄 하 는 함 수 를 정의 합 니 다.
def print_vector(x, y, z):
print('<%s, %s, %s>' % (x, y, z))
세 개의 매개 변 수 를 순서대로 전달 하 는 방식 은 언급 할 가치 가 없다.지금 은 함수 의 매개 변 수 를 어떻게 이용 하여 특성 을 분해 하 는 지 보고 하나의 집합 매개 변수 만 전달 하여 이print_vector
함수 가 집합 에서 해당 하 는 x
,y
와z
의 값 을 정확하게 얻 도록 한다.함수 매개 변수 분해 호출 예
>>> list_vec = [2, 1, 3]
>>> print_vector(*list_vec)
<2, 1, 3>
>>> print_vector(*(2, 1, 3))
<2, 1, 3>
>>> dict_vec = {'y': 2, 'z': 1, 'x': 3}
>>> print_vector(*dict_vec) # print_vector(*dict_vec.keys())
<y, z, x>
>>> print_vector(**dict_vec) # print_vector(dict_vec['x'], dict_vec['y'], dict_vec['z']
<3, 2, 1>
>>> genexpr = (x * x for x in range(3))
>>> print_vector(*genexpr)
<0, 1, 4>
>>> print_vector(*dict_vec.values()) # print_vector(*list(dict_vec.values()))
<2, 1, 3>
주의 **dict_vec
는 약간 다 릅 니 다.그 내용 은 함수print_vector
의 형 삼'x','y','z'를 key 의 세 가지 요소 로 해 야 합 니 다.다음은 각종 오류 입 니 다.
**dict_vec
요소 개수 가 맞지 않 거나 key 가 일치 하지 않 을 때의 오류
>>> print_vector(**{'y': 2, 'z': 1, 'x': 3})
<3, 2, 1>
>>> print_vector(**{'y': 2, 'z': 1, 'a': 3}) # 3 , x, y, z key
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
print_vector(**{'y': 2, 'z': 1, 'a': 3})
TypeError: print_vector() got an unexpected keyword argument 'a'
>>> print_vector(**{'y': 2, 'z': 1, 'x': 3, 'a': 4}) # x, y, z, ,key 'a'
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
print_vector(**{'y': 2, 'z': 1, 'x': 3, 'a': 4})
TypeError: print_vector() got an unexpected keyword argument 'a'
>>> print_vector(**{'y': 2, 'z': 1}) # key 'x'
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
print_vector(**{'y': 2, 'z': 1})
TypeError: print_vector() missing 1 required positional argument: 'x'
별 없 는 실수
>>> print_vector([2, 1, 3])
Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
print_vector([2, 1, 3])
TypeError: print_vector() missing 2 required positional arguments: 'y' and 'z'
집합 대상 전 체 를 첫 번 째 매개 변수 로 하기 때문에 y 와 z 가 들 어 오지 않 았 기 때문에 접두사*또는*알림 함수 로 매개 변 수 를 분해 해 야 합 니 다.집합 길이 가 함수 매개 변수 개수 와 일치 하지 않 을 때의 오류
>>> print_vector(*[2, 1]) # x=2, y=1, z ?
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
print_vector(*[2, 1])
TypeError: print_vector() missing 1 required positional argument: 'z'
>>> print_vector(*[2, 1, 3, 4]) # x=2, y=1, z=3, ( )
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
print_vector(*[2, 1, 3, 4])
TypeError: print_vector() takes 3 positional arguments but 4 were given
위의 두 오 류 는 할당 시의 분해 가 요소 개수 가 일치 하지 않 을 때의 오류 와 대응 합 니 다.
>>> a, b = [1]
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
a, b = [1]
ValueError: not enough values to unpack (expected 2, got 1)
>>> a, b = [1, 2, 3]
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
a, b = [1, 2, 3]
ValueError: too many values to unpack (expected 2)
물론 할당 할 때 Python 은 아래 처럼 할 수 있 습 니 다.
a, b, *c = [1, 2, 3, 4]
>>> print(a, b, c)
1 2 [3, 4]
보충(2020-07-02):파 이 썬 에서 반복 적 으로 해 체 된 용 어 는 Iterable Unpacking 입 니 다.관련 된 PEP 448,PEP 3132 를 찾 습 니 다.실제 사용 처 는 매우 크다.예 를 들 어 문자열 을 나 눌 때 자신 이 관심 이 있 는 필드 와 만 관계 된다.
line = '2020-06-19 22:14:00 2688 abc.json'
date, time, size, name = line.split() #
_, time, _, name = line.split() # time name
date, *_ = line.split() # date
*_, name = line.split() # name
date, *_, name = line.split() # date, name
이렇게 하면 분할 후의 값 을 색인 번호 로 인용 하 는 것 을 피 할 수 있다.예 를 들 어 split[0],split[2]등 유명한 변 수 는 실수 하기 쉽 지 않다.Python 은 분해 할 때 매우 똑똑 하 다 는 것 을 알 게 되 었 습 니 다.위 치 를 어떻게 대응 하 는 지 알 고 별표(*)를 사용 한 상황 을 알 게 되 었 습 니 다.앞에서 몇 개 를 뛰 어 넘 거나 중간 에 몇 개 를 뛰 어 넘 거나 마지막 에 몇 개의 요 소 를 수집 하 는 지 알 게 되 었 습 니 다.링크:
PEP 448 -- Additional Unpacking Generalizations
PEP 3132 -- Extended Iterable Unpacking
이상 은 Python 함수 매개 변 수 를 상세 하 게 분해 하 는 상세 한 내용 입 니 다.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에 따라 라이센스가 부여됩니다.