Python 함수 매개 변수 분해

본 고 는'파 이 썬 트릭 스:더 북'이라는 책의 3.5 Function Argument Unpacking 의 노트 를 읽 고 이 해 를 넓 히 고자 한다.함수 매개 변수 해 체 는 가 변 매개 변수(VarArgs)*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,yz 의 값 을 정확하게 얻 도록 한다.
함수 매개 변수 분해 호출 예

>>> 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 함수 매개 변수 분해 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기