2017-10-01 14 views
1

허용되는 숫자는 while 루프를 사용하여 2 또는 3으로 나눌 수있는 숫자 만 허용되는지 확인하기 위해 코드를 작성하려고합니다. 다음 코드는 여기에 있습니다.허용되는 숫자는 2 또는 3으로 나눌 수있는 숫자입니다.

나는 '@ 25 asdf을'같은 문자열을 테스트 할 때
def has_divisible_numbers(x): 
    countdigit = 0 
    while countdigit < len(x): 
    if x[countdigit].isdigit == True: 
     y = x[countdigit] 
     if y%2 == 0 or y%3 == 0: 
     return True 
     else: 
     return False 
     countdigit += 1 
    else: 
     countdigit += 1 
    return True 

하지만이 코드는 문자열에있는 모든 이들의를 첫 번째 숫자를 테스트 할 수 있습니다 것을 깨달았다 따라서는 True를 반환. 그래서 그것을 수정하는 방법을 궁금 해서요 내 코드에 다른 문제가 있습니까? 감사!

답변

0

return True 첫 번째 인스턴스를 치기 때문에 - 기본적으로이 지점에서 while 루프가 깨졌습니다. 2이 (가) 25입니다.

당신은 기본적으로 시작시 is_allowed = True 다음과 같은

is_allowed &= (y%2 == 0 or y%3 == 0) 

을 수행해야합니다.

모든 숫자를 2 또는 3으로 나눌 수 있으면 참입니다.

Sidenote, 더 많은 테스트 케이스를 작성하여 처음부터 모델을 빌드 할 수 있습니다. 간단한 사례 (예 : "2", "3", "5", "23" 등)를 시도한 후에 더 세게 시도해보세요.

2

코드에 여러 가지 문제가 있습니다.

if x[countdigit].isdigit == True:isdigit 메서드는 호출하지 않습니다. 다음과 같이 호출 : isdigit()

y = x[countdigit] 다음 if y%2 == 0 or y%3 == 0:을 여기에 문자열을 나눌 경우 3 또는 2에 의해 확인되는 최초의 정수로 문자열을 변환 : 여기 y = int(x[countdigit])

if y%2 == 0 or y%3 == 0: return True 당신이 때 함수에서 반환하는 3 또는 2로 나눌 수있는 숫자가 나타납니다. 나머지 숫자를 확인하지 않고 돌아오고 있습니다. 즉시 반환하는 대신 아무것도하지 마십시오.

def has_divisible_numbers(x): 
    countdigit = 0 
    while countdigit < len(x): 
    if x[countdigit].isdigit() == True: 
     y = int(x[countdigit]) 
     if y%2 == 0 or y%3 == 0: 
     pass 
     else: 
     return False 
     countdigit += 1 
    else: 
     countdigit += 1 
    return True 

s = '[email protected]' 
r = has_divisible_numbers(s) 
print(r) 
0

귀하의 주요 문제는 당신이 return 너무 일찍 True을 보내고있어 점이다 if y%2 == 0 or y%3 == 0: pass

여기에 전체 코드입니다. 첫 번째 유효한 숫자가 표시되는 즉시 현재 코드가 반환되지만 나중에 유효하지 않은 숫자가있을 수 있으므로 조기입니다. 대신 return False 부분을 if/else 개 조합으로 유지해야합니다. 코드의 가장 직접적인 번역 passreturn True을 (아무것도 안하는) 대체하는 것입니다하지만, 더 나은 방법이없는 else로, 조건 및 만 if를 반전하는 것입니다 : 다른

if not (y%2 == 0 or y%3 == 0): # or distribute the negation: if y%2 != 0 or y%3 != 0 
    return False 
# no else for this if! 

있습니다

문제 나는 당신이 현재의 코드를 가지고 있다고 생각합니다. 가장 큰 문제는 숫자 목록이나 문자열의 문자를 반복하는지 여부가 명확하지 않다는 것입니다. 귀하의 의도는 문자열을 반복하고 숫자가 아닌 문자를 무시하는 것이지만 몇 가지 문제가 있다고 생각합니다. 우선 해결해야 할 것은 isdigit을 사용하는 것입니다. 그것은 방법이지만, 당신은 그것을 전혀 부르지 않습니다.대신 방법 자체를 True (성공하지 못할 수도 있음)과 비교합니다.

나는 현재 가지고있는 것 대신에 if x[countdigit].isdigit():을 원한다고 생각합니다. 이 메소드를 호출하고 불필요한 부울 비교를 수행하지 않습니다 (if은 이미 "사실"값을 확인합니다).

다음 문제는 코드의 수학적 부분으로 이동하기 전에 숫자 한 문자 문자열을 실제 숫자로 바꾸지 않는다는 것입니다. 내 생각에 자연스럽게 할 일은 y에 할당하는 것입니다. 할당 직전에 전환을 수행하려면 y = int(x[countdigit])과 같은 것을 사용할 수 있습니다.

그 밖의 다른 문제는 while 루프의 코드 전체 구조입니다. 파이썬에서는 for 루프를 사용하여 연속적인 정수로 수동으로 인덱싱 할 필요없이 다양한 컨테이너 유형을 직접 반복 할 수 있습니다. while과 함께 countdigit 코드는 for character in x:으로 바꿀 수 있으며 나머지 코드에서는 x[countdigit] 대신 character을 사용할 수 있습니다.