2017-11-26 3 views
2

예를 들어 while 문은 다음과 같습니다.이를 결합하고 싶습니다. 왜냐하면 당신이 20 개의 if 문을 모두 가지고 있다면 이것은 귀찮아 질 수 있기 때문입니다.여러 while 문을 파이썬으로 결합

while True: 
    name = str(raw_input("NAME PLEASE\n")) 
    if name.isalpha(): 
     break 
    print("Please chars dude") 

while True: 
    age = raw_input("Please type your age\n") 
    if age.isdigit(): 
     break 
    print("Please digits only") 

누군가를 결합하여 '연령'으로 A-Z 문자를 입력하면 '이름'문구를 저장하지 않고 코드가 다시 시작됩니다. 올바른 경우 '이름'을 저장하고 false 인 if 문에서만 다시 시작하고 싶습니다.

while True: 
    name = str(raw_input("NAME PLEASE\n")) 
    if name.isalpha(): 
     break 
    print("Please chars dude") 

    age = raw_input("Please type your age\n") 
    if age.isdigit(): 
     break 
    print("Please digits only") 

답변

4

캡쳐 기능을 사용하여 정보를 요청하십시오. 당신은 검증 테스트 기능에 전달할 수 있습니다

def ask(question, validator, errormessage): 
    while True: 
     result = raw_input(question) 
     if not validator(result): 
      print(errormessage) 
      continue 
     return result 


name = ask("NAME PLEASE\n", lambda s: s.isalpha(), "Please chars dude") 
age = ask("Please type your age\n", lambda s: s.isdigit(), "Please digits only") 

이 사용자가 이미 올바른 이름을 입력하고 당신은 지금 시대를 요청해야하는 경우 다음 테스트의 수를보고 훨씬 더 읽을 수 있습니다.

+0

'lambda : s.isalpha()'? 왜'str.isalpha'가 아닌가? –

+0

Martijn, 나는 여러 개의 while 문을 쓰는 것과 기본적으로 같기 때문에 이것을 생각했다. 그러나 나는 질문 한 것처럼 while 문이 결합 될 수 있는지 궁금해했다. 그러나 아무도 대답이 없다면 참으로 바람직한 대답이 될 것입니다. 고맙습니다. –

+0

While 문은 자체적 인 것입니다. 그러나 어떤 종류의 논리라도 그것들에 넣을 수 있습니다. 이 기능 방식은 훨씬 깨끗하고 읽기 쉬우 며 향후 데이터가 변경 될 때 훨씬 더 잘 재사용 할 수 있습니다. –

1

먼저 없음으로 변수를 설정하고 할당하기 전에를 확인할 수 있습니다

name, age = None, None 

while True: 
    if name is None: 
     name = str(raw_input("NAME PLEASE\n")) 
     if not name.isalpha(): 
      print("Please chars dude") 
      name = None 
      continue 

    if age is None: 
     age = raw_input("Please type your age\n") 
     if not age.isdigit(): 
      print("Please digits only") 
      age = None 
      continue 

    print("input is valid") 
    break 

다시 통해 루프를 시작합니다을 계속합니다. 이것은 의 브레이크을 실제로 중단하고 루프 코드를 종료하기 때문에 코드 논리에 더 잘 맞습니다.

0

이 시도 :

name = None 
age = None 

while requires_info: 
    if name is None: 
     temp_name = str(raw_input("NAME PLEASE\n")) 
     if temp_name.isalpha(): 
      name = temp_name 
      continue 
     else: 
      print("Please chars dude") 
      continue 
    if age is None: 
     temp_age = raw_input("Please type your age\n") 
     if temp_age.isdigit(): 
      age = temp_age 
      continue 
     else: 
      print("Please digits only") 
      continue 
    break 

우리가 여기서하는 일은 여전히 ​​수행에 필요한 사항을 추적하는 하나의 연속 루프 및 문/변수의 경우 몇 가지를 사용합니다. 데이터를 입력하는 방법에 따라 이름이 유효하지 않은 경우 연령을 묻지 않는 논리를 추가 할 수도 있습니다.

0

날씨가 유효한 입력을 추적하기 위해 플래그를 사용합니다. 주어진 경우 루프를 종료하십시오.

name_input_required = True 
name = '' 
while name_input_required: 
    name = str(raw_input("NAME PLEASE\n")) 
    if name.isalpha(): 
     name_input_required = False 
    else: 
     print("Please chars dude") 

age_input_required = True 
age = None 
while age_input_required: 
    age = raw_input("Please type your age\n") 
    if age.isdigit(): 
     age_input_required = False 
    else: 
     print("Please digits only") 
+0

이제 while 문을 두 개 사용하여 덜 평범한 언어로 만들었습니다. –

+0

플래그 변수를 사용해야하지 않습니다. 'while True :'및'break'를 사용하십시오. –

+0

나는 그것을 생각했지만 두 가지 다른 기능이 필요하다. 하나는 isdigit()이고 하나는 isalpha() 체크 –

3

왜 함수를 사용하지 않고 프로세스에서 일부 복제를 줄 였나요? 이 경우

def ask_input(prompt, error_msg, validation_fn): 
    while True: 
     data = raw_input(prompt) 
     if validation_fn(data): 
      return data 
     print(error_msg) 

name = ask_input("NAME PLEASE\n", "Please chars dude", lambda x: x.isalpha()) 
age = ask_input("Please type your age\n", "Please digits only", 
       lambda x: x.isdigit()) 

는 프롬프트 (사용자에게 무엇을), (유효하지 않은 입력을 제공하기 위해 무엇을) 오류 메시지 및 유효성 검사 기능은 ask_input() 기능이 제공됩니다. 이렇게하면 함수 호출 뒤에 while 루프가 숨겨지고 코드에서 더 의미있는 것을 읽을 수 있습니다.

람다 함수는 유효성 검사를 돕는 쉬운 방법입니다. 다음과 같이 대신 할 수 있습니다.

def isalpha(x): 
    return x.isalpha() 


def isdigit(x): 
    return x.isdigit() 

name = ask_input("NAME PLEASE\n", "Please chars dude", isalpha) 
age = ask_input("Please type your age\n", "Please digits only", isdigit) 
0

예를 들어 다음 while 문이 있으며이를 결합하고 싶습니다. 왜냐하면 당신이 20 개의 if 문을 모두 가지고 있다면 이것은 귀찮아 질 수 있기 때문입니다.

actual problem은 "귀찮은 코드를 줄이는 방법"이라고 가정합니다. "두 개의 루프를 하나로 합치는 법"대신에. 나는 두 개의 고리를 유지하는 것이 good idea이라고 생각한다.

def safe_input(prompt, err_message, validation_fn): 
    while True: 
     value = raw_input(prompt) 
     if validation_fn(value): 
      return value 
     print err_message 

name = safe_input("NAME PLEASE\n", "Please chars dude", str.isalpha) 
age = safe_input("Please type your age\n", "Please digits only", str.isdigit) 

당신은 항상 별도의 줄에 텍스트를 입력하는 데 사용되는, 당신은 raw_input 전에 print prompt로 할 수 있습니다 및 raw_input에 인수를주지하십시오. 그렇게하면 safe_input의 모든 전화에 "\n"을 제공 할 필요가 없습니다.

0

예, 두 루프를 하나의 루프로 결합 할 수 있습니다!

항상 한 줄씩 문제를 해결하십시오.
언어를 더 잘 익힐 수 있으며 어떤 문제도 해결할 수있는 가장 간단한 방법입니다.

라인 용액 라인은 다음과 같이 보일 것이다 :

name = '' # define name outside while loop 
while True: 
    if not name: 
     name = str(raw_input("NAME PLEASE\n")) 
     if not name.isalpha(): # validate name 
      print("Please chars dude") 
      # reset name 
      name = '' 

    else: 
     age = raw_input("Please type your age\n") 
     if age.isdigit(): # validate age 
      """continue your code here""" 
      print('name: ' + name + ' and age: ' + age) 
      print('Ok! Goodbye!') 
      break # while loop 
     else: 
      print("Please digits only") 

인쇄됩니다

NAME PLEASE 
Elis 
Please type your age 
30 
name: Elis and age: 30 
Ok! Goodbye! 

이것은 당신이 while 루프 더 나은 방법 어려운 경우에 사용하는 방법을 이해하는 데 도움이됩니다.

중복 언어 기능을 사용하여 설계하지 마십시오. refactoringdebugging이 어렵습니다.

관련 문제