노는게 제일 좋습니다.

행맨(예제코드+수정)(in, 문자열/리스트 메소드, range(), 다중대입) 본문

Python/기타 공부

행맨(예제코드+수정)(in, 문자열/리스트 메소드, range(), 다중대입)

노는게 제일 좋습니다. 2016. 1. 30. 04:02

알 수 있는 내용

in연산자, 문자열 메소드, 리스트 메소드, range(), 다중 대입

 

어제는 무작정 갖고 있는 지식만으로 '완성'만을 목표로 했다면, 오늘은 찬찬히 예제코드를 살펴보면서 비교하고 배우기로 했다.

책에 있는 예제코드에 딕셔너리로 단어세트 고르기를 추가한 코드이다. 훨씬 간결하고 한 눈에 들어온다.

 

나는 전역변수를 만들어 여러 함수에서 그 변수에 접근했다면, 이 코드는 매개변수로 넘기고 리턴하는 방식을 주로 택한다.

플래시 스크립트를 마구잡이로 짜던 습관이 나와서 전역변수로 편하게 굴렸었다. 생각없는 전역변수 접근은 줄여나가는걸로.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import random
HANGMANPICS = ['''
   +---+
    l     l
          l
          l
          l
          l
=======''''''
   +---+
    l     l
   O    l
          l
          l
          l
=======''''''
   +---+
    l     l
   O    l
    l     l
          l
          l
=======''''''
   +---+
    l     l
   O    l
  / l     l
          l
          l
=======''''''
   +---+
    l     l
   O    l
  / l \ l
          l
          l
=======''''''
   +---+
    l     l
   O    l
  / l \ l
   /      l
          l
=======''''''
   +---+
    l     l
   O    l
  / l \ l
   / \  l
          l
=======''' ]
 
words = {
                'animal' : 'mouse tiger fox eagle duck camel cat bear bat dog'.split(),
                'computer' : 'mouse keyboard monitor ram vga cpu'.split()
              }
 
def chooseWordSet(words):
    while True:
        print('Choose words set! type "animal" or "computer"')
        print('[EX] >> Your Choice : animal')
        print(' >> Your Choice : ',end='')
        temp = input()
 
        for i in list(words.keys()):
            if temp==i :
                print('You chose "'+temp+'"! Now, START GAME!')
                return temp
                #break
            else :
                continue
    
 
def getRandomWord(wordPack,words):
    wordIndex = random.randint(0len(words[wordPack]) -1)
    return words[wordPack][wordIndex]
 
def displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord):
    print(HANGMANPICS[len(missedLetters)])
    print()
 
    print('Missed letters:', end=' ')
    for letter in missedLetters:
        print(letter, end=' ')
    print()
 
    blanks = '_' * len(secretWord)
 
    for i in range(len(secretWord)):
        if secretWord[i] in correctLetters:
            blanks = blanks[:i] + secretWord[i] + blanks[i+1:]
 
    for letter in blanks:
        print(letter, end=' ')
    print()
 
def getGuess(alreadyGuessed):
    while True:
        print('Guess a letter')
        guess = input()
        guess = guess.lower()
        if len(guess) != 1:
            print('Please enter a single letter.')
        elif guess in alreadyGuessed:
            print('You have already guessed that letter. Choose again.')
        elif guess not in 'abcdefghijklmnopqrstuvwxyz':
            print('Please enter a LETTER.')
        else:
            return guess
 
def playAgain():
    print('Do you want to play again? (yes or no)')
    return input().lower().startswith('y')
 
print('H A N G M A N')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(chooseWordSet(words), words)
gameIsDone= False
 
 
    
while True:
    displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord)
 
    guess = getGuess(missedLetters + correctLetters)
 
    if guess in secretWord:
        correctLetters = correctLetters + guess
 
        foundAllLetters = True
 
        for i in range(len(secretWord)):
            if secretWord[i] not in correctLetters:
                foundAllLetters = False
                break
        if foundAllLetters:
            print('Yes! The secret word is "' +secretWord +'"! You have won!')
            gameIsDone = True
    else:
        missedLetters = missedLetters + guess
 
        if len(missedLetters) == len(HANGMANPICS) - 1:
            displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord)
            print('You have run out of guesses!\nAfter ' + str(len(missedLetters)) + 'missedGuesses and '+str(len(correctLetters)) + ' correct guesses, the word was "'+secretWord +'"')
            gameIsDone = True
 
    if gameIsDone:
        if playAgain():
            missedLetters = ''
            correctLetters = ''
            gameIsDone=False
            
            secretWord=  getRandomWord( chooseWordSet(words), words )
        else:
            break
 
cs

 

  in 연산자 : 어떤 값이 리스트 안에 있는지 확인. 문자열도 가능. 있으면 True반환, 없으면 False반환

 

  lower() 메소드 : 알파벳을 소문자로 바꾸는 문자열 메소드. upper()는 대문자로 바꿈

 

  list 결합 : [ ~~ ] + [ ~~~~] 와 같이 작성해 list를 합칠 수 있음.

 

  list item지우기 : del 리스트이름[인덱스]

 

  list 메소드 :

reverse() : list의 item순서 바꿈,

append() : list의 맨 뒤에 인자로 받은 값을 추가

split() : 빈칸 단위로 문자열들을 한 item씩 잡아 list로 만듬

 

  range() 함수 : 인수로 정수를 받아 범위를 잡아 range객체를 반환.

인수가 하나이면 0부터 그 수 미만까지를 반환한다.

인수가 두 개이면 앞 수 이상, 뒷 수 미만을 반환한다.

list()함수를 사용해 range객체를 list로 만들 수 있다.

 

  딕셔너리(dictionary) : 키( key)와 그에 대한 값을 갖는 데이터 타입. 키는 콜론 왼쪽에, 값은 오른쪽에 온다.

딕셔너리에 있는 요소들에 접근할 때는 list에서 정수인덱스 대신 key를 쓰면 된다. 나타내는 값은 key와 묶여있는 '값'이다.

len을 딕셔너리에 사용했을 때는 키-값 쌍의 갯수를 나타낸다.

.keys()로 키들을 반환받을 수 있다.

참고로, 딕셔너리에는 순서가 없다.

 

  다중 대입 : 왼쪽에 여러 변수를 놓고, 리스트를 대입하면 순서대로 대입된다.

a에는 apple이, b에는 banana가, c에는 tomato가 대입된다.

1
2
3
4
5
6
7
>>> a,b,c = ['apple','banana','tomato']
>>> a
'apple'
>>> b
'banana'
>>> c
'tomato'
cs

 

  random.choice() : 리스트에서 임의로 선택한 한 값을 반환한다.

Comments