2016-10-07 1 views
0

이 코드는 절대적으로, 100 % 정확합니다. 그것은 교사의 컴퓨터에서 작동하고 완벽하게 실행되지만 내 것은 그렇지 않습니다. 나는 그것이 왜 될지 전혀 모른다. 이 문제는 Mac 및 Windows에서 동일합니다 (다른 사람도 동일한 문제가 있음). 필자는 관련이 있다면 Windows 8.1을 사용하고 모든 Python 파일을 Documents에 저장합니다. 나는 파이썬 3.5를 가지고 있고 쉘과 명령 창에서 같은 문제가있다.코드가 정확하고 교사가 승인했지만 작동하지 않습니다. 어떻게 실행시킬 수 있습니까? (파이썬 무작위 모듈)

정상적으로 작동합니다 - 예상되는 학생 이름을 인쇄하지만 끝 메시지를 두 번 인쇄합니다.

이전에 거북이 모듈을 0 개 가져 왔습니다. 나는 그것과 무작위 이외의 아무것도 가져 오지 않았으므로, 그것은 단지 무작위인지 또는 다른 모듈 들인지 확실하지 않다.

다음은 코드입니다. 학생들에게 무작위로 활동을 선택하는 것입니다.

def addlist(): 
    maxLengthList = int(input("How many students?")) 
    turtle.title("Class Chooser") 
    while len(kids) < maxLengthList: 
     name = turtle.textinput("Students", "Enter a name") 
     kids.append(name) 
    nextturn() 

def nextturn(): 
    turn = random.choice(kids) 
    kids.remove(turn) 
    print("Next " + turn) 
    again=len(kids) 
    while again>0: 
     nextturn() 
     again=again-1 
    else: 
     print("Have a nice day!") 

import random 
import turtle 
kids = [] 
addlist() 

다음은 오류 메시지입니다. 당신의 모든이에 대한 수정이

How many students?4 
Next lucy 
Next alex 
Next jake 
Next bro 
Have a nice day! 
Have a nice day! 
Traceback (most recent call last): 
    File "C:\Users\Seren\AppData\Local\Programs\Python\Python35-32\lib\random.py", line 253, in choice 
    i = self._randbelow(len(seq)) 
    File "C:\Users\Seren\AppData\Local\Programs\Python\Python35-32\lib\random.py", line 230, in _randbelow 
    r = getrandbits(k)   # 0 <= r < 2**k 
ValueError: number of bits must be greater than zero 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 24, in <module> 
    addlist() 
    File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 7, in addlist 
    nextturn() 
    File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 16, in nextturn 
    nextturn() 
    File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 16, in nextturn 
    nextturn() 
    File "C:\Users\Seren\Documents\~School~\Computer Programming\isolated code ex.py", line 10, in nextturn 
    turn = random.choice(kids) 
    File "C:\Users\Seren\AppData\Local\Programs\Python\Python35-32\lib\random.py", line 255, in choice 
    raise IndexError('Cannot choose from an empty sequence') 
IndexError: Cannot choose from an empty sequence 

가 수행 나는 학생들의 이름 루시, 알렉스, 제이크, 그리고 형제를 입력 한? 제대로 무작위로 가져올 수 없다면 과제를 수행하는 것이 거의 불가능합니다.

편집 : 제 컴퓨터 나 운영체제, 또는 내가 다운로드 한 파이썬 버전에 문제가 있다고 생각합니다. 무작위 모듈을 이상하게 만드는 코드 외부의 모든 것.

업데이트 : print ("좋은 하루 되세요!") 후에 quit()을 넣으면 오류 메시지가 나타나지 않고 프로그램이 의도 한대로 작동하는 것으로 보입니다. 비록 이것이 이것이 band-aid만큼 많은 해결책인지는 모르겠다.

+2

귀하의 코드가 정의되기 전에 호출되는 바닥 함수에서 수입으로, 뒤쪽으로 보인다. – TigerhawkT3

+0

을 당신은 nextturn'에 대한 호출을() '(정의되기 전에) 작동하지 않아야하지만,'addlist'를 호출하기 전에'nextturn'을 호출하면 분명히이 에러가 발생합니다. – chepner

+0

사람들이 이상하게 보일지 모르지만 문제는'nextturn'이 아닙니다. 그 코드가 정의되기 전에 불려지는 것입니다 (어쩌면 그가 여기에 코드를 썼을 때 단지 아이덴티티 에러 였을 것입니다). 에러는 'random.choice (kids)'가 호출 될 때'kids'가 빈 시퀀스라는 것입니다. – lucasnadalutti

답변

1

이상한 동작의 이유는 동일한 함수를 호출하는 재귀 및 while 루프의 사용입니다.

해결 방법에는 여러 가지가 있습니다. 그러나, 나는 그것이 혼란 전적으로으로 while 루프를 제거하는 것이 좋습니다 :

def addlist(): 
    maxLengthList = int(input("How many students?")) 
    turtle.title("Class Chooser") 
    while len(kids) < maxLengthList: 
     name = turtle.textinput("Students", "Enter a name") 
     kids.append(name) 
    nextturn() 

def nextturn(): 
    turn = random.choice(kids) 
    kids.remove(turn) 
    print("Next " + turn) 
    again=len(kids) 
    if again>0: 
     nextturn() 
     again=again-1 
    else: 
     print("Have a nice day!") 

import random 
import turtle 
kids = [] 
addlist() 

나는 또한 코드를 조금 standarize 것, 더 읽을 수 있도록 :

import random 
import turtle 
kids = [] 
def addlist(): 
    maxLengthList = int(input("How many students?")) 
    turtle.title("Class Chooser") 
    while len(kids) < maxLengthList: 
     name = turtle.textinput("Students", "Enter a name") 
     kids.append(name) 
    nextturn() 

def nextturn(): 
    turn = random.choice(kids) 
    kids.remove(turn) 
    print("Next " + turn) 
    if kids: 
     nextturn() 
    else: 
     print("Have a nice day!") 

addlist() 

업데이트 : 당신이 [ann, bob, charlie]와 목록을 가지고

가정 :

이 어떤 코드가하고 있던 긴 설명이다 . 전화 # 1에

  • nextturn에 : 변수는 다음과 같이 그래서 당신이 아이를 제거 : (글로벌 아이 = [ '앤', '밥', 지역을 다시 = 2) 루프에 들어가기 전에. 전화 번호에

  • 2 nextturn로 변수가 루프에 들어가기 전에이 같다 (글로벌 아이 = 앤은, 로컬 다시 = 1)로 전화 번호에

  • 3이 될 것이다 (글로벌 아이 = 비어 있음], 지역 다시 = 0).단순히 "좋은 하루 되세요"라고 인쇄하고 성공적으로 종료합니다.

통화 3은 목록을 비워두고 종료됩니다. 하지만 통화 1과 2는 여전히 활성화되어 있습니다. Call # 2의 while 루프가 처음 반복 된 후 로컬 변수 again은 0이므로 "Have a nice day"(다시)를 인쇄하고 종료합니다.

그러나 호출 1에서 로컬 변수 again은 1입니다. 즉, 빈 목록에서 루프가 다시 실행됩니다 !!!.

그리고 이로 인해 문제가 발생했습니다.

+0

이것은 맞습니다. 그러나 "좋은 하루 보내십시오!"라는 의도가 있다고 생각합니다. 학생들 각자에게'print'는 아마도'else' 안에 있지 않아야합니다. – dkasak

+0

완벽하게 작동합니다. 감사합니다! 넌 내 목숨을 구했어. while 루프가 작동하지 않는 이유를 정확히 설명해 주시겠습니까? 그것은 1을 다시 빼기 전에 함수의 맨 위로 되돌아 갈 것이기 때문입니까? 아니면 처음부터 동일한 함수로 이동했기 때문입니까? 이 코드는 인트로 클래스이기 때문에 아마도 clunkiness가 있다고 덧붙여 야합니다. 그래서 우리는이 개념의 코드에 몇 가지 개념을 강요합니다. while 루프에 대한 단서는 없습니다. – Seren

+0

@Seren 설명과 함께 답변을 업데이트했습니다. 나는 당신이 질문이있는 경우에 그것을 다시 새롭게하는 것을 시도 할 것이다. – Rodolfo

-1

예 : random.randint(0,x)을 사용하여 원하는 학생을 정의 할 수 있습니다. 이 도움이된다면

print(students[random.randint(0,3)] 

확실하지, 또 다른 제안이 작동하고 있는지 바로 확인 다른 프로젝트에 print(random.randint(1,4) 간단한을 시도 할 수있다?

(또한 당신은 아마 눈앞에 import random 물건을 넣어해야합니다.

+0

아직 수업에 들지는 않았지만 어쨌든 고맙습니다! 그래서 나는 무작위로 수입에 대해 들었습니다. 하하. 그녀는 당신이 할 수 있다는 것을 보여주기 위해 바닥에 그것을 두었습니다. 그리고 그 기능은 호출 될 때까지 프로그램에 의해 무시됩니다. – Seren

+0

오케이, :). 어떤 과정을하고 있습니까? A-Lvl? –

+0

아니요, 매우 비공식적 인 수업입니다. 비록 재미있는 기초를 얻은 후에는 훨씬 더 재미있게 코딩하고 초급 수준으로 시작합니다. – Seren

관련 문제