no image
[Python] 내장 함수
파이썬에는 많은 내장 함수가 있다. 모든 내장 함수를 다루고 싶지만, 모든 내장 함수를 정리하는 것은 시간도 많이 필요하고 비 효율적이다. 그래서 사용 빈도가 높은 함수들만 정리하겠다. 숫자 관련 내장 함수 int() 함수 문자열 형태의 숫자나 소수점이 있는 숫자 등을 int 형태로 리턴함 int(1.23) #1 int(123) #123 int("123") #문자열도 숫자로 바꿀 수 있음 int(True) #1 0은 False, 1은 True(0 이외의 숫자는 모두 True임) float() 함수 문자열 형태의 숫자나 소수점이 없는 숫자 등을 float형태로 리턴함 float("123") #123.0 float(10) #10.0 float(True) #1.0 float(1.123) #1.123 문자열 관..
2022.12.09
no image
[Python] Single Linked List(단일 링크드 리스트)
노드 클래스 class Node: def __init__(self, data): self.data = data self.next = None Single Linked List 클래스 class SLL: def __init__(self, data): #생성자 self.head = Node(data) def append(self, data): #노드 추가 current_node = self.head while current_node.next is not None: current_node = current_node.next current_node.next = Node(data) def print(self): #노드 출력 current_node = self.head while current_node is not..
2022.12.09
no image
[Python] 예외 처리
오류의 종류 프로그램 실행 전에 발생하는 오류 : 문법 오류 프로그램 실행 중에 발생하는 오류 : 런타임 오류(예외) 예외 처리는 런타임 오류를 최대한 줄이는 것이다. try-except try-except의 기본 형태 try: #예외가 일어날 것 같은 코드 입력 except: #예외가 일어나면 할 작업 입력 try블록에는 예외가 일어날 것 같은 코드를 입력한다. try블록에서 오류가 일어난다면 except블록에 입력된 명령이 실행된다. try블록에서 오류가 일어나지 않는다면 except블록의 명령이 실행되지 않는다. intnum = input("정수를 입력하세요 : ") try: print(f"당신이 입력한 값은 {int(intnum)}입니다") except: print("잘못된 값을 입력했습니다.")..
2022.12.09
no image
[Python] 파일 입출력
파일 입출력을 알기 전에 파일 입출력을 알기 전에 알아야 하는 개념이 있다. 파일의 논리적 구조 파일 안에는 byte들이 순차적으로 저장되어 있다. 파일의 맨 끝에는 EOF(end-of-file)마커가 있다. 파일 포인터 파일의 입출력 동작이 발생하는 위치를 파일 포인터라고 한다. 파일을 처음 열면, 파일 포인터는 파일의 첫 번째 바이트를 가리킨다. 파일의 내용을 읽거나 쓰면 파일 포인터는 자동으로 업데이트(다음 바이트를 가리킴)된다. 파일 열고 닫기 파일 열기 open()함수를 이용하여 파일을 열 수 있다. close()함수를 이용하여 파일을 닫을 수 있다. open() : 파일의 이름을 받아서 파일 객체를 생성한 후 이를 반환 close() : 파일 객체가 가지고 있는 close()메소드 호출 시 파..
2022.12.08
no image
[Python] 모듈
모듈이란? 여러 개의 변수와 함수를 지니고 있는 집합체를 모듈이라고 한다. -자바의 라이브러리와 유사한 개념 모듈은 표준 모듈과 외부 모듈로 나뉜다 표준 모듈 : 파이썬이 기본적으로 내장하고 있는 모듈 외부 모듈 : 개발자가 만들어서 공개한 모듈 여러 개의 변수와 함수를 지닌 집합체를 모듈이라고 하고 이러한 모듈이 합쳐진 것을 패키지라고 한다. -모듈을 디렉토리 형식으로 구조화한 것이 패키지 모듈을 사용하는 이유 코드 재사용에 유리 코드를 기능별로 구분하고 관리에 편리 복잡하고 어려운 기능을 포함하는 프로그램을 간단한 코드로 제작 가능 모듈 사용하기 import문으로 모듈을 가져올 수 있다. import random #랜덤 모듈 가져오기 print(random.randint(0,10)) from문으로 특..
2022.12.08
no image
[Python] 문자열
문자열 문자열도 시퀀스 자료구조에 속함 리스트에서 사용했던 인덱싱, 슬라이싱, 내장함수 모두 문자열에서 쓸 수 있음 문자열 내장 함수 함수 설명 chr() 정수를 문자로 변환 ord() 문자를 정수로 변환 len() 문자열의 길이를 반환 str() 객체의 문자열 표현을 반환 하지만 문자열은 불변객체이기 때문에, 리스트와는 달리 문자열을 바꿀 수 없다. word = "abcdef" word[0]="A" #TypeError: "str" object does not support item assignment 문자열 변경을 위해서는 새로운 사본 생성이 필요하다. ( 대부분 알아서 사본을 생성해주니 크게 신경 안 써도 된다) word = "abcdef" word = "A" + word[1:] print(word)..
2022.12.08
no image
[Python] 딕셔너리
딕셔너리란? 다수의 값을 저장하는 구조 값(value)과 관련된 키(key)도 저장됨 키를 통해 값에 접근 순서가 없음 딕셔너리의 생성 딕셔너리_이름 = {키1 : 값1, 키2 : 값2, 키3 : 값3, ........} capitals = {} #공백 딕셔너리 생성 capitals = {"Korea" : "Seoul", "USA" : "Washingtom", "UK" : "London"} #키와 값을 정의 키는 반드시 불변 객체이며 유일해야 함 -유일한 문자열, 숫자 또는 튜플 항목 탐색하기 capitals ={"Korea":"Seoul","USA":"Washington","UK":"London"} print( capitals["Korea"]) # 해당 딕셔너리 키가 없을 경우 예외 발생 #출력 결과 ..
2022.12.07
no image
[Python] 세트
세트의 개념 세트는 우리가 수학에서 배웠던 집합의 개념과 똑같음 세트는 리스트와 다르게 요소는 특정 순서로 저장되지 않으며 위치별로 액세스 할 수 없음 순서 유지의 필요가 없어 속도가 빠름 순서가 없기에 중복 항목은 지원하지 않음 세트의 생성 세트의 생성 세트_이름 = {항목1, 항목2, 항목3, ...} numbers = {1,2,3} #초기화된 세트 생성 values = set() #공백 세트 생성​ 리스트와 문자열을 사용한 세트의 정의 리스트로 세트 정의 numbers =set([1,2,3,1,2,3]) print(numbers) #출력 결과 : {1,2,3} 중복 데이터는 하나로 전환 문자열로 세트 정의 letters = set("abcab”) 리스트와 세트 간 전환을 활용한 예제 -리스트의 중복..
2022.12.07

파이썬에는 많은 내장 함수가 있다.

모든 내장 함수를 다루고 싶지만, 모든 내장 함수를 정리하는 것은 시간도 많이 필요하고 비 효율적이다.

그래서 사용 빈도가 높은 함수들만 정리하겠다.

 

숫자 관련 내장 함수

int() 함수

문자열 형태의 숫자나 소수점이 있는 숫자 등을 int 형태로 리턴함

int(1.23) #1

int(123) #123

int("123") #문자열도 숫자로 바꿀 수 있음

int(True) #1 0은 False, 1은 True(0 이외의 숫자는 모두 True임)

float() 함수

문자열 형태의 숫자나 소수점이 없는 숫자 등을 float형태로 리턴함

float("123") #123.0

float(10) #10.0

float(True) #1.0

float(1.123) #1.123

 

문자열 관련 내장 함수

str() 함수

str함수는 int, float, bool 타입을 str(string) 형태로 리턴함

str(100) #"100"

str(1.0) #"1.0"

str(True) #"True"

 

논리 관련 내장 함수

bool 함수는 float, int, str 타입을 bool 형태로 리턴함

True
bool(1) # True

bool(123.123) #True -> 0이 외의 숫자는 모두 True임

bool("False") #True

bool("0") #True / 문자열은 숫자가 아니기에​
False
bool(0) #False

bool(0.0) #False

bool('') #False / 빈 문자열은 False

bool("") #False / 빈 문자열은 False​

 

진수 변환 내장 함수

  • hex(x) : 정수 x를 16진수로 변환하여 리턴
  • oct(x) : 정수 x를 8진수로 변환하여 리턴
  • bin(x) : 정수 x를 2진수로 변환하여 리턴

진수와 진수 변환에 대해 모른다면 제 블로그에 정리해 놓은 자료가 있습니다.

2022.11.29 - [기타/Digital Logic] - [Digital Logic] 수의 체계

 

[Digital Logic] 수의 체계

[진수] [10진수] 기수가 10인 수 0, 1, 2 ,3, 4, 5, 6 ,7, 8, 9 -> 10개 수로 표현 [2진수] 기수가 2인 수 0, 1 두개의 수로 표현 [8진수와 16진수] [8진수] 0~7까지 8개의 수로 표현 2진수 3자리는 8진수 1자리 2진수

rebugs.tistory.com


hex() 함수

정수 (int 타입)를 입력받아 16진수로 변환하여 리턴함

hex(0) #"0x0"

hex(1) #"0x1"

hex(10) #"0xa" #10은 16진수로 a임

hex(123) #"0x7b"

위의 예제에서 0x가 붙어서 나오는데 0은 진수 변환을 했다는 뜻이고, x는 16진수를 뜻합니다.

 

oct() 함수

정수를 입력 받아 8진수로 변환하여 리턴함

oct(0) #'0o0'

oct(1) #'0o1'

oct(10) #'0o12'

oct(123) #'0o173'

위의 예제에서 0o가 붙어서 나오는데 0은 진수 변환을 했다는 뜻이고, o는 8진수를 뜻합니다.

 

bin() 함수

정수를 입력받아 2진수로 변환하여 리턴

bin(0) #'0b0'

bin(1) #'0b1'

bin(10) #'0b1010'

bin(123) #'0b1111011'

위의 예제에서 0b가 붙어서 나오는데 0은 진수 변환을 했다는 뜻이고, b는 2진수를 뜻합니다.

 

컬렉션 타입 & iterable 자료형

컬렉션 타입의 자료형에는 순차 자료형과 비순차 자료형이 있음

 

순차(sequence) 자료형

  • 문자열, 수치 등을 관리하기 위한 자료형으로 순서 개념이 있음
  • 배열 형식의 구조로 인덱스를 이용하여 데이터에 접근
  • 리스트, 튜플, 문자열 등이 있음

비순차(non-sequence) 자료형

  • 문자열 수치 등을 관리하기 위한 자료형으로 순서 개념이 없음
  • 인덱스를 이용한 접근 불가
  • 딕셔너리, 집합(set)등이 있음

반복 가능한 객체(iterable)

  • 객체의 속한 요소(member)를 하나씩 찰로 반환하는 객체
  • 대표적으로 list, dict, set, str, bytes, tuple, range

 

컬렉션 타입 & iterable 내장 함수

list() 함수

iterable 객체를 받아 리스트로 변환한 후 리턴

list((1, 2, 3)) #[1, 2, 3]

list((1, 2, 3, 2, 1)) #[1, 2, 3, 2, 1]

 

set() 함수

iterable 객체를 받아 set으로 변환한 후 리턴

set((1, 2, 3)) #{1, 2, 3}

set((1, 2, 3, 2, 1)) #{1, 2, 3} -> set은 중복을 제거함

 

tuple()함수

iterable을 입력받아 튜플 형태로 변경하여 리턴

tuple("abc") #('a', 'b', 'c’)

tuple([1, 2, 3]) #(1, 2, 3) 

tuple((1, 2, 3)) #(1, 2, 3)

 

range()함수

range(start, stop, step)에서 start부터 stop-1까지 step만큼 숫자를 더해가며 연속된 숫자를 생성한 후 이터러블로 만들어 리턴 -> 그냥 예제 보는 게 쉬움

range(10) #0에서 부터 9까지 1을 더함

range(0, 10) #위와 똑같은 뜻

list(range(4, 7)) #[4, 5, 6]

list(range(5, 10)) #[5, 6, 7, 8, 9]

list(range(1, 10, 2)) #[1, 3, 5, 7, 9] 

list(range(0, -10, -1)) #[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

 

dict() 함수

매개변수 안에 있는 자료를 딕셔너리 형태로 바꾸고 리턴

dict(one=1, two=2, three=3) #{'one': 1, 'three': 3, 'two': 2}

dict([('two', 2), ('one', 1), ('three', 3)]) #{'one': 1, 'three': 3, 'two': 2}

map() 함수

map(f, iterable)은 함수와 iterable 객체를 입력받은 후 iterable의 각 요소를 입력값으로 f가 수행한 결과를 묶어서 반환

def two_times(x):
return x*2 
list(map(two_times, [1, 2, 3, 4])) #[2, 4, 6 ,8]

len() 함수

입력받은 자료형의 길이 리턴

len("abc") #3

len([1, 2, 3]) #3

len({1, 2, 3}) #3

 

수학 관련 내장 함수

  • abs(number): 숫자 number의 절댓값을 반환
  • pow(number, y): 숫자 number에 y 제곱한 결과를 반환
  • round(number , ndigits): 숫자 number를 ndigits 자리에서 반올림한 후 반환
  • max(iterable): iterable 객체에서 최댓값을 반환
  • min(iterable): iterable 객체에서 최댓값을 반환
  • sum(iterable): iterable 객체의 모든 요소의 합을 반환

abs() 함수

정수, 실수 등의 숫자를 절대값을 변환하여 리턴

abs(3) #3

abs(-3) #3

abs(-1.2) #1.2

 

pow() 함수

pow(x, y)에서 x에 y를 제곱한 결과를 반환

pow(2, 4) #16 

pow(3, 3) #27

pow(5, 2) #25

 

round() 함수

round(x , y)에서 숫자 x를 소수점 y 자리까지 반올림한 후 반환

round(1.6) #2 

round(1.2) #1

round(1.234, 2) #1.23

round(1.678, 1) #1.7

 

max(), min() 함수

iterable 객체를 입력받아 최댓값(최솟값)을 반환

max([1, 2, 3]) #3 

max("python") #'y' -> 알파벳도 순위가 있다 a가 제일 낮고, z가 제일 높다

max({1:3, 2:'a’}) #2 오직 key 값만 비교해서 제일 큰 값을 리턴함
min([1, 2, 3]) #1

min("python") 'h'

min({1:3, 2:'a’}) #1 -> 오직 key값만 비교

 

sum()함수

iterable 객체를 입력받아 모든 요소의 합을 반환

sum([1,2,3]) #6 

sum((4,5,6)) #15

sum({1:3, 2:'a’}) #3 -> key값만 더함

sum({1, 2}) #3

 

정렬 관련 내장 함수

  • reversed(seq): seq의 요소 순서를 역순으로 수정한 iterator 객체로 반환
  • sorted(iterable): iterable 객체를 정렬한 후 그 결과를 리스트로 반환
  • filter(f, iterable): iterable 객체의 각 요소에 f 함수를 반영한 후 True가 반환되는 요소만을 iterator 객체로 반환

reversed() 함수

sequence 객체를 입력받아 객체의 요소 순서를 역순으로 수정한 후 iterable 객체로 반환

reversed(["a", "b", "c", "d"]) #<list_reverseiterator at 0x7f278dc2cd50>

#<list_reverseiterator at 0x7f278dc2cd50> -> 이터러블 객체 자체임
#이터러블 객체 자체를 다루긴 힘드니 다른 함수를 이용하여 접근해보자

list(reversed(["a", "b", "c", "d"])) #['d', 'c', 'b', 'a']

 

sorted() 함수

iterable 객체를 입력받아 정렬한 후 결과를 리스트로 반환함

sorted([3, 1, 2]) #[1, 2, 3]

sorted(['a', 'c', 'b’]) #['a', 'b', 'c’] 

sorted("zero") #['e', 'o', 'r', 'z’] 

sorted((3, 2, 1)) #[1, 2, 3]

 

filter() 함수

함수(f), iterable 객체를 입력받아 각 요소에 f 함수를 반영한 후 True를 만족하는 요소만을 모아 iterable로 반환

def positive(x):
return x > 0
print(list(filter(positive, [1, -3, 2, 0, -5, 6]))) #[1,2,6]

'Python Category > Python' 카테고리의 다른 글

[Python] 파이썬 자료형  (0) 2023.08.24
[Python] 파이썬 기본적인 용어  (0) 2023.08.23
[Python] 예외 처리  (2) 2022.12.09
[Python] 파일 입출력  (1) 2022.12.08
[Python] 모듈  (0) 2022.12.08

노드 클래스

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

 

Single Linked List 클래스

class SLL:
    def __init__(self, data): #생성자
        self.head = Node(data)

    def append(self, data): #노드 추가
        current_node = self.head
        while current_node.next is not None:
            current_node = current_node.next
        current_node.next = Node(data)

    def print(self): #노드 출력
        current_node = self.head
        while current_node is not None:
            print(current_node.data)
            current_node = current_node.next

    def get_index(self, index): #노드 인덱스 알아내기
        conut = 0
        node = self.head
        while conut < index:
            conut += 1
            node = node.next
        return node

    def insert_node(self, index, value): #노드 삽입
        new_node = Node(value)
        if index == 0:
            new_node.next = self.head
            self.head = new_node
            return
        previous_node = self.get_index(index-1)
        next_node = previous_node.next
        previous_node.next = new_node
        new_node.next = next_node

    def delete_node(self, index): #노드 삭제
        if index == 0:
            self.head = self.head.next
            return
        node = self.get_index(index-1)
        node.next = node.next.next

 

테스트 결과

노드 추가

 

노드 삭제

 

노드 삽입

오류의 종류

  • 프로그램 실행 전에 발생하는 오류 : 문법 오류
  • 프로그램 실행 중에 발생하는 오류 : 런타임 오류(예외)

예외 처리는 런타임 오류를 최대한 줄이는 것이다.

 

try-except

try-except의 기본 형태

try:
    #예외가 일어날 것 같은 코드 입력
except:
    #예외가 일어나면 할 작업 입력
  • try블록에는 예외가 일어날 것 같은 코드를 입력한다.
  • try블록에서 오류가 일어난다면 except블록에 입력된 명령이 실행된다.
  • try블록에서 오류가 일어나지 않는다면 except블록의 명령이 실행되지 않는다.
intnum = input("정수를 입력하세요 : ")
try:
    print(f"당신이 입력한 값은 {int(intnum)}입니다")
except:
    print("잘못된 값을 입력했습니다.")

위의 예제에서 사용자로부터 입력을 받고 그 값이 정수면 프로그래머가 의도한 대로 흐름이 이어지는 것이고, 실수나, 문자열 등을 입력하면 의도한 대로 흐름이 이어지는 것이 아니다. 그래서 except문으로 의도한 대로 가게끔 하면 된다.

 

try-except-else

try:
    #오류가 일어날수도 있는 작업 입력
except:
    #오류가 일어났을 때의 작업 입력
else:
    #오류가 일어나지 않았을 때 작업 입력

try-except-else구문은 예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고 나머지를 모두 else구문으로 빼는 경우가 많다.

intnum = input("정수를 입력하세요 : ")
try:
    intnum = int(intnum)
except:
    print("잘못된 값을 입력했습니다.")
else:
    print(f"당신이 입력한 값은 {int(intnum)}입니다")

 

finally문

  • finally 구문은 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문이다.
  • 예외가 발생하든 안 하든 무조건 실행된다.
  • 함수 내부에서 try-finally문을 사용하고 있다면 return을 만나도 finally문은 실행된다.

 

intnum = input("정수를 입력하세요 : ")
try:
    intnum = int(intnum)
    print(f"당신이 입력한 값은 {int(intnum)}입니다")
except:
    print("잘못된 값을 입력했습니다.")
finally:
    print("finally 구문 실행")

위의 예제에서 사용자로부터 정수를 받아도 finally구문은 실행되고, 정수 이외의 값을 받아도 finally 구문은 실행된다.

 

def func(intnum):
    try:
        intnum = int(intnum)
        print(f"당신이 입력한 값은 {int(intnum)}입니다")
        return
    except:
        print("잘못된 값을 입력했습니다.")
        return
    finally:
        print("finally 구문 실행")
intnum = input("정수를 입력하세요 : ")
func(intnum)

위의 예제에서 함수 매개변수로 정수를 넘기든, 정수 외에 다른 값을 넘기든 finally문은 무조건 실행된다.

(return을 만나도 finally문은 실행됨)

 

예외 처리 조합

  • try-except
  • try-except-else
  • try-except-finally
  • try-except-else-finally
  • try-finally

이 외의 조합은 실행했을 때 문법 오류가 발생한다.

 

예외 구분하기

except 뒤에 예외의 종류를 입력해서 예외를 구분할 수 있음

try:
    #예외가 발생할 가능성이 있는 구문
except:예외의 종류A
    #예외 A가 발생했을 떄 실행할 구문
except:예외의 종류B
    #예외 B가 발생했을 떄 실행할 구문
except:예외의 종류C
    #예외 C가 발생했을 떄 실행할 구문

예를 들면

list_number = [52, 273, 32, 72, 100]
try:
    number_input = int(input("정수 입력> "))
    print(f"{number_input}번째 요소: {list_number[number_input]}")
except ValueError:
    # ValueError가 발생하는 경우
    print("정수를 입력하세요")
except IndexError:
    # IndexError가 발생하는 경우
    print("리스트의 인덱스를 벗어났음")

이렇게 예외의 종류에 따라 다르게 대응할 수 있다.

 

예외 구분이 안될 때

위에서 예외를 구분했는데, 예외의 구분은 예외의 종류에 따라 다르게 대응하기 위함이다

하지만 예외의 종류를 알 수 없다면 어떻게 해야할까?

최대한 예외를 구분해서 사용자에게 알렸지만, 예외를 구분할 수 없다면 사용자에게 무슨 예외가 일어났는지 알려달라고 요청하는 방법밖에 없다.

우리가 어떤 프로그램을 쓰다가 오류가 나면 오류 내용을 서술해서 전송해달라고 요청하는 프로그램을 봤을 것이다.

이럴 때 사용하는 것이 모든 예외의 어머니인 Exception을 사용하는 것이다.

list_number = [52, 273, 32, 72, 100]
try:
    number_input = int(input("정수 입력> "))
    print(f"{number_input}번째 요소: {list_number[number_input]}")
    ㅇㅇ.ㅁㄴㅇㅁㄴㅇ()#일부러 예외를 발생시킴
except ValueError:
    # ValueError가 발생하는 경우
    print("정수를 입력하세요")
except IndexError:
    # IndexError가 발생하는 경우
    print("리스트의 인덱스를 벗어났음")
except Exception:
    print("알수없는 오류가 일어났습니다. 오류 내용을 저희에게 알려주세요.")

이렇게 예외 처리를 하면 사용자에게 피드백을 받을 수 있다.

'Python Category > Python' 카테고리의 다른 글

[Python] 파이썬 기본적인 용어  (0) 2023.08.23
[Python] 내장 함수  (0) 2022.12.09
[Python] 파일 입출력  (1) 2022.12.08
[Python] 모듈  (0) 2022.12.08
[Python] 문자열  (1) 2022.12.08

파일 입출력을 알기 전에

파일 입출력을 알기 전에 알아야 하는 개념이 있다.

 

파일의 논리적 구조

  • 파일 안에는 byte들이 순차적으로 저장되어 있다.
  • 파일의 맨 끝에는 EOF(end-of-file)마커가 있다.

파일 포인터

파일의 입출력 동작이 발생하는 위치를 파일 포인터라고 한다.

  • 파일을 처음 열면, 파일 포인터는 파일의 첫 번째 바이트를 가리킨다.
  • 파일의 내용을 읽거나 쓰면 파일 포인터는 자동으로 업데이트(다음 바이트를 가리킴)된다.

파일 열고 닫기

파일 열기

open()함수를 이용하여 파일을 열 수 있다.

close()함수를 이용하여 파일을 닫을 수 있다.

  • open() : 파일의 이름을 받아서 파일 객체를 생성한 후 이를 반환
  • close() : 파일 객체가 가지고 있는 close()메소드 호출 시 파일 닫힘

open()함수로 파일을 열 때, 어떤 모드로 작업을 할 것인지 명시해야 한다.

파일 모드 모드 이름 설명
r 읽기 모드 처음 부터 읽는다
w 쓰기 모드 처음부터 쓴다. 파일이 없으면 생성된다. 파일이 존재하면 기존의 내용은 지워진다.
a 추가 모드 파일의 끝에 쓴다. 파일이 없으면 생성된다.
r+ 읽기와 쓰기 모드 파일에 읽고 쓸 수 있는 모드이다. 모드를 변경하려면 seek()가 호출 되어야 함
file = open("input.txt", "r") #파일 열기(읽기 모드)
#명령
file.close() #파일을 열었으면 꼭 닫아주자

 

파일 닫기

파일 닫기는 기본적으로 close() 메소드를 이용하여 이루어지지만, 파일을 닫지 않았을 때, 닫히지 않은 파일 때문에 메모리가 계속 낭비되니 꼭 닫아줘야 한다. 아래의 내용은 프로그래머가 실수로 파일을 열고 닫지 않는 것을 방지하는 구문이다.

 

try - finally 구문 사용

파일을 열 때 오류가 발생되었을 때 사용한다.

finally구문은 오류가 나든 안 나든 무조건 실행되니, 파일을 확실히 닫을 수 있다.

try: # 예외가 발생할 가능성이 있는 작업들을 여기에  둔다.
     infile  = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
     #여러가지 파일 처리 작업 코드 작성
finally:# try블록에서 예외 발생시 프로그램 종료 전 반드시  실행된다.
     infile.close( )

 

with구문 사용

with 명령문 내의 블록이 종료될 때 파일이 자동으로 닫힘

close() 메소드 호출이 필요 없다

with open("input.txt", "r", encoding = "UTF8") as infile:
    line = infile.readline().rstrip()
    while line != "" :
        print(line)
        line = infile.readline()

 

 

파일 읽고 쓰기

파일 읽기

한 줄씩 읽기

파일을 열었다면 readline 메소드를 이용하여 한 줄씩 읽을 수 있다.

파일 포인터는 파일의 첫 위치에 있다가 readline 메소드 실행 시 다음 줄로 이동한다.

infile  = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
line = infile.readline()
while line != "" :
    print(line)
    line = infile.readline()
#출력 결과
#홍길동
#
#김철수

코드에 보이는 encoding = "UTF8"은 뒤에서 설명하겠다.

이런 식으로 코드를 작성하면 출력 결과와 같이 줄 바꿈이 같이 출력된다.

그 이유는 line 변수 안에 줄 바꿈(\n)이 포함되어 있어서 그런 것이다.

이럴 때는 아래의 코드로 변경해보자

infile  = open("input.txt", "r", encoding = "UTF8") #input이 같은 위치에 있다 가정
line = infile.readline().rstrip() #rstrip을 이용하여 오른쪽에 줄바꿈 문자와 같은 공백 제거
while line != "" :
    print(line)
    line = infile.readline().rstrip()
#출력 결과
#홍길동
#김철수

 

encoding = "UTF8" -> 인코딩 방식 설정
인코딩(Encoding)은 문자를 바이트로 변환하는 것, 디코딩(Decoding)은 바이트를 문자로 변환하는 것을 말한다
그리고 그 변환하는 방식에 UTF-8, CP949, ANSI 등등이 존재하는데
인코딩과 디코딩 방식이 서로 일치해야 프로그램이 정상적으로 읽어낼 수 있다.
인코딩 방식을 설정하지 않으면, 메모장의 인코딩 방식과 파이썬의 디코딩 방식이 일치하지 않아 오류가 발생한다.

 

통째로 읽기

파일을 한줄 씩 말고 통째로 읽을 수도 있다.

read()메소드를 이용하면 된다.

with open("input.txt", "r", encoding = "UTF8") as infile:
    all = infile.read()
    print(all)

파일이 무척 크다면 많은 양의 메모리를 필요로 하기 때문에 주의가 필요하다

 

한 글자씩 읽기

read() 메소드에 매개변수로 1을 입력하면 한 글자씩 읽는다

with open("input.txt", "r", encoding = "UTF8") as infile:
    one = infile.read(1)
    while one != "":
        print(one)
        one = infile.read(1)
#출력 결과
#홍
#길
#동
#
#
#김
#철
#수

 

파일 쓰기

  • “w”모드로  파일을  열었을  때  파일에  쓰기  가능
  • wirte() 메소드 사용
with open("input.txt", "w", encoding = "UTF8") as infile:
    infile.write("ReBugs\n")

실행을 해보면 input.txt파일에 ReBugs라고 적혀있는 것을 볼 수 있다.

w모드는 기존에 있던 내용을 초기화하고 새로 쓰는 것을 인지하길 바란다.

이어서 쓰고 싶으면 a모드를 사용하면 된다.

 

또한 변수의 값을 문자열에 포함시켜서 쓸 수 있다.

with open("input.txt", "w", encoding = "UTF8") as infile:
    url = "https://rebugs.tistory.com/"
    infile.write(f"ReBugs 주소 : {url}\n")
input.txt
ReBugs 주소 : https://rebugs.tistory.com/

 

'Python Category > Python' 카테고리의 다른 글

[Python] 내장 함수  (0) 2022.12.09
[Python] 예외 처리  (2) 2022.12.09
[Python] 모듈  (0) 2022.12.08
[Python] 문자열  (1) 2022.12.08
[Python] 딕셔너리  (0) 2022.12.07

모듈이란?

여러 개의 변수와 함수를 지니고 있는 집합체를 모듈이라고 한다.

  -자바의 라이브러리와 유사한 개념

 

모듈은 표준 모듈과 외부 모듈로 나뉜다

  • 표준 모듈 : 파이썬이 기본적으로 내장하고 있는 모듈
  • 외부 모듈 : 개발자가 만들어서 공개한 모듈

 

여러 개의 변수와 함수를 지닌 집합체를 모듈이라고 하고 이러한 모듈이 합쳐진 것을 패키지라고 한다.

  -모듈을 디렉토리 형식으로 구조화한 것이 패키지

모듈을 사용하는 이유

  • 코드 재사용에 유리
  • 코드를 기능별로 구분하고 관리에 편리
  • 복잡하고 어려운 기능을 포함하는 프로그램을 간단한 코드로 제작 가능

 

모듈 사용하기

import문으로 모듈을 가져올 수 있다.

import random #랜덤 모듈 가져오기
print(random.randint(0,10))

 

from문으로 특정 모듈에서 필요한 함수만 가져올 수 있다.

from random import randint
print(randint(0,10))

import문으로만 모듈을 가져오는 것과 차이가 보이가 보이는가?

import문만 사용하면 특정 함수를 호출할 때, 모듈명.함수명() <- 이런 식으로 호출하지만

from문을 사용하면 함수명() <- 이런식으로 간편하게 호출할 수 있다.

하지만 현재 작성중인 프로그램 안에 함수의 이름이 중복되면 오류가 뜨니 유의해야 한다. 

 

as문으로 모듈에 이름(닉네임)을 붙힐 수 있다.

import random as rd
print(rd.randint(0,10))

모듈의 이름이 길거나 자신이 편한 이름을 붙이고 싶을 때 이용한다.

'Python Category > Python' 카테고리의 다른 글

[Python] 예외 처리  (2) 2022.12.09
[Python] 파일 입출력  (1) 2022.12.08
[Python] 문자열  (1) 2022.12.08
[Python] 딕셔너리  (0) 2022.12.07
[Python] 세트  (0) 2022.12.07

문자열

문자열도 시퀀스 자료구조에 속함

리스트에서 사용했던 인덱싱, 슬라이싱, 내장함수 모두 문자열에서 쓸 수 있음

 

문자열 내장 함수

함수 설명
chr() 정수를 문자로 변환
ord() 문자를 정수로 변환
len() 문자열의 길이를 반환
str() 객체의 문자열 표현을 반환

 

하지만 문자열은 불변객체이기 때문에, 리스트와는 달리 문자열을 바꿀 수 없다.

word = "abcdef"
word[0]="A"
#TypeError: "str" object does not support item assignment

문자열 변경을 위해서는 새로운 사본 생성이 필요하다. ( 대부분 알아서 사본을 생성해주니 크게 신경 안 써도 된다)

word = "abcdef"
word = "A" + word[1:]
print(word)
#출력 결과 : "Abcdef"

 

문자열의 비교

==, !=, <, > 연산자를 문자열에도 적용 가능

a = input("문자열을 입력하시오: ")
b = input("문자열을 입력하시오: ")
if( a < b ):
	print(a, "가  앞에  있음")
else:
	print(b, "가  앞에  있음")
#문자열을 입력하시오: apple
#문자열을 입력하시오: orange
#apple 가 앞에 있음

 

문자열 출력하기

print함수의 가변 인수를 활용한 출력

대표적으로 밑의 두 개가 쓰임

  • format()
  • f-string
x = 25
y = 98
prod = x * y
#format()함수 이용
print("{}과 {}의 곱은 {}".format(x,y,prod))
#f-string이용
print(f"{x}과 {y}의 곱은 {prod}")
#25과 98의 곱은 2450
#25과 98의 곱은 2450

처음 파이썬을 배울 때는 format()함수를 많이 사용하지만, 개인적인 생각으로 f-string이 더 편한 것 같음

 

대소문자 변환

  • capitalize() : 첫문자만  대문자  변환
  • lower() : 모든 알파벳 문자가 소문자로 변환된 사본 반환
  • upper() : 모든 알파벳 문자가 대문자로 변환된 사본 반환
s = "i am a student."
print(s.capitalize())
s = "Breakfast At Tiffany"
print(s.lower())
print(s.upper())
#I am a student.
#breakfast at tiffany
#BREAKFAST AT TIFFANY

 

문자열 찾기 및 바꾸기

바꾸기

  • startswith(s) : 문자(열) s로 시작되는 문자열이면 True가  반환
  • endswith(s) : 문자(열) s로 종료되는 문자열이면 True가  반환
  • replace(a,b) : 문자열 내에 a 문자열을 b 문자열로 변환
s = input("파이썬  소스  파일  이름을  입력하시오: ")
if s.endswith(".py"):
    print("올바른  파일  이름입니다")
else :
    print("올바른  파일  이름이  아닙니다.")
#파이썬  소스  파일  이름을  입력하시오: abc.py
#올바른  파일  이름입니다

#파이썬  소스  파일  이름을  입력하시오: abc.cy
#올바른  파일  이름이  아닙니다.
s = "www.naver.com"
print(s.replace("com", "co.kr"))
#출력 결과 : www.naver.co.kr

 

찾기

  • find() : 대상 문자열 안에서 부분 문자열을 찾아서 인덱스를 반환(못 찾으면 -1 리턴)
  • rfind() : 끝에서 시작하여 지정된 부분 문자열을 찾아 인덱스 리턴
  • count() : 주어진 문자열에서 부분 문자열이 등장하는 숫자 리턴
s = "www.naver.co.kr"
print(s.find(".kr"))
#출력 결과 : 12
s = "Let it be, let it be, let it be"
print(s.rfind("let"))
#출력 결과 22
s = "www.naver.co.kr"
print(s.count("."))
#출력 결과 : 3

 

문자열 분류, 공백 제거

문자 분류

  • isalpha() : 문자열  안에  모든  문자가  알파벳이면  True
  • isdigit(): 문자열  안에  모든  문자가  숫자이면  True
  • islower(), isupper() : 문자열 안에 모든 문자가 소문자(대문자)이면 True
코드 리턴 값
"ABCabc".isalpha()  True
"123".isdigit() True
"abc".islower()  True

 

공백 제거

strip() : 문자열  첫  부분과  끝  부분의  불필요한  공백  제거

  • 문자 사이의 공백은 제거하지 않음
  • 인수가 전달될 경우 공백이 아닌 인수값으로 전달된 문자 제거
  • rstrip(), lstrip() : 오른쪽(왼쪽) 끝의 공백 또는 원치 않는 문자 제거
s = "   Hello, World!   "
print(s.strip()) 
#출력 결과 : Hello, World!
s = "########this is example#####"
print(s.strip("#"))
#출력 결과 : this is example

 

문자열 분해, 결합

  • split() : 문자열 분해 (자세한 설명은 예시 참고 바람)
  • join() : 리스트  형태의  단어들을  모아서  하나의  문자열로  만드는  역할(연결될 문자 사이에 들어갈 문자 지정 가능)
s = "Welcome to Python"
print(s.split())
#출력 결과 : ["Welcome", "to", "Python"]
s = "Hello, World!"
print(s.split(","))
#['Hello', ' World!']
s = "Hello, World!"
print(s.split(", "))
#출력 결과 : ['Hello', 'World!']
print(list("Hello, World!"))
#['H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!']

 

print(",".join(["apple", "grape", "banana"]))
#출력 결과 : "apple", "grape", "banana"
print("-".join("010.1234.5678".split(".")))
#출력 결과 : 010-1234-5678

'Python Category > Python' 카테고리의 다른 글

[Python] 파일 입출력  (1) 2022.12.08
[Python] 모듈  (0) 2022.12.08
[Python] 딕셔너리  (0) 2022.12.07
[Python] 세트  (0) 2022.12.07
[Python] 튜플  (0) 2022.12.06

딕셔너리란?

  • 다수의 값을 저장하는 구조
  • 값(value)과 관련된 키(key)도 저장됨
  • 키를 통해 값에 접근
  • 순서가 없음

 

딕셔너리의 생성

딕셔너리_이름 = {키1 : 값1, 키2 : 값2, 키3 : 값3, ........}

capitals = {} #공백 딕셔너리 생성
capitals = {"Korea" : "Seoul", "USA" : "Washingtom", "UK" : "London"} #키와 값을 정의

키는 반드시 불변 객체이며 유일해야 함

-유일한 문자열, 숫자 또는 튜플

항목 탐색하기

capitals ={"Korea":"Seoul","USA":"Washington","UK":"London"} 
print( capitals["Korea"]) # 해당 딕셔너리 키가 없을 경우 예외 발생
#출력 결과 : Seoul
capitals ={"Korea":"Seoul","USA":"Washington","UK":"London"} 
print( capitals.get("France", "해당 키가 없습니다." ) ) #get() : 해당 키가 없을 경우 None 반환 또는 두 번째 인수 반환
#출력 결과 : 해당 키가 없습니다.

 

항목 추가 및 삭제하기

항목 추가

[  ]  를  사용한  데이터  추가

capitals ={}
capitals["Korea"]="Seoul"
capitals["USA"]="Washington"
capitals["UK"]="London"
capitals["France"]="Paris" print(capitals)
#출력 결과
#{'Korea': 'Seoul', 'USA': 'Washington', 'UK': 'London', 'France': 'Paris'}

딕셔너리  전체를  추가: update() 메소드  사용

capitals.update({“Germany”:”Berlin”, “Japan”:”Tokyo”})

 

항목 삭제

pop() 메소드 사용: 주어진 키가 없으면 Keyerror 예외 발생

city = capitals.pop("UK")

 

항목 접근하기

for루프 활용

capitals ={"Korea":"Seoul","USA":"Washington","UK":"London"}
for key in capitals :
	print( key,":", capitals[key])
#Korea : Seoul
#USA : Washington
#UK : London

items() 메소드 활용

capitals ={"Korea":"Seoul","USA":"Washington","UK":"London"} 
for key, value in capitals.items():
	print( key,":", value )
#Korea : Seoul
#USA : Washington
#UK : London
  1. items() 함수는 키와 값을 튜플로 반환
  2. 반환된 튜플이 key와 value로 언패킹

 

키와 값의 시퀀스를 각각 반환하기

  • key() : 키의 시퀀스를 반환
  • value() : 값의 시퀀스를 반환
capitals ={"Korea":"Seoul","USA":"Washington","UK":"London"}
print( capitals.keys())
print( capitals.values())

#출력결과
#dict_keys(['Korea', 'USA', 'UK'])
#dict_values(['Seoul', 'Washington', 'London'])

 

딕셔너리 메소드

연산 설명
d = dict() 공백 딕셔너리를 생성
len(d) 딕셔너리에서 저장된 항목의 개수를 반환
k in d K가 딕셔너리 d 안에  있는지 여부를 반환
k not in d K가 딕셔너리 d 안에 없으면 True를 반환
d[key] = value 딕셔너리에 키와 값을 저장
v = d[key] 딕셔너리에서 key를 해당되는 값을 반환
d.get(ley, default) 주어진 키를 가지고 값을 찾음. 만약 없으면 defulat 값 반환
d.pop(key) 항목을 삭제
d.values() 딕셔너리 안의 모든 값의 시퀀스를 반환
d.keys() 딕셔너링 안의 모든 키의 시퀀스를 반환
d.items() 딕셔너리의 안의 모든 (키, 값)을 반환

 

'Python Category > Python' 카테고리의 다른 글

[Python] 모듈  (0) 2022.12.08
[Python] 문자열  (1) 2022.12.08
[Python] 세트  (0) 2022.12.07
[Python] 튜플  (0) 2022.12.06
[Python] 리스트(2)  (0) 2022.12.06

세트의 개념

세트는 우리가 수학에서 배웠던 집합의 개념과 똑같음

세트는 리스트와 다르게 요소는 특정 순서로 저장되지 않으며 위치별로 액세스 할 수 없음

  • 순서 유지의 필요가 없어 속도가 빠름
  • 순서가 없기에 중복 항목은 지원하지 않음

세트 = 집합
데이터간 순서는 존재하지 않음

세트의 생성

세트의 생성
세트_이름 = {항목1, 항목2, 항목3, ...}
numbers = {1,2,3} #초기화된 세트 생성
values = set() #공백 세트 생성​

 

리스트와 문자열을 사용한 세트의 정의

리스트로 세트 정의

numbers =set([1,2,3,1,2,3])
print(numbers)
#출력 결과 : {1,2,3} 중복 데이터는 하나로 전환

문자열로 세트 정의

letters = set("abcab”)

리스트와 세트 간 전환을 활용한 예제

-리스트의 중복되지 않는 항목의 개수는?

list1 =[1,2,3,4,5,1,2,4 ]
print(len(set(list1)))
#출력 결과 : 5 -> 중복 항목은 제외되었기 때문

-두 리스트 간 중복되는 항목은?

list1 =[1,2,3,4,5]
list2 =[3,4,5,6,7]
print(set(list1)&set(list2))
#출력 결과 : {3, 4, 5} 교집합의 결과

세트와 메소드

all(), any(), enumerate(), len(), max(), min, sorted(), sum()등의 메소드 사용 가능

fruits ={"apple","banana","grape"}
size =len(fruits) #size는 3

in 연산자로 항목 검사 가능

fruits = { "apple", "banana", "grape" }
if "apple" in fruits:
	print("집합  안에  apple이  있습니다.")

인덱스는 없지만 for문을 사용하여 각 항목에 접근 가능(순서는 의미 없음)

fruits ={"apple","banana","grape"}
for x in fruits:
	print(x, end=" ")
fruits ={"apple","banana","grape"}
for x in sorted(fruits): #순서 필요시 sorted함수 사용
	print(x, end=" ")

 

세트에 요소 추가하고 삭제하기

세트에 요소 추가하기

  • add() : 단일 항목
  • update() : 여러 항목 추가
fruits ={"apple","banana","grape"}
fruits.add("kiwi")
print(fruits)
#출력 결과 : {'kiwi', 'apple', 'banana', 'grape'}
fruits ={"apple","banana","grape"}
a = {"kiwi","pitch"}
fruits.update(a)
print(fruits)
#출력 결과 : {'banana', 'grape', 'apple', 'pitch', 'kiwi'}

밑의 방법으로 하면 원치 않는 결과가 나옴

fruits ={"apple","banana","grape"}
fruits.update("kiwi","pitch")
print(fruits)
#{'w', 'k', 'i', 'h', 't', 'p', 'grape', 'apple', 'c', 'banana'}

세트에 요소 제거하기

  • remove() : 삭제하는 요소가 없으면 예외 발생
  • discart() : 예외를 발생시키지 않으려면 이 메소드 사용
  • clear() : 모든 요소 삭제
fruits ={"apple","banana","grape","kiwi","pitch"}
fruits.remove("apple")
print(fruits)
#{'banana', 'kiwi', 'pitch', 'grape'}
fruits ={"apple","banana","grape","kiwi","pitch"}
fruits.discard("apple")
print(fruits)
#{'kiwi', 'banana', 'grape', 'pitch'}
fruits ={"apple","banana","grape","kiwi","pitch"}
fruits.clear()
print(fruits)
#출력 결과 : set()

세트의 연산

부분집합 연산 :  < (또는 issubset())

A = {"apple","banana","grape"}
B = {"apple","banana","grape","kiwi"}

if A < B:
	print("A는 B의 부분 집합")

집합간 비교 연산 : ==, !=

A = {"apple","banana","grape"}
B = {"apple","banana","grape","kiwi"}

if A == B:
	print("A와 B는 같습니다")
else : 
	print("A와 B는 같지 않습니다")

합집합, 교집합, 차집합 연산

C = A|B 또는 C = A.union(B)

C = A&B 또는 C = A.intersection(B)

C = A-B 또는 C = A.difference(B)

A ={"apple","banana","grape"}
B ={"orange","banana","grape"}

print(A|B) #합집합
print(A&B) #교집합
print(A-B) #차집합

#출력 결과
#{'grape', 'apple', 'orange', 'banana'}
#{'banana', 'grape'}
#{'apple'}

 

'Python Category > Python' 카테고리의 다른 글

[Python] 문자열  (1) 2022.12.08
[Python] 딕셔너리  (0) 2022.12.07
[Python] 튜플  (0) 2022.12.06
[Python] 리스트(2)  (0) 2022.12.06
[Python] 리스트(1)  (0) 2022.12.06