Presentation is loading. Please wait.

Presentation is loading. Please wait.

2017년 하계 경성 프로그래밍 교육 (4/5) 경성대학교 공과대학 소프트웨어 학과.

Similar presentations


Presentation on theme: "2017년 하계 경성 프로그래밍 교육 (4/5) 경성대학교 공과대학 소프트웨어 학과."— Presentation transcript:

1 2017년 하계 경성 프로그래밍 교육 (4/5) 경성대학교 공과대학 소프트웨어 학과

2 리스트(list)

3 리스트 생성하기 list 클래스의 생성자를 이용하여 리스트를 생성
간결한 문법을 사용하여 다음과 같이 리스트를 생성할 수 있다. list1 = list() # 빈 리스트를 생성한다. list2 = list([2, 3, 4]) # 원소 2, 3, 4를 가진 리스트를 생성한다. list3 = list(["red", "green", "blue"]) # 문자열을 가진 리스트를 생성한다. list4 = list(range(3, 6)) # 원소 3, 4, 5를 가진 리스트를 생성한다. list5 = list("abcd") # 문자 a, b, c, d를 가진 리스트를 생성한다. list1 = [] # list() 와 동일하다. list2 = [2, 3, 4] # list([2, 3, 4])와 동일하다. list3 = ["red", "green"] # list(["red", "green"])와 동일하다.

4 리스트 위한 함수 >>> list1 = [2, 3, 4, 1, 32]
Python Shell >>> list1 = [2, 3, 4, 1, 32] >>> len(list1) 5 >>> max(list1) 32 >>> min(list1) 1 >>> sum(list1) 42 >>> import random >>> random.shuffle(list1) # list1 내의 원소들을 뒤섞는다. >>> list1 [4, 1, 2, 32, 3]

5 인덱스 연산자 [] myList = [5.6, 4.5, 3.3, 13.2, 4.0, 34.33, 34.0, 45.45, , 11123] myList 참조 myList[0] myList[1] myList[2] myList[3] myList[4] myList[5] myList[6] myList[7] myList[8] myList[9] 5.6 4.5 3.3 13.2 4.0 34.33 34.0 45.45 99.993 11123 리스트 참조 변수 인덱스 5인 리스트 원소

6 +, *, in/not 연산자 >>> list1 = [2, 3]
Python Shell >>> list1 = [2, 3] >>> list2 = [1, 9] >>> list3 = list1 + list2 >>> list3 [2, 3, 1, 9] >>> list3 = 2 * list1 [2, 3, 2, 3, 2, 3] >>> list4 = list3[2 : 4] >>> list4 [2, 3] Python Shell >>> list1 = [2, 3, 5, 2, 33, 21] >>> list1[-1] 21 >>> list1[-3] 2 Python Shell >>> list1 = [2, 3, 5, 2, 33, 21] >>> 2 in list1 True >>> 2.5 in list1 False

7 리스트 컴프리헨션 리스트 컴프리헨션(list comprehension)은 리스트의 순차 원소를 생성할 수 있는 간편한 방법을 제공한다. 꺽쇠괄호 안에 표현식을 먼저 작성하고 그 다음에 for 절을 넣고, 그 이후로 for나 if 절을 넣거나 생략하는 형태로 리스트 컴프리헨션을 구성할 수 있다. 리스트 컴프리헨션은 표현식의 결과에 따라 리스트를 만든다. Python Shell >>> list1 = [x for x range(0, 5)] # 0, 1, 2, 4의 리스트를 반환한다. >>> list1 [0, 1, 2, 3, 4] >>> list2 = [0.5 * x for x in list1] >>> list2 [0.0, 0.5, 1.0, 1.5, 2.0] >>> list3 = [x for x in list2 if x < 1.5] >>> list3 [0.0, 0.5, 1.0]

8 리스트 비교하기 >>>list1 = ["green", "red", "blue"]
Python Shell >>>list1 = ["green", "red", "blue"] >>>list2 = ["red", "blue", "green"] >>>list2 == list1 False >>>list2 != list1 True >>>list2 >= list1 >>>list2 > list1 >>>list2 < list1 >>>list2 <= list1

9 문자열을 리스트로 분할하기 items = "Welcome to the Korea".split() print(items)
items = "34#13#78#45".split("#") ['34', '13', '78', '45']

10 사례 연구: 문자 빈도수 세기 100개의 소문자를 랜덤하게 생성하고 이들 문자를 chars라 하는 문자 리스트에 할당한다.
Chars[0] Chars[1] Chars[98] Chars[99] Chars[0] Chars[1] Chars[24] Chars[25]

11 사례 연구: 문자 빈도수 세기 - cont Filename : RandomCharacter.py
from random import randint # randint를 임포트한다. # ch1과 ch2 사이의 랜덤 문자를 생성한다. def getRandomCharacter(ch1, ch2): return chr(randint(ord(ch1), ord(ch2))) # 랜덤 소문자를 생성한다. def getRandomLowerCaseLetter(): return getRandomCharacter('a', 'z') # 랜덤 대문자를 생성한다. def getRandomUpperCaseLetter(): return getRandomCharacter('A', 'Z') # 랜덤 숫자를 생성한다. def getRandomDigitCharacter(): return getRandomCharacter('0', '9') # 랜덤 문자를 생성한다. def getRandomASCIICharacter(): return getRandomCharacter(chr(0), chr(127)) Filename : RandomCharacter.py

12 사례 연구: 문자 빈도수 세기 - cont import RandomCharacter # 문자 리스트를 생성한다.
def main(): # 문자 리스트를 생성한다. chars = createList() # 리스트를 출력한다. print("소문자:") displayList(chars) # 각 문자의 빈도수를 센다. counts = countLetters(chars) # 빈도수를 출력한다. print("각 문자의 빈도수는:") displayCounts(counts) # 문자 리스트를 생성한다. def createList(): # 빈 리스트를 생성한다. chars = [] # 소문자를 랜덤하게 생성하고 리스트에 추가한다. for i in range(100): chars.append(RandomCharacter.getRandomLowerCaseLetter()) # 리스트를 반환한다. return chars # 문자 리스트를 출력한다. def displayList(chars): # 리스트에 포함된 문자를 한 행에 20개씩 출력한다. for i in range(len(chars)): if (i + 1) % 20 == 0: print(chars[i]) else: print(chars[i], end = ' ')

13 사례 연구: 문자 빈도수 세기 - cont Filename : CountLettersInList.py
# 각 문자의 빈도수를 센다. def countLetters(chars): # 0으로 초기화된 26개의 정수 리스트를 생성한다. counts = 26 * [0] # 리스트의 각 소문자를 센다. for i in range(len(chars)): counts[ord(chars[i]) - ord('a')] += 1 return counts # 빈도수를 출력한다. def displayCounts(counts): for i in range(len(counts)): if (i + 1) % 10 == 0: print(counts[i], chr(i + ord('a'))) else: print(counts[i], chr(i + ord('a')), end = ' ') main() # main 함수를 호출한다. Filename : CountLettersInList.py

14 이차원 리스트 다음의 표는 이차원 리스트의 형태로 표현이 가능하다. distances = [
서울 대전 광주 대구 울산 전주 순천 부산 151 290 282 396 210 320 390 178 148 259 90 235 260 219 327 105 93 267 87 198 218 130 308 199 65 141 265 distances = [ [0, 151, 290, 282, 396, 210, 320, 390], [151, 0, 178, 148, 259, 90, 235, 260], [290, 178, 0, 219, 327, 105, 93, 267], [282, 148, 219, 0, 87, 198, 218, 130], [396, 259, 327, 87, 0, 308, 199, 65], [210, 90, 105, 198, 308, 0, 141, 265], [320, 235, 93, 218, 199, 141, 0, 199], [390, 260, 267, 130, 65, 265, 199, 0], ]

15 2차원 리스트 처리하기 2차원 리스트는 행으로 이루어진 리스트라고 생각할 수 있다. 각의 행은 여러 개의 값을 포함하는 또 다른 리스트이다. 행은 인덱스를 사용하여 접근될 수 있는데, 관례적으로 이 인덱스를 행 인덱스(row index)라고 한다. 행의 각 값들은 열 인덱스(column index)라고 하는 또 다른 인덱스를 통해 접근될 수 있다. matrix = [ [1, 2, 3, 4, 5], [6, 7, 0, 0, 0], [0, 1, 0, 0, 0], [1, 0, 0, 0, 8], [0, 0, 9, 0, 3], ] matrix[0] 은 [1, 2, 3, 4, 5]이다 matrix[1] 은 [6, 7, 0, 0, 0]이다 matrix[2] 은 [0, 1, 0, 0, 0]이다 matrix[3] 은 [1, 0, 0, 0, 8]이다 matrix[4] 은 [0, 0, 9, 0, 3]이다 matrix[0][0]은 1이다 Matrix[4][4]은 3이다

16 입력값으로 리스트 초기화하기 matrix = [] # 비어있는 리스트를 생성한다
numberOfRows = eval(input("행의 개수를 입력하세요: ")) numberOfColumns = eval(input("열의 개수를 입력하세요: ")) for row in range(0, numberOfRows): matrix.append([]) # 새로운 빈 행을 추가한다 for column in range(0, numberOfColumns): value = eval(input("원소를 입력하고 엔터를 누르세요: ")) matrix[row].append(value) print(matrix)

17 랜덤 값으로 리스트 초기화하기 import random matrix = [] # 비어있는 리스트를 생성한다.
numberOfRows = eval(input("행의 개수를 입력하세요: ")) numberOfColumns = eval(input("열의 개수를 입력하세요: ")) for row in range(0, numberOfRows): matrix.append([]) # 새로운 빈 행을 추가한다. for column in range(0, numberOfColumns): matrix[row].append(random.randrange(0, 100)) print(matrix)

18 리스트 출력하기 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] #리스트는 주어진다.
for row in range(0, len(matrix)): for column in range(0, len(matrix[row])): print(matrix[row][column], end = " ") print() # 새로운 행을 출력한다.

19 모든 원소 합계 구하기 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 리스트는 주어진다.
total = 0 for row in range(0, len(matrix)): for column in range(0, len(matrix[row])): total += matrix[row][column] print("Total is " + str(total)) # 합계를 출력한다.

20 열의 원소 합계 구하기 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 리스트는 주어진다.
total = 0 for column in range(0, len(matrix[0])): for row in range(0, len(matrix)): total += matrix[row][column] print(column, "번째 열의 합계는", total, "입니다.")

21 합계가 가장 큰 행 찾기 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # Assume a list is given maxRow = sum(matrix[0]) # maxRow에 첫 번째 행의 합계를 저장한다. indexOfMaxRow = 0 for row in range(1, len(matrix)): if sum(matrix[row]) > maxRow: maxRow = sum(matrix[row]) indexOfMaxRow = row print(indexOfMaxRow, "번째 행의 합계", maxRow, "가 가장 큽니다.")

22 무작위로 섞기 import random matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 리스트는 주어진다. for row in range(0, len(matrix)): for column in range(0, len(matrix[row])): i = random.randrange(0, len(matrix)) j = random.randrange(0, len(matrix[row])) # matrix[row][column]와 matrix[i][j]를 교환한다. matrix[row][column], matrix[i][j] = \ matrix[i][j], matrix[row][column] print(matrix)

23 사례 연구: 생일 맞히기 def main(): day = 0 # Day to be determined dates = [
[[ 1, 3, 5, 7], [ 9, 11, 13, 15], [17, 19, 21, 23], [25, 27, 29, 31]], [[ 2, 3, 6, 7], [10, 11, 14, 15], [18, 19, 22, 23], [26, 27, 30, 31]], [[ 4, 5, 6, 7], [12, 13, 14, 15], [20, 21, 22, 23], [28, 29, 30, 31]], [[ 8, 9, 10, 11], [24, 25, 26, 27], [[16, 17, 18, 19], [28, 29, 30, 31]]] for i in range(5): print("Is your birthday in Set" + str(i + 1) + "?") for j in range(4): for k in range(4): print(format(dates[i][j][k], '4d'), end = " ") print() answer = eval(input("Enter 0 for No and 1 for Yes: ")) if answer == 1: day += dates[i][0][0] print("Your birth day is " + str(day)) main() # Call the main function

24 스도쿠 5 3 7 6 1 9 8 4 2

25 모든 행은 1 – 9 사이의 숫자를 포함 5 3 7 6 1 9 8 4 2 5 3 4 6 7 8 9 1 2

26 모든 열은 1 – 9 사이의 숫자를 포함 5 3 7 6 1 9 8 4 2 5 3 4 6 7 8 9 1 2

27 모든 3×3 상자는 1 – 9 사이의 숫자를 포함 5 3 7 6 1 9 8 4 2 5 3 4 6 7 8 9 1 2

28 풀이가 정확한지 확인 5 3 7 6 1 9 8 4 2 5 3 4 6 7 8 9 1 2

29 풀이가 정확한지 확인 - cont Filename : CheckSudokuSolution.py # 풀이가 유효한지 검사한다.
def isValid(grid): for i in range(9): for j in range(9): if grid[i][j] < 1 or grid[i][j] > 9 \ or not isValidAt(i, j, grid): return False return True # 고정 셀은 유효하다. # 그리드에서 grid[i][j]가 유효한지 검사한다. def isValidAt(i, j, grid): # i번 행에서 grid[i][j]가 유효한지 검사한다. for column in range(9): if column != j and grid[i][column] == grid[i][j]: # j번 열에서 grid[i][j]가 유효한지 검사한다. for row in range(9): if row != i and grid[row][j] == grid[i][j]: return False # 3 X 3에서 grid[i][j]가 유효한지 검사한다. for row in range((i // 3) * 3, (i // 3) * 3 + 3): for col in range((j // 3) * 3, (j // 3) * 3 + 3): if row != i and col != j and \ grid[row][col] == grid[i][j]: return True # grid[i][j]의 현재값은 유효하다. Filename : CheckSudokuSolution.py

30 풀이가 정확한지 확인 - cont Filename : TestCheckSudokuSolution.py
from CheckSudokuSolution import isValid def main(): # Read a Sudoku solution grid = readASolution() if isValid(grid): print("Valid solution") else: print("Invalid solution") # Read a Sudoku solution from the console def readASolution(): print("Enter a Sudoku puzzle solution:") grid = [] for i in range(9): line = input().strip().split() grid.append([eval(x) for x in line]) return grid main() # Call the main function Filename : TestCheckSudokuSolution.py

31 스도쿠 GUI

32 스도쿠 GUI - cont from tkinter import * # tkinter의 모든 정의를 임포트한다.
import tkinter.messagebox # tkinter.messagebox를 임포트한다. from CheckSudokuSolution import isValid class SudokuGUI: def __init__(self): window = Tk() # 윈도우를 생성한다. window.title("스도쿠 풀이를 검사한다") # 제목을 설정한다. frame = Frame(window) # 엔트리 위젯을 수용한다. frame.pack() self.cells = [] # 엔트리에 연결되는 변수 리스트 for i in range(9): self.cells.append([]) for j in range(9): self.cells[i].append(StringVar()) Entry(frame, width = 2, justify = RIGHT, textvariable = self.cells[i][j]).grid(row = i, column = j)

33 스도쿠 GUI - cont Filename : SudokuGUI.py
Button(window, text = "검사", command = self.validate).pack() window.mainloop() # 이벤트 루프를 생성한다. # 입력된 숫자가 정확한 풀인지 검사한다. def validate(self): # 엔트리 위젯에서 숫자를 가져온다. values = [[eval(x.get()) for x in self.cells[i]] for i in range(9)] if isValid(values): tkinter.messagebox.showinfo("스도쿠 풀이 검사", "이 풀이는 정확합니다.") else: tkinter.messagebox.showwarning("스도쿠 풀이 검사",”이 풀이는 정확하지 않습니다.") SudokuGUI() # GUI를 생성한다. Filename : SudokuGUI.py

34 튜플 튜플은 리스트와 유사하지만, 원소가 고정되어 있다는 점이 다르다. 즉, 튜플이 일단 생성되면, 튜플에 새로운 원소를 추가, 삭제, 다른 원소로 대체, 혹은 순서를 바꾸는 것을 허용하지 않는다. 애플리케이션에서 리스트의 내용을 전혀 변경할 의도가 없다면, 튜플을 사용하여 실수로 추가, 삭제, 변경되는 것을 막을 수 있다. 튜플(tuple)은 원소가 고정되어 있다는 점만 제외하면 리스트와 매우 유사하다.

35 튜플 생성 t1 = () # 빈 튜플을 생성 t2 = (1, 3, 5) # 세 원소를 가진 튜플을 생성
# 리스트로부터 튜플을 생성 t3 = tuple([2 * x for x in range(1, 5)]) # 문자열로부터 튜플을 생성 t4 = tuple("abac") # t4 is ['a', 'b', 'a', 'c']

36 튜플 데모 Filename : tupleDemp.py tuple1 = ("초록", "빨강", "파랑") # 튜플을 생성한다.
print(tuple1) # 리스트로부터 튜플을 생성한다. tuple2 = tuple([7, 1, 2, 23, 4, 5]) print(tuple2) # len 함수를 사용한다. print("길이는", len(tuple2), "입니다.") # max 함수를 사용한다. print("최댓값은", max(tuple2), "입니다.") # min 함수를 사용한다. print("최솟값은", min(tuple2), "입니다.") # sum 함수를 사용한다. print("합계는", sum(tuple2), "입니다.") # 인덱스 연산자를 사용한다. print("첫 번째 원소는", tuple2[0]) # 두 개의 투플을 결합한다. tuple3 = tuple1 + tuple2 print(tuple3) tuple3 = 2 * tuple1 # 투플을 중복한다. print(tuple3) print(tuple2[2 : 4]) # 슬라이싱 연산자 print(tuple1[-1]) print(2 in tuple2) # in 연산자 for v in tuple1: print(v, end = " ") print() list1 = list(tuple2) # 튜플로부터 리스트를 생성한다. list1.sort() tuple4 = tuple(list1) tuple5 = tuple(list1) print(tuple4) print(tuple4 == tuple5) # 두 투플을 비교한다. Filename : tupleDemp.py

37 세트 원소를 저장한다는 점에서 세트는 리스트와 유사하다. 그러나 리스트와 달리 세트의 원소들은 중복되지 않으며 특정한 순서로 놓이지 않는다. 애플리케이션에서 원소 순서에 상관없이 원소를 사용한다면, 세트(set)를 사용하는 것이 리스트를 사용하는 것보다 좀 더 효율적이다. 중괄호 쌍({})의 안쪽에 원소들을 놓음으로써 원소들로 구성된 세트를 생성할 수 있다.

38 세트 생성하기 s1 = set() # 빈 세트를 생성 s2 = {1, 3, 5} # 3개 원소를 가진 세트를 생성
#리스트로부터 세트를 생성 s4 = set([x * 2 for x in range(1, 10)]) # 문자열로부터 세트를 생성 s5 = set("abac") # s5 is {'a', 'b', 'c'}

39 세트 다루기와 접근하기 >>> s1 = {1, 2, 4} >>> s1.add(6)
{1, 2, 4, 6} >>> len(s1) 4 >>> max(s1) 6 >>> min(s1) 1 >>> sum(s1) 13 >>> 3 in s1 False >>> s1.remove(4) >>> s1 {1, 2, 6} >>>

40 부분세트와 상위세트 >>> s1 = {1, 2, 4}
>>> s1.issubset(s2) # s1은 s2의 부분세트이다. True >>> >>> s1 = {1, 2, 4} >>> s2 = {1, 4, 5, 2, 6} >>> s2.issuperset(s1) # s2는 s1의 상위세트이다. True >>>

41 동등 검사 >>> s1 = {1, 2, 4} >>> s2 = {1, 4, 2}
True >>> s1 != s2 False >>>

42 세트 연산 (합, |) >>> s1 = {1, 2, 4} >>> s2 = {1, 3, 5}
>>> s1.union(s2) {1, 2, 3, 4, 5} >>> >>> s1 | s2

43 세트 연산 (교, &) >>> s1 = {1, 2, 4} >>> s2 = {1, 3, 5}
>>> s1.intersection(s2) {1} >>> >>> s1 & s2

44 세트 연산 (차, -) >>> s1 = {1, 2, 4} >>> s2 = {1, 3, 5}
>>> s1.difference(s2) {2, 4} >>> >>> s1 - s2

45 세트 연산 (대칭차, ^) >>> s1 = {1, 2, 4} >>> s2 = {1, 3, 5}
>>> s1.symmetric_difference(s2) {2, 3, 4, 5} >>> >>> s1 ^ s2

46 세트 데모 Filename : setDemo.py
print(set1) set2 = set([7, 1, 2, 23, 2, 4, 5]) # 리스트로부터 세트를 생성한다. print(set2) print("빨강이 set1에 있습니까?", "빨강" in set1) # len 함수를 사용한다. print("길이는", len(set2), "입니다.") # max 함수를 사용한다. print("최댓값은", max(set2), "입니다.") # min 함수를 사용한다. print("최솟값은", min(set2), "입니다.") # sum 함수를 사용한다. print("합계는", sum(set2), "입니다.") set3 = set1 | {"초록", "노랑"} # 세트 합 print(set3) set3 = set1 - {"초록", "노랑"} # 세트 교 set3 = set1 & {"초록", "노랑"} # 세트 차 set3 = set1 ^ {"초록", "노랑"} # 세트 대칭차 list1 = list(set2) # 세트로부터 리스트를 생성한다. print(set1 == {"green", "red", "blue"}) # 두 세트 비교 set1.add("노랑") print(set1) set1.remove("노랑") Filename : setDemo.py

47 딕셔너리 왜 딕셔너리를 사용해야 하는가? 만약에 어떤 프로그램이 백만 명의 학생에 대한 정보를 저장하고 주민등록번호로 학생 정보를 자주 검색한다고 가정해보자. 이 작업을 위한 효율적인 데이터 구조는 딕셔너리이다. 딕셔너리는 키와 함께 값을 저장하는 데이터 집합이다. 키는 인덱스 연산자 처럼 사용된다.

48 키/값 쌍 검색 키 딕셔너리 항목 ... ...

49 딕셔너리 생성하기 # 빈 딕셔너리를 생성 student = {} # 딕셔너리를 생성

50 항목 추가, 수정하기 딕셔너리에서 한 항목을 추가하기 위해 다음과 같은 구문을 사용한다. 딕셔너리_이름[키] = 값
예를 들어, 딕셔너리_이름[키] = 값 student[" "] = "영희"

51 항목 삭제하기 딕셔너리에서 한 항목을 삭제하기 위해 다음과 같은 구문을 사용한다. del 딕셔너리_이름[키] 예를 들어,
del student[" "]

52 항목 순회하기 딕셔너리에 포함된 모든 항목을 순회하기 위해 다음 구문을 사용한다. for key in dictionary:
print(key + ":" + str(dictionary[key]))

53 len 함수 len(dictionary)을 사용하여 딕셔너리 내의 항목 수를 얻을 수 있다.
>>> student = {“ ":“경석”, “ ”:“우성”} >>> len(students) 2 >>>

54 딕셔너리 메소드 str keys(): tuple 일련의 키들을 반환한다. values(): tuple 일련의 값들을 반환한다.
items(): tuple clear(): None get(key): value pop(key): value popitem(): tuple 일련의 키들을 반환한다. 일련의 값들을 반환한다. 일련의 투플들을 반환한다. 각 투플은 항목별로 (키, 값)의 형태이다. 모든 항목들을 삭제한다. 키에 대한 값을 반환한다. 키에 대한 항목을 삭제하고 그 항목의 값을 반환한다. 랜덤하게 선택된 키/값 쌍을 투플 형태로 반환하고 선택된 항목을 삭제한다.

55 Reference 파이썬, Y.Daniel Liang 저, 길준민, 정재화 역, 생능출판
Introduction to Programming Using Python, Y. Daniel Liang 저자 사이트 :


Download ppt "2017년 하계 경성 프로그래밍 교육 (4/5) 경성대학교 공과대학 소프트웨어 학과."

Similar presentations


Ads by Google