본문 바로가기

Python/Python Programming

Python_Basic_04

# 튜플


# 만들기

test_tuple = tuple()
test_tuple2 = ( )
test = (1, 2, 3, 4)

type(test)
>>> tuple

 

# ? 값이 하나인 튜플

# 만들때 튜플은 괄호 여부와 상관 없이 , 여부를 묶어서 사용한다.

test_tuple3 = (1, )
test_tuple3 = 1, 

len(test_tuple3)


# 값 읽기

type(test_tuple3)

>>> tuple


# 변경 

# 튜플은 값 변경이 불가능 하다. 
# 값 추가 삭제가 불가능 하다.

# 용도 자체가 보통 매개변수로 많이 쓰이기 때문이다.

test[2] =5

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [11], in <cell line: 1>()
----> 1 test[2] =5

TypeError: 'tuple' object does not support item assignment

 

바구니에서 변수명[index]는 변수 처럼 사용 할 수 있다.
변수의 사용처
1. 데이터의 저장
2. 연산의 피 연산자
3. 함수의 매개변수

test[2] + test[1]

>>> 5


# 추가 

test_set1 = {1, 2, 3}

test_set1.add(6)
test_set1
{1, 2, 3, 6}


# 삭제 

test_set1.remove(2)
test_set1
{1, 3, 6}

 

# list에서 중복되는 값을 set을 이용해서 제거해보자

test_list = [1,2,3,4,1,2,3,4,2,2,2,2,2,2,2]

number =2
number_count = test_list.count(number)
for _ in range(number_count - 1):
    test_list.remove(number)

test_list
[1, 3, 4, 1, 3, 4, 2]

 

 

# 셋 : 집합


# 셋은 중복이 없어야 하는 경우에 사용한다.

 

# 만들기

test_set = set()
type(test_set)
set

 

test_set1 = {1, 2, 3}
type(test_set1)
set


# 값 읽기

  • 순서가 없어서 인덱싱 할 수 없다.


# 추가 

test_set.add(4)
test_set
{1, 2, 3, 4}


# 삭제 

test_set.remove(2)
test_set
{1, 3, 4}

 

# 리스트의 중복된 것 들을 제거해보자!

test_list = [1,2,3,4,1,2,3,4,2,2,2,2,2,2,2]

number =2
number_count = test_list.count(number)
for _ in range(number_count - 1):
    test_list.remove(number)

test_list
[1, 3, 4, 1, 3, 4, 2]

 

 

list(set(test_list))
[1, 2, 3, 4]

 

 


바구니 : 하나의 변수에 여러개를 담고 싶을 때
리스트(배열) : 가장 기본적인 바구니
딕셔너리 : 사전형 키 : 값 쌍으로 구성된
튜플 : 깂들의 연속(리스트랑 비슷) 단, 수정이 불가능
셋 : 집합(중복이 불가능)

 

# randint 와 set을 이용해서
# 1~45 사이의 숫자를 랜덤 하고 중복없이 6개를 뽑는 코드를 작성하시오

import random as rnd

numbers = set()
# 셋에 들어있는 요소의 갯수가 6개가 될 떄까지 뽑는다
while len(numbers) < 6 :
    numbers .add(rnd.randint(0,46))

numbers
{11, 15, 16, 23, 28, 37}

 

 

명령어 = 함수(Function) = Method


명령어 - 함수(Function) - Method
단독 명령어 print - 함수(function)
인스턴스 명령어 list.remove - Method
  • 명령어의 형태가 다양하다
  • 명령어 사용하는 법 = 함수를 사용하는법
  • function을 call한다 = 함수를 사용한다.
  • 함수는 긴 로직을 하나의 기능으로 만들어 쓰려고 사용한다.
    1. 복잡한 코드를 단순한 형태로 바꾸고 싶어서.
    2. 여러번 재사용하고 싶어서.
  • 함수는 입력 - 처리 - 출력 이있는 기능 상자라고 이야기한다.
  • 함수는 작은 단위의 프로그램
  • 함수는 처리는 필수, 입력이나 출력은 없어도 된다.

#명령어 만드는 법

def 이름():
    내용

 

# say_hello라는 이름을 가진 함수(명령어)를 만들고
# say_hello를 호출(사용)하면 "hello"라는 메세지가 화면에 출력 되도록 하시오.

def say_hello():
    print("hello")
    
say_hello()
hello

 

 

# 해당 함수를 실행하면
# 사용자에게 정수 하나를 입력받고
# 1 ~ 해당정수까지 1씩 증가하면서 출력하는 함수를 작성하시오.

def Plus_int():
    number = input("정수를입력하세요 : ")
    number = int(number)
    sum = 0
    for x in range(1,number+1,1):
        print(x)
    
    
Plus_int()
더보기
정수를입력하세요 : 12
1
2
3
4
5
6
7
8
9
10
11
12

 

def print_num():
    input_num = input("정수를 입력하세요 : ")
    end_num = int(input_num) + 1
    for num in range(1,end_num):
        print(num)

print_num( )
더보기
정수를 입력하세요 : 12
1
2
3
4
5
6
7
8
9
10
11
12

 

 

# 함수에 추가로 전달하는 옵션 - 매개변수, 파라매터, 아규먼트

# 내가 어떤 함수의 옵션을 부를 떄는 파라메터
# 함수가 자신의 옵션을 칭할 떄는 아규먼트

print(?)
print(?,?,?,?)

 

# 함수의 입, 출력을 명시하는 경우
# 이름을 **매개변수**로 입력 받아서 
# 안녕하세요 [이름]님 이라고 **리턴**하는 함수를 작성한다.

def say_hello(name):
    print(f"안녕하세요 {name}님")
say_hello("JIN")
>>> 안녕하세요 JIN님

# name은 함수 안에서만 쓰이는 파라미터이다

test = "phlip" 
say_hello(test)

 

# 매개변수에 기본값을 지정하면, 그 순간 뒤에 따라오는 모든 매개변수는 기본값을 
# 설정 해주어야 한다. 안그러면 오류가 난다.
# 입력이 있고 처리가 있다.

def Calc_bmi(Height=170,Weight=60):  # = 170 은 기본값
    Meterheight = Height/100
    BMI = Weight / (Meterheight ** 2)
    print(BMI)
    
Calc_bmi()
20.761245674740486

 

 

# 입력이 있고, 처리가 있고, 출력(처리 결과, 리턴값)있다.

def calc_bmi(weight=70, height=160):
    bmi = weight / (height/100)**2
    return bmi
result_bmi = calc_bmi

# 출력된 값을 사용하는 방법

result_bmi = calc_bmi()
print("최종 BMI는", result_bmi, "입니다")
최종 BMI는 27.343749999999996 입니다

 

a = 67.5
b = 180.3
calc_bmi(a,b)

>>> 20.76406211499968
calc_bmi(70)
>>> 24.221453287197235

 

# 두개의 숫자를 전달(입력)받아서 
# 두 숫자의 합을 결과로 돌려주는 함수를 작성하시오

def sum(num1=1, num2=1):
    sum= num1 + num2
    return sum

sum(12,45)
57

 

 

 

기명 매개변수, 가변 매개변수, 가변 키워드 매개변수


 

 

# 가변 매개변수

print(1, "a", 3.14) <---- 매개변수의 갯수가 고정되어있지 않은 것

 

# 가변 키워드 매개변수

print("a",end="1")  --- > end 가변 키워드 매개변수, 키워드를 지정함

 

# 가변 매개변수 * 사용 

def total (* numbers):
    print(numbers)
    
total("a",3,3.14)

>>> ('a', 3, 3.14)

 

# 키워드 매개변수 **

# 키워드 매개변수
def key_test(**test):
    print(test)
    
key_test()
>>> { }
key_test(a=7, b=8, say='hello', name='jake')
{'a': 7, 'b': 8, 'say': 'hello', 'name': 'jake'}

 

# Bingo Game


# 1~25 사이의 정수를 모두 사용해서
# 랜덤하게 5x5 빙고 판을 구성하는 프로그램을 작성하시오.
# 5x5 숫자들을 화면에 출력하면 됩니다.

def gen_bingo():
    numbers = list(range(1,26))
    import random as rnd
    rows = []
    for _ in range(5):
        row = []
        for _ in range(5):
            index = rnd.randint(0,len(numbers)-1)
            number = numbers.pop(index)
            row.append(number)
        rows.append(row)
    print(rows)  --> 함수로 만들어 변수를 이용하려면 return rows로 놓아야함
[[2, 7, 22, 21, 20], [13, 12, 11, 10, 6], [19, 8, 24, 4, 23], [25, 5, 14, 17, 18], [3, 16, 15, 9, 1]]

 

 

# game 변수에 담긴 숫자 중에서 
# 원하는 숫자를 0으로 바꾸기
# 1. 어느 줄에 해당 숫자가 있는지 찾기
# 2. 그 줄에 어느 인덱스에 해당 숫자가 있는지 찾기
# 3. 해당 칸의 숫자를 0으로 바꾸기

def set_0(game, search_num):
    for row in game:
        if search_num in row:
            index = row.index(search_num)
            row[index] = 0

 

set_0(game, 19)
[[22, 17, 24, 0, 16], [20, 12, 14, 13, 15], [9, 5, 4, 21, 0], [25, 6, 10, 7, 23], [18, 8, 2, 11, 3]]

 

 

# 한 행(row)이 빙고인지?

for row in game:
    if row.count(0) == 5:
        print("1 row bingo")

 

 

# 한 열(colunm) 이 빙고인지?

for column in range(5):
    row_count = 0
    for row in game:
        if row[column] == 0:
            row_count+=1
    if row_count == 5:
        print("1 row bingo")

 

 

# 대각선 빙고는 어떻게?

count = 0
for index in range(5):
    if game[index][index] == 0
        count += 1
if count == 5:
    print("대각선 bingo")
count = 0
for index in range(5):
    if game[index][4-index] == 0
        count += 1
if count == 5:
    print("대각선 bingo")

 

 

# 총빙고 갯수는?

 if count == 5:
        print("대각선 bingo")

    print("총 빙고 갯수", bingo_count)

 

 

# 빙고만들기, 빙고 갯수 측정, 총빙고 갯수 측정하는 함수 3가지 만들자!

def gen_bingo():
    numbers = list(range(1,26))
    import random as rnd
    rows = []
    for _ in range(5):
        row = []
        for _ in range(5):
            index = rnd.randint(0,len(numbers)-1)
            number = numbers.pop(index)
            row.append(number)
        rows.append(row)
    return rows

def set_0(game, search_num):
    for row in game:
        if search_num in row:
            index = row.index(search_num)
            row[index] = 0
            break
    else:
        print("이미 한번 찾은 숫자입니다.")
        
def get_bingocount(game):
    bingo_count = 0
    # 한줄이 빙고인지?
    for row in game:
        if row.count(0) == 5:
            print("1 row bingo")
            bingo_count += 1

    # 한 컬럼이 빙고인지?
    for column in range(5):
        row_count = 0
        for row in game:
            if row[column] == 0:
                row_count+=1
        if row_count == 5:
            print("1 column bingo")
            bingo_count += 1

    count = 0
    for index in range(5):
        if game[index][index] == 0:
            count += 1
    if count == 5:
        print("대각선 bingo")
        bingo_count += 1

    count = 0
    for index in range(5):
        if game[index][4-index] == 0:
            count += 1
    if count == 5:
        print("대각선 bingo")
        bingo_count += 1

    print("총 빙고 갯수", bingo_count)
    return bingo_count

 

 

 

최종 빙고 게임 코딩

game = gen_bingo() # 원본 게임판 준비

while True:
    # 맞출 숫자 하나 입력하기
    number = input("숫자 : ")
    number = int(number)
    # 그 숫자가 있다면 0으로 체크
    set_0(game, number)
    # 빙고가 됐는지 확인
    game_count = get_bingocount(game)
    
    print(game) # 원본 게임판 재 출력
    if game_count == 3:
        print("Bingo!!!!")
        break
더보기
숫자 : 1
총 빙고 갯수 0
[[5, 6, 25, 21, 10], [20, 7, 11, 0, 18], [2, 22, 12, 15, 23], [17, 4, 16, 3, 24], [8, 14, 9, 13, 19]]
숫자 : 18
총 빙고 갯수 0
[[5, 6, 25, 21, 10], [20, 7, 11, 0, 0], [2, 22, 12, 15, 23], [17, 4, 16, 3, 24], [8, 14, 9, 13, 19]]
숫자 : 3
총 빙고 갯수 0
[[5, 6, 25, 21, 10], [20, 7, 11, 0, 0], [2, 22, 12, 15, 23], [17, 4, 16, 0, 24], [8, 14, 9, 13, 19]]
숫자 : 27
이미 한번 찾은 숫자입니다.
총 빙고 갯수 0
[[5, 6, 25, 21, 10], [20, 7, 11, 0, 0], [2, 22, 12, 15, 23], [17, 4, 16, 0, 24], [8, 14, 9, 13, 19]]

 

 

 

파일 입출력


# 1. 파일에 저장한다라고 안한다. 파일에 출력한다. 
# 2. 입출력은 굉장히 비싼 명령어다.
# 3. 파일에 대한 권한은 운영체제가 가지고 있다. --> 충돌하는 것을 막기 위해

 

# mode: r(읽기 전용), w(쓰기전용), a(append 기존에있는 파일에 추가/ w 쓰면 덮어쓴다)
# + : rb(바이너리 파일), rt, wb, wt,
#  open(파일 경로 및 파일 이름)

# mode : r, w, a
# + : rb, rt, wb, wt

 

 

file = open('test.txt', 'w')  쓰기 모드로 파일 열기
print("Hello Sessac", file=file)  print함수를 이용해 파일에 기록하기
file.write("Hello Sessac")  파일에 기록하기
file.close()  파일 닫기

 

file = open('test.txt', 'r')
file.read()  파일의 내용을 한꺼번에 읽기
file.readline()  파일의 내용을 한줄씩 순서대로 읽기
file.readlines()  모든 내용을 줄별로 리스트에 저장해서 준다.
file.close()

 

file = open('test.txt', 'r')
file.read()  파일의 내용을 한꺼번에 읽기
file.seek(0)  파일 읽기 위치를 처음으로 되돌리기
file.readline()  파일의 내용을 한줄씩 순서대로 읽기
file.seek(10)
test = file.readlines()  모든 내용을 줄별로 리스트에 저장해서 준다.
file.tell()  어디까지 읽었는지 알려준다.
file.close()