python-- 문제점
6462 단어 python 기반
1. 귀속 생성기
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
flatten을 호출할 때 두 가지 가능성이 있습니다. (귀속을 처리할 때 모두 마찬가지입니다.) 기본 조건과 귀속 조건입니다.기선 조건에서 이 함수는 하나의 원소(예를 들어 하나의 수)를 전개해야 한다.이 경우 for 순환은 TypeError 이상을 일으킬 수 있으며, 이 생성기는 하나의 요소만 생성합니다.그러나 목록(또는 다른 교체 가능한 대상)을 펼치려면 작업을 해야 한다. 모든 하위 목록을 훑어보고 flatten을 호출한 다음 다른 for 순환을 사용하여 펼친 하위 목록의 모든 요소를 생성한다.이것은 좀 불가사의해 보일 수도 있지만, 확실히 가능하다.
>>> list(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8]))
[1, 2, 3, 4, 5, 6, 7, 8]
그러나 이 해결 방안에는 문제가 하나 있다.nested가 문자열이나 문자열과 유사한 대상이라면, 서열에 속하기 때문에 TypeError 이상을 일으키지 않지만, 교체를 원하지 않습니다.
함수flatten에서 문자열과 유사한 대상을 교체해서는 안 된다. 주요 원인은 두 가지가 있다.우선, 문자열과 유사한 대상을 펼쳐야 할 서열이 아니라 원자값으로 간주하고 싶습니다.그 다음에 이러한 대상을 교체하면 무한한 귀속을 초래할 수 있다. 왜냐하면 문자열의 첫 번째 요소는 길이가 1인 문자열이고 길이가 1인 문자열의 첫 번째 요소는 문자열 자체이기 때문이다.이런 문제를 처리하려면 생성기 시작에서 검사를 해야 한다.객체가 문자열과 유사한지 확인하려면 TypeError 예외를 유발하는지 여부 ① 를 확인하는 것이 가장 간단하고 빠른 방법입니다.이 체크를 추가한 생성기는 다음과 같습니다.
def flatten(nested):
try:
# :
try: nested + ''
except TypeError: pass
else: raise TypeError
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
보시다시피 표현식 nested +'TypeError 이상이 발생하면 이 이상을 무시합니다.TypeError 이상이 발생하지 않으면 내부try 문장의else 자구가 TypeError 이상을 일으켜 외부의 excpet 자구에서 문자열과 유사한 대상을 봉하지 않고 생성합니다.알겠나?다음 예제에서는 이 버전을 문자열에도 사용할 수 있습니다.
>>> list(flatten(['foo', ['bar', ['baz']]]))
['foo', 'bar', 'baz']
형식 검사가 실행되지 않았습니다. nested가 문자열인지 확인하지 않았습니다. 문자열과 연결될 수 있는지 확인하지 않았을 뿐입니다.이러한 검사에 있어서 더욱 자연스러운 대체 방안은 isinstance와 문자열과 문자열과 유사한 대상의 추상적인 클래스를 사용하는 것이지만 유감스럽게도 이러한 표준 클래스가 없다.또한 UserString에서도 유형이str인지 확인할 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python-- 문제점(귀속을 처리할 때 모두 마찬가지입니다.) 기본 조건과 귀속 조건입니다.기선 조건에서 이 함수는 하나의 원소(예를 들어 하나의 수)를 전개해야 한다.이 경우 for 순환은 TypeError 이상을 일으킬 수 있으며,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.