나를 기록하다
article thumbnail
반응형

 

변수

  • 문자열이나 boolean을 선언할 시 (str)로 감싸주어야 함.
# 애완동물을 소개해 주세요
animal = "강아지"
name = "호두"
age = 4
hobby = "산책"
is_adult = age >= 4

print("우리 집 " + animal + "의 이름은 " + animal + "입니다.")
print(name + "는 "+str(age)+"살이며, "+hobby+"을 아주 좋아해요.")
print(name +"는 어른일까요? " + str(is_adult))
// 결과
우리 집 강아지의 이름은 강아지입니다.
호두는 4살이며, 산책을 아주 좋아해요.
호두는 어른일까요? True

 

  • print와 ‘,’를 활용하면 str 없이도 출력 가능 → ‘,’가 들어가면 띄워쓰기가 하나씩 들어간다.
# 애완동물을 소개해 주세요
animal = "강아지"
name = "호두"
age = 4
hobby = "산책"
is_adult = age >= 4

print("우리 집 " + animal + "의 이름은 " + animal + "입니다.")
print(name, "는", age, "살이며,", hobby, "을 아주 좋아해요.")
print(name + "는 어른일까요? " + str(is_adult))
// 결과
우리 집 강아지의 이름은 강아지입니다.
호두 는 4 살이며, 산책 을 아주 좋아해요.
호두는 어른일까요? True

 

 

숫자처리함수

print(abs(-5))  # 5
print(pow(4, 2))  # 16
print(max(5, 12))  # 12
print(min(5, 12))  # 5
print(round(3.14))  # 3
print(round(4.99))  # 5

from math import *
print(floor(4.99))
print(ceil(3.14))
print(sqrt(16))
// 결과
5
16
12
5
3
5
4
4
4.0

 

 

랜덤함수

from random import *
print(randrange(1, 46))  # 1 이상 46 미만
print(randint(1, 45))  # 1 이상 45 이하

 

 

 

줄바꿈

print("""         # """ -> 줄바꿈
notion to tistory,
내가 꼭 만든다.
""")
// 결과

notion to tistory,
내가 꼭 만든다.

 

 

 

문자열 처리 함수

python = "prao, he is god"
print(python.find("JAVA")) # -1
print(python.index("JAVA")) # error 발생

find와 index는 둘다 위치를 찾아주는 함수이지만 없는 값을 입력할 경우 find는 -1 출력 후 계속 동작하지만 index는 error을 반환하고 프로그램을 종료한다.

 

 

문자열 포맷(format)

# 방법 1
print("나는 나이는 %d살이고 %s 대학교를 다니며 학점은 항상 %c입니다." % (26, "하버드", 'F'))

# 방법 2
print("나는 나이는 {}살이고 {} 대학교를 다니며 학점은 항상 {}입니다.".format(26, "하버드", 'F'))
print("나는 나이는 {0}살이고 {1} 대학교를 다니며 학점은 항상 {2}입니다.".format(26, "하버드", 'F'))
print("나는 나이는 {1}살이고 {2} 대학교를 다니며 학점은 항상 {0}입니다.".format(26, "하버드", 'F'))

# 방법 3
print("나는 나이는 {age}살이고 {univ} 대학교를 다니며 학점은 항상 {grade}입니다.".format(age=26, univ="하버드", grade='F'))
print("나는 나이는 {age}살이고 {univ} 대학교를 다니며 학점은 항상 {grade}입니다.".format(univ="하버드", grade='F', age=26))

# 방법 4
age = 26
univ = "하버드"
grade = 'F'
print(f"나는 나이는 {age}살이고 {univ} 대학교를 다니며 학점은 항상 {grade}입니다.")
  1. % 로 순서에 맞게 기입
  1. 중괄호를 작성하면 연속한 숫자 출력 가능, 숫자에 따른 값 입력 가능
  1. 변수를 넣고 format()에 변수에 해당하는 값 기입
  1. f string을 활용하여 미리 선언해둔 변수 값을 기입

 

 

f-string과 format()의 차이점

파이썬에서 문자열 포맷팅을 사용하여 출력을 표현할 때 f-string과 format() 메소드 두 가지 방법이 주로 사용됩니다.

이 두 방식의 차이점과 어떤 방식이 더 나은지 알아보겠습니다.

f-string (Formatted String Literals):

파이썬 3.6 이상부터 지원되는 f-string 방식은 문자열 앞에 f 또는 F를 붙여 사용하며, 중괄호({}) 안에 변수나 식을 직접 기술할 수 있습니다. f-string은 코드가 간결하고 읽기 쉬우며, 실행 속도가 빠릅니다. 예를 들면 다음과 같습니다.

이름 = "홍길동"
나이 = 30
print(f"이름: {이름}, 나이: {나이}")

format() 메소드:

format() 메소드는 파이썬 2.7부터 사용할 수 있으며, 문자열 내에 중괄호({})를 사용하여 변수의 위치를 표시하고, format() 메소드를 호출하여 변수를 전달합니다. 이 방식은 f-string보다 구버전 파이썬과 호환성이 좋으며, 문자열을 더 유연하게 다룰 수 있습니다.

이름 = "홍길동"
나이 = 30
print("이름: {}, 나이: {}".format(이름, 나이))

 

두 방식의 차이점

  • f-string은 코드가 간결하고 가독성이 높으며 실행 속도가 빠릅니다.
  • format() 메소드는 구버전 파이썬과 호환성이 좋으며, 문자열 포맷팅을 더 유연하게 다룰 수 있습니다.

 

어떤 방식이 더 나은지는 상황과 개인의 취향에 따라 다릅니다. 파이썬 3.6 이상을 사용하고 간결한 코드를 선호한다면 f-string을 사용하는 것이 좋습니다. 하지만 구버전 파이썬과의 호환성이 필요하거나 문자열 포맷팅에 더 많은 유연성이 필요한 경우, format() 메소드를 사용하는 것이 적합할 수 있습니다.

 

탈출문자

# \n: 줄바꿈

# \", \' : 문장 내에서 따옴표 사용 가능
print("저는 \"나도코딩\"입니다.")
print("저는 \'나도코딩\'입니다.")

# \\ : 문장 내에서 \
print("pu\\ra\\dak\\chicken\\yummy")

# \r : 커서를 맨 앞으로 이동
print("Red Apple\rPine")
# 강의에서는 PineApple이 출력값이라는데 나는 Pine만 출력된다. 이유를 모르겠다.

# \b : 백스페이스 (한 글자 삭제)
print("Redd\bApple")

# \t : 탭
print("Red\tApple")
// 결과
저는 "나도코딩"입니다.
저는 '나도코딩'입니다.
pu\ra\dak\chicken\yummy
Pine
RedApple
Red	Apple

/r 의 출력 값에 대해서는 이유는 모르겠으나 크게 중요한 부분이 아니라고 하니 일단 넘어가고 나중에 이유를 알게되면 다시 기입하겠다.

 

 

Quiz

문제

  • 사이트별로 비밀번호를 만들어주는 프로그램을 작성하시오
    • 예) http://naver.com
    • 규칙1 : http:// 부분은 제외 -> naver.com
    • 규칙2 : 처음 만나는 점(.) 이후 부분은 제외 -> naver
    • 규칙3 : 남은 글자 중 처음 세자리 + 글자 개수 + 글자 내 'e' 개수 + "!"로 구성
    • 예) 생성된 비밀번호 : nav51!

 

풀이

site = "http://naver.com"
start = int(site.find("/"))
end = int(site.find("."))
pwd = str(site[start+2:end]) + str(len(site[start+2:end])) + str(site.count("e")) + '!'
print(f"생성된 비밀번호 : {pwd}")

 

정답

url = "http://naver.com"
my_str = url.replace("http://", "") # 규칙1
my_str = my_str[:my_str.index(".")] # 규칙2
password = my_str[:3] + str(len(my_str)) + str(my_str.count("e")) + "!" #규칙3
print(f"{url}의 비밀번호는 {password}입니다.")

 

 

List

num_list = [1,4,5,2,6,7,3,4,7,9,3,2,1]
# 정렬
num_list.sort()
print(num_list)

# 순서 뒤집기
num_list.reverse()
print(num_list)

# 모두 지우기
num_list.clear()
print(num_list)

# 다양한 자료형 함께 사용
mix_list = ["조세호", 20, True]
print(mix_list)

# 리스트 확장
num_list = [1,4,5,2,6,7,3,4,7,9,3,2,1]
num_list.extend(mix_list)
print(num_list)

 

 

사전

# key: value
cabinet = {3: "유재석", 100: "김태호"}
print(cabinet[3])
print(cabinet[100])
print(cabinet.get(3))
# print(cabinet[5]) -> 값이 없는 경우 프로그램 종료
print(cabinet.get(5)) # -> 값이 없는 경우 None 출력
print(cabinet.get(5, "사용 가능")) # -> 값이 없는 경우 "사용 가능" 출력

print(3 in cabinet) # True
print(5 in cabinet) # False

cabinet = {"A-3":"유재석","B-100":"김태호"}
print(cabinet["A-3"])
print(cabinet["B-100"])

# 새 손님
print(cabinet)
cabinet["A-3"] = "김종국"
cabinet["C-20"] = "조세호"
print(cabinet)

# 간 손님
del cabinet["A-3"]
print(cabinet)

# key 들만 출력
print(cabinet.keys())

# value 들만 출력
print(cabinet.values())

# key, value 쌍으로 출력
print(cabinet.items())

# 리스트 비우기
cabinet.clear()
print(cabinet)

 

 

 

튜플(tuple)

튜플 : 리스트와 다르게 내용 변경 및 추가 안됨. 속도가 리스트보다 빠름 -> 변경되지 않는 항목에 사용

menu = ("돈까스", "치즈까스")
print(menu[0])
print(menu[1])

# 변수 출력
name1 = "김종국"
age1 = 20
hobby1 = "코딩"
print(name1, age1, hobby1)

# 튜플
(name2, age2, hobby2) = ("김종국", 20, "코딩")
print(name2, age2, hobby2)

 

 

 

집합(set)

중복이 허용되지 않고 순서가 없다.

my_set = {1, 2, 3, 3, 3}
print(my_set)

java = {"유재석", "김태호", "양세형"}
python = set(["유재석", "박명수"])

# 교집합 (java와 python을 모두 할 수 있는 개발자)
print(java & python)
print(java.intersection(python))

# 합집합 (java 또는 python을 할 수 있는 개발자)
print(java | python)
print(java.union(python))

# 차집합 (java는 할 수 있지만 python을 할 줄 모르는 개발자)
print(java - python)
print(java.difference(python))

# python을 할 줄 아는 사람이 늘어남
python.add("김태호")
print(python)

# java를 잊어버림
java.remove("김태호")

 

 

자료구조 변경

# 자료구조의 변경
# 커피숍
menu = {"커피", "우유", "주스"}
print(menu, type(menu))

menu = list(menu)
print(menu, type(menu))

menu=tuple(menu)
print(menu, type(menu))

menu = set(menu)
print(menu, type(menu))

 

 

 

Quiz

당신의 학교에서는 파이썬 코딩 대회를 주최합니다.
참석률을 높이기 위해 댓글 이벤트를 진행하기로 하였습니다.
댓글 작성자들 중에 추첨을 통해 1명은 치킨, 3명은 커피 쿠폰을 받게 됩니다.
추첨 프로그램을 작성하시오.

조건 1 : 편의상 댓글은 20명이 작성하였고 아이디는 1 ~ 20 이라고 가정

조건 2 : 댓글 내용과 상관없이 무작위로 추첨하되 중복 불가능

조건 3 : random 모듈의 shufflesample 사용

(출력 예제)

'''
--- 당 첨 자   발 표 ---
치킨 당첨자 : 1
커피 당첨자 : [2, 3, 4]
---  축 하 합 니 다  ---
'''

 

풀이

from random import *

ls = []
for i in range(1,21):
    ls.append(i)
shuffle(ls)
ch = ls.pop()
cf = sample(ls, 3)
print("--- 당 첨 자   발 표 ---")
print(f"치킨 당첨자 : {ch}")
print(f"커피 당첨자 : {cf}")
print("---  축 하 합 니 다  ---")

 

답안 - 1

from random import *

ls = list(range(1, 21))
shuffle(ls)

ch = ls.pop()
cf = sample(ls, 3)

print("--- 당 첨 자   발 표 ---")
print(f"치킨 당첨자 : {ch}")
print(f"커피 당첨자 : {cf}")
print("---  축 하 합 니 다  ---")

 

답안 - 2

from random import *

users = range(1, 21)  # 1부터 20까지 생성
users = list(users)
winners = sample(users, 4) # 4명 중에서 1명은 치킨, 3명은 커피

print("--- 당 첨 자   발 표 ---")
print("치킨 당첨자 : {0}".format(winners[0]))
print("커피 당첨자 : {0}".format(winners[1:]))
print("---  축 하 합 니 다  ---")

 

 

Continue, break

  • continue : 해당과정만 건너뛰고 반복문 계속 진행
  • break : 반복문 종료
ab = [2,4,7,5]
nb = [13]
for stu in range(1,15):
    if stu in ab:
        continue
    elif stu in nb:
        print(f"오늘 수업 안할란다. {stu}번 학생은 따라오세요.")
        break
    print(f"{stu}번 학생, 책을 읽으세요.")

 

 

한줄 for

파이썬에서 '리스트 컴프리헨션(list comprehension)'이라고 불리는데, 간결하게 리스트를 만드는 방법이야. 기본 구조는 [표현식 for 변수 in 순회가능한 객체 if 조건문] 이렇게 돼. 예를 들어, 1부터 10까지의 숫자 중 짝수만 골라서 리스트로 만들고 싶다면, 아래와 같이 한 줄로 작성할 수 있어.

even_numbers = [x for x in range(1, 11) if x % 2 == 0]

이 코드는 range(1, 11)에서 숫자 x를 가져와서 x가 짝수(x % 2 == 0)일 때만 리스트에 추가하는 방식으로 작동해. 결과적으로 even_numbers 리스트에는 [2, 4, 6, 8, 10]이 저장되게 돼. 간편하고 짧게 리스트를 만들 수 있어서 많이 사용되는 기능

 

# 출석번호 1,2,3,4,5 앞에 100 붙이기 -> 101,102,103,104,105
stu = [1, 2, 3, 4, 5]
stu = [i + 100 for i in stu]
print(stu)

# 학생 이름을 길이로 변환
stu = ["prao", "gogorao", "drrrrrrkakak"]
stu = [len(i) for i in stu]
print(stu)

# 학생 이름을 대문자로 변환
stu = ["prao", "gogorao", "drrrrrrkakak"]
stu = [i.upper() for i in stu]
print(stu)

 

 

Quiz

당신은 Cocoa 서비스를 이용하는 택시 기사님입니다.
50명의 승객과 매칭 기회가 있을 때, 총 탑승 승객 수를 구하는 프로그램을 작성하시오.

조건 1 : 승객별 운행 소요 시간은 5분 ~ 50분 사이의 난수로 정해집니다.
조건 2 : 당신은 소요 시간 5분 ~ 15분 사이의 승객만 매칭해야 합니다.

(출력문 예제)
[O] 1번째 손님 (소요시간 : 15분)
[ ] 2번째 손님 (소요시간 : 50분)
[O] 3번째 손님 (소요시간 : 5분)
…
[ ] 50번째 손님 (소요시간 : 16분)
————————————————
총 탑승 승객 : 2 분

풀이

from random import *

cnt = 0
for c in range(1, 51):
    t = randrange(5, 51)
    if 5 <= t <= 15:
        cnt += 1
        print(f"[O] {c}번째 손님(소요시간 : {t}분)")
    else:
        print(f"[ ] {c}번째 손님(소요시간 : {t}분)")
    continue
print("===========================")
print(f"총 탑승 승객 : {cnt}분")

 

 

함수

1. 함수 생성

def open_account():
    print("새로운 계좌가 생성되었습니다.")

def deposit(balance, money): # 입금
    print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
    return balance + money

def withdraw(balance, money): # 출금
    if balance >= money:
        print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance - money))
        return balance - money
    else:
        print("출금이 완료되지 않았습니다. 잔액은 {0} 원입니다.".format(balance))
        return balance

def withdraw_night(balance, money):
    commission = 1000
    return commission, balance - money - commission

balance = 0
balance = deposit(balance, 100000)
# balance = Bank.withdraw(balance, 5000)
commission, balance = withdraw_night(balance,500)
print(f"수수료 {commission} 원이며, 잔액은 {balance} 원입니다.")

 

2. self - 클래스의 인스턴스를 참조하는 변수

파이썬에서 self는 클래스의 인스턴스를 참조하는 변수입니다. 클래스 내부의 메서드에서 사용되며, 해당 메서드를 호출하는 객체를 가리킵니다. self를 사용함으로써 객체의 속성이나 메서드에 접근할 수 있습니다.

객체지향 프로그래밍에서는 클래스의 인스턴스를 생성하고, 해당 인스턴스에 속성을 할당하거나 메서드를 호출할 수 있습니다. 이때, 클래스 내부의 메서드가 호출되는 인스턴스를 명시적으로 참조해야 하는데, 이를 위해 self를 사용합니다.

다음은 self를 사용하는 예시입니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f"안녕하세요. 제 이름은 {self.name}이고, 나이는 {self.age}살입니다.")

위의 예시에서 __init__ 메서드와 introduce 메서드 모두 첫 번째 매개변수로 self를 사용하고 있습니다. 이를 통해 인스턴스의 속성에 접근할 수 있으며, introduce 메서드에서는 인스턴스의 nameage 속성을 사용하여 소개 문장을 출력합니다.

 

3. 기본값

def profile(name, age = 25, main_lang = "python"): 
# age의 기본값 25, main_lang의 기본값 "python"으로 지정
    print(f"이름 : {name}, 나이 : {age}, 주 사용 언어 : {main_lang}")

profile("프라오")
profile("올라프", 40, "java")

 

4. 가변인자

가변 인자는 함수가 개수가 다양한 인자를 받을 수 있게 해주는 기능입니다. 파이썬에서 가변 인자를 사용하기 위해 *args**kwargs라는 두 가지 방법이 있습니다.

  • args가변 길이의 위치 인자를 전달할 때 사용되며, 이러한 인자는 튜플로 묶여 전달됩니다. 함수에 전달되는 인자의 개수에 상관없이 함수가 인자를 받을 수 있습니다. 예를 들어, 다음과 같은 함수를 작성할 수 있습니다.
def 함수명(*args):
    for arg in args:
        print(arg)

함수명(1, 2, 3, 4, 5)
  • **kwargs가변 길이의 키워드 인자를 전달할 때 사용되며, 이러한 인자는 사전 형태로 묶여 전달됩니다. 함수에 전달되는 인자의 개수와 이름에 상관없이 함수가 인자를 받을 수 있습니다. 예를 들어, 다음과 같은 함수를 작성할 수 있습니다.
def 함수명(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

함수명(이름="홍길동", 나이=30, 도시="서울")
  • args와 **kwargs를 함께 사용하면, 함수가 동시에 가변 길이의 위치 인자와 키워드 인자를 받을 수 있습니다. 다음과 같은 함수를 작성할 수 있습니다.
def 함수명(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, value)

함수명(1, 2, 3, 이름="홍길동", 나이=30, 도시="서울")

이렇게 가변 인자를 사용하면, 다양한 개수의 인자를 전달하는 함수를 효과적으로 작성할 수 있습니다. 그러나 가변 인자를 사용할 때에는 함수의 가독성과 명확성을 해치지 않도록 주의해야 합니다.

 

  • 예시
def profile(name, age, *language):
    print("이름 : {0}\t나이 : {1}\t".format(name, age), end=" ")
    for lang in language:
        print(lang, end=" ")
    print()


profile("유재석", 20, "python", "java", "C", "C#", "C++", "javascript")
profile("김태호", 25, "Kotlin", "swift")

 

 

Quiz

표준 체중을 구하는 프로그램을 작성하시오.

* 표준 체중 : 각 개인의 키에 적당한 체중

(성별에 따른 공식)
남자 : 키(m) x 키(m) x 22
여자 : 키(m) x 키(m) x 21

조건 1 : 표준 체중은 별도의 함수 내에서 계산
* 함수명 : std_weight
* 전달값 : 키(height), 성별(gender)

(출력 예제)
키 175cm 남자의 표준 체중은 67.38kg 입니다.

 

풀이

def std_weight(height, gender):  # gender - 남자 1 or 3, 여자 2 or 4
    if gender == 1 or 3:
        stw = round(((height / 100) * (height / 100) * 22), 2)
        print(f"키 {height}cm 남자의 표준 체중은 {stw}kg 입니다.")
    else:
        stw = round(((height / 100) * (height / 100) * 21), 2)
        print(f"키 {height}cm 여자의 표준 체중은 {stw}kg 입니다.")


std_weight(175, 1)
std_weight(167, 4)
std_weight(179, 3)
std_weight(155, 2)
# 결과 - 성별이 바뀌지 않음, 오답
키 175cm 남자의 표준 체중은 67.38kg 입니다.
키 167cm 남자의 표준 체중은 61.36kg 입니다.
키 179cm 남자의 표준 체중은 70.49kg 입니다.
키 155cm 남자의 표준 체중은 52.86kg 입니다.

틀린 이유

이 코드에서 std_weight 함수는 키와 성별에 따른 표준 체중을 계산하고 출력하는 기능을 수행합니다. 그러나 함수의 구현에는 논리적인 문제가 존재합니다. 문제점은 다음과 같습니다.

  1. if 문의 조건문:

if gender == 1 or 3: 과 같은 조건문은 예상치 못한 결과를 초래할 수 있습니다. 이 조건문은 "gender가 1이거나 3인 경우"를 검사하는 것이 아니라, "gender가 1이거나 3이 True인 경우"를 검사합니다. 파이썬에서 0이 아닌 모든 정수는 True로 간주되기 때문에, 이 조건문은 항상 True가 됩니다.

이 문제를 해결하려면 다음과 같이 수정할 수 있습니다:

if gender == 1 or gender == 3:

 

또는 더 간결하게 다음과 같이 작성할 수도 있습니다:

if gender in [1, 3]:

 

  1. 이 함수는 결과를 반환하지 않습니다

std_weight 함수는 표준 체중을 계산한 후 출력만 하고 반환하지 않습니다. 이는 함수의 재사용성을 제한합니다. 만약 이 함수의 결과를 다른 연산에 사용하려면 어려움이 따릅니다. 따라서 결과를 반환하도록 수정하는 것이 좋습니다.

수정된 함수는 다음과 같습니다:

def std_weight(height, gender):  # gender - 남자 1 or 3, 여자 2 or 4
    if gender in [1, 3]:
        stw = round(((height / 100) * (height / 100) * 22), 2)
        print(f"키 {height}cm 남자의 표준 체중은 {stw} 입니다.")
    else:
        stw = round(((height / 100) * (height / 100) * 21), 2)
        print(f"키 {height}cm 여자의 표준 체중은 {stw} 입니다.")
    return stw
# 결과
키 175cm 남자의 표준 체중은 67.38kg 입니다.
키 167cm 여자의 표준 체중은 58.57kg 입니다.
키 179cm 남자의 표준 체중은 70.49kg 입니다.
키 155cm 여자의 표준 체중은 50.45kg 입니다.

이제 이 함수는 수정된 조건문으로 올바른 결과를 출력하고, 표준 체중 값을 반환합니다. 이렇게 수정하면 함수의 정확성과 재사용성이 향상됩니다.

 

답안

def std_weight(height, gender):  # gender - 남자 1 or 3, 여자 2 or 4
    if gender == "남자":
        return height * height * 22
    else:
        return height * height * 21


height = 175
gender = "남자"
weight = round(std_weight(height / 100, gender), 2)
print("키 {0}cm {1}의 표준 체중은 {2}kg 입니다.".format(height, gender, weight))
# 결과
키 175cm 남자의 표준 체중은 67.38kg 입니다.

 

 

표준 입출력

sep, end

print("dev", "prao", sep="_", end="?")
print("dev", "prao", sep="_", end="?")
# 결과
dev_prao?dev_prao?

 

 

ljust(), rjust()

ljust(), rjust() 메서드는 문자열을 특정 길이로 맞추기 위해 사용됩니다. ljust() 메서드는 문자열을 왼쪽에서부터 주어진 길이로 맞추며, 오른쪽은 공백으로 채웁니다. 반면, rjust() 메서드는 문자열을 오른쪽에서부터 주어진 길이로 맞추며, 왼쪽은 공백으로 채웁니다.

다음은 ljust()와 rjust() 메서드의 간단한 예시 코드입니다.

text = "파이썬"
print(text.ljust(10))  # 출력: "파이썬     "
print(text.rjust(10))  # 출력: "     파이썬"

 

zfill()

zfill() 메서드는 문자열의 왼쪽에 0을 채워서 주어진 길이로 맞추는 메서드입니다. 이 메서드는 일반적으로 숫자를 문자열로 변환할 때 사용됩니다. 만약 변환한 문자열의 길이가 주어진 길이보다 짧을 경우, 문자열 왼쪽에 0을 채워서 길이를 맞춥니다.

다음은 zfill() 메서드의 간단한 예시 코드입니다.

number = 42
print(str(number).zfill(5))  # 출력: "00042"

 

 

다양한 출력 포맷

# 빈 자리는 빈 공간으로 두고, 오른쪽 정렬을 하되, 총 10자리 공간을 확보
print("{0: >10}".format(500))
#        0: 다음의 빈자리 -> 빈공간, ">" 오른쪽 방향, "10" 자리 마련

# 양수일 땐 +로 표시, 음수일 땐 -로 표시
print("{0: >+10}".format(500))
print("{0: >+10}".format(-500))

# 왼쪽 정렬하고, 빈칸을 _로 채움
print("{0:_<10}".format(500))

# 3자리마다 콤마를 찍어주기
print("{0:,}".format(1000000000000))

# 3자리마다 콤마를 찍어주기, +- 부호도 붙이기
print("{0:+,}".format(1000000000000))
print("{0:+,}".format(-1000000000000))

# 3자리마다 콤마를 찍어주기, +- 부호도 붙이기, 자릿수 확보하기
# 빈 자리는 "^"로 채워주기
# 순서 : 빈칸 넣을 것 / 좌우 정렬 / +- 부호 / 자릿수 / 3자리 콤마 여부
print("{0:^<+30,}".format(1000000000000))
print("{0:^<+30,}".format(-1000000000000))

# 소수점 출력
print("{0:f}".format(5 / 3))

# 소수점 특정 자릿수까지만 표시
print("{0:.2f}".format(5 / 3))

 

 

파일 생성하기

새로운 파일을 생성하려면 open() 함수를 사용합니다. open() 함수는 파일 객체를 반환하며, 파일 경로와 파일 모드를 인자로 받습니다.

file = open("file.txt", "w")  # file.txt 파일을 생성합니다.

위 코드에서는 "file.txt"라는 이름의 파일을 쓰기 전용 모드(w)로 열어서 file 변수에 할당합니다. 만약 파일이 존재하지 않으면 새로 생성하고, 이미 존재하는 경우 기존 파일을 덮어씁니다.

 

파일 열기 및 읽기/쓰기 모드 설정하기

open() 함수는 파일 모드를 지정하는 두 번째 인자를 받습니다. 파일 모드는 읽기(r), 쓰기(w), 이어쓰기(a) 등이 있습니다.

file = open("file.txt", "r")  # file.txt 파일을 읽기 전용 모드(r)로 열기
file = open("file.txt", "w")  # file.txt 파일을 쓰기 전용 모드(w)로 열기
file = open("file.txt", "a")  # file.txt 파일을 이어쓰기 전용 모드(a)로 열기

위 코드에서는 "file.txt" 파일을 각각 읽기(r), 쓰기(w), 이어쓰기(a) 전용 모드로 열어서 file 변수에 할당합니다.

 

파일 읽기

파일을 읽으려면 read() 또는 readline() 메서드를 사용합니다.

file = open("file.txt", "r")
content = file.read()  # 파일 전체를 읽어서 content 변수에 할당
print(content)
file.close(

위 코드에서는 "file.txt" 파일을 읽기 전용 모드로 열고, read() 메서드를 사용하여 파일 전체를 읽어서 content 변수에 할당합니다. 이후 print() 함수를 사용하여 파일 내용을 출력하고, 파일을 닫습니다.

 

파일 쓰기

파일에 쓰려면 write() 메서드를 사용합니다.

file = open("file.txt", "w")
file.write("Hello, World!")  # 파일에 문자열을 씁니다.
file.close()

위 코드에서는 "file.txt" 파일을 쓰기 전용 모드로 열고, write() 메서드를 사용하여 파일에 문자열을 씁니다. 이후 파일을 닫습니다.

 

 

파일이 총 몇줄인지 모를 때 사용하는 반복문

1) 일반 반복문

score_file = open("score.txt", "r", encoding="utf8")
while True:
    line = score_file.readline()
    if not line:
        break
    print(line) # 줄바꿈 포함, 줄바꿈 없애려면 end="" 추가
score_file.close()

 

2) 배열 사용

score_file = open("score.txt", "r", encoding="utf8")
lines = score_file.readlines() # list 형태로 저장
for line in lines:
    print(line,end="")

score_file.close()

 

 

pickle

pickle 실습

import pickle

profile_file = open("profile.pickle", "wb")  # w : 쓰기, b : 바이너리 타입 -> 피클에서는 항상 바이너리 타입 선언해야함.
profile = {"이름": "박명수", "나이": 30, "취미": ["축구", "골프", "코딩"]}
print(profile)
pickle.dump(profile, profile_file)  # profile에 있는 정보를 file에 저장
profile_file.close()

 

pickle 모듈은

파이썬 객체를 직렬화(Serialization)하고, 역직렬화(Deserialization)하는 라이브러리

입니다. 파이썬 객체를 바이너리 형태로 저장하거나, 저장된 바이너리 파일을 다시 파이썬 객체로 복원할 수 있습니다.

pickle 모듈을 사용하면 파이썬 객체를 다른 프로그램으로 전송하거나, 파이썬 객체를 파일로 저장하고 다시 로드할 수 있습니다. 이러한 기능은 네트워크 통신을 통해 데이터를 전송하거나, 대규모 데이터를 처리할 때 유용합니다.

pickle 모듈의 사용 방법은 다음과 같습니다.

객체를 바이너리 형태로 직렬화하기

import pickle

data = {'name': 'Alice', 'age': 25, 'city': 'Seoul'}

# 객체를 바이너리 형태로 직렬화하여 파일에 저장합니다.
with open('data.pickle', 'wb') as f:
    pickle.dump(data, f)

위 코드에서는 data 딕셔너리 객체를 pickle.dump() 메서드를 사용하여 직렬화하고, data.pickle 파일에 저장합니다.

바이너리 파일을 객체로 역직렬화하기

import pickle

# 바이너리 파일을 읽어서 객체로 역직렬화합니다.
with open('data.pickle', 'rb') as f:
    data = pickle.load(f)

print(data)

위 코드에서는 data.pickle 파일을 pickle.load() 메서드를 사용하여 역직렬화하고, data 변수에 할당합니다. 이후 print() 함수를 사용하여 data 변수의 내용을 출력합니다.

pickle 모듈은 파이썬의 모든 객체를 직렬화할 수 있으며, 사용이 간편하다는 장점이 있습니다. 하지만, pickle 모듈을 사용할 때 주의해야할 점도 있습니다. pickle 모듈은 안전하지 않은 데이터를 처리할 수 있으며, 다른 언어나 버전 호환성 문제가 발생할 수 있습니다.

 

바이너리 형태란?

0과 1로 이루어진 이진(binary) 데이터를 말합니다. 바이너리 형태로 저장되는 데이터는 컴퓨터가 직접 읽고 처리할 수 있는 형태이며, 일반적인 텍스트 파일과는 다른 형식을 가집니다.

바이너리 형태는 일반적으로 이미지, 음악, 비디오 등과 같은 멀티미디어 데이터, 또는 실행 파일 등과 같은 바이너리 데이터를 저장할 때 사용됩니다. 이러한 데이터는 일반적인 텍스트 데이터와는 달리 구조화되어 있으며, 복잡한 형식을 가지기 때문에 일반적인 텍스트 에디터로는 수정이 불가능합니다.

파이썬에서는 바이너리 데이터를 다룰 때, 파일을 바이너리 모드로 열어서 사용합니다. 바이너리 모드로 파일을 열면, 파일의 데이터를 0과 1의 이진 데이터로 읽고 쓸 수 있습니다.

예를 들어, 다음과 같은 코드로 이미지 파일을 바이너리 모드로 읽을 수 있습니다.

with open('image.jpg', 'rb') as f:
    data = f.read()

위 코드에서는 'image.jpg' 파일을 바이너리 모드('rb')로 열어서 f 변수에 할당하고, read() 메서드를 사용하여 파일의 데이터를 읽어서 data 변수에 할당합니다.

바이너리 데이터는 일반적인 텍스트 데이터와 다르기 때문에 다루는 방법도 다르며, 주의해서 사용해야 합니다.

 

직렬화, 역직렬화

직렬화(Serialization)란, 객체를 일련의 바이트(byte) 스트림으로 변환하는 과정

을 말합니다. 이 과정을 통해

객체를 파일에 저장하거나, 네트워크를 통해 전송

할 수 있습니다. 직렬화된 데이터는 일반적으로 바이너리(binary) 형태로 저장됩니다.

파이썬에서는 pickle 모듈을 사용하여 객체를 직렬화할 수 있습니다. pickle 모듈은 파이썬 객체를 직렬화하여 바이트 스트림으로 변환하고, 반대로 바이트 스트림을 역직렬화하여 객체로 변환할 수 있습니다.

예를 들어, 다음과 같은 코드로 파이썬 객체를 직렬화할 수 있습니다.

import pickle

data = {'name': 'Alice', 'age': 25, 'city': 'Seoul'}

# 객체를 바이너리 형태로 직렬화하여 파일에 저장합니다.
with open('data.pickle', 'wb') as f:
    pickle.dump(data, f)

위 코드에서는 data 딕셔너리 객체를 pickle.dump() 메서드를 사용하여 직렬화하고, data.pickle 파일에 저장합니다.

반면,

역직렬화(Deserialization)란, 직렬화된 바이트 스트림을 원래의 객체로 변환하는 과정

을 말합니다. 파이썬에서는 pickle 모듈을 사용하여 바이트 스트림을 역직렬화할 수 있습니다.

예를 들어, 다음과 같은 코드로 pickle 모듈을 사용하여 바이트 스트림을 역직렬화할 수 있습니다.

import pickle

# 바이너리 파일을 읽어서 객체로 역직렬화합니다.
with open('data.pickle', 'rb') as f:
    data = pickle.load(f)

print(data)

위 코드에서는 data.pickle 파일을 pickle.load() 메서드를 사용하여 역직렬화하고, data 변수에 할당합니다. 이후 print() 함수를 사용하여 data 변수의 내용을 출력합니다.

렬화와 역직렬화는 객체를 파일이나 네트워크를 통해 전송하거나 저장할 때 유용합니다. 이러한 기능을 사용하여 다양한 데이터를 처리

할 수 있습니다.

 

with 구문

with 구문은

파일과 같은 리소스를 사용하는 경우, 파일을 안전하게 다룰 수 있도록 해주는 파이썬의 문법

입니다. with 구문을 사용하면

파일 객체를 생성하고, 파일을 닫는 close() 메서드를 호출할 필요가 없어지므로, 코드가 더 간결

해집니다.

with 구문은 다음과 같은 형태를 가집니다.

with 리소스 as 변수:
    # 코드 블록

위 구문에서 리소스는 파일 객체, 네트워크 연결, 데이터베이스 연결 등과 같은 리소스를 말합니다. 변수는 리소스를 다루기 위한 변수입니다.

with 구문을 사용하면, 코드 블록이 실행될 때 리소스를 안전하게 열고, 코드 블록이 종료될 때 리소스를 자동으로 닫아줍니다. 이를 위해서는 리소스가 enter() 메서드와 exit() 메서드를 제공해야 합니다.

예를 들어, 파일을 다루는 경우 with 구문을 사용하여 다음과 같이 파일을 안전하게 열고 닫을 수 있습니다.

with open('file.txt', 'r') as f:
    content = f.read()
    print(content)

위 코드에서는 with 구문을 사용하여 'file.txt' 파일을 안전하게 열고, read() 메서드를 사용하여 파일의 내용을 읽어서 content 변수에 할당합니다. 이후 print( ) 함수를 사용하여 파일 내용을 출력합니다. with 구문을 사용하면, 파일을 닫는 close() 메서드를 호출할 필요가 없어서 코드가 더 간결해집니다.

따라서, with 구문은 파이썬에서 파일과 같은 리소스를 다룰 때 유용한 문법입니다.

 

 

Quiz

당신의 회사에서는 매주 1회 작성해야 하는 보고서가 있습니다.
보고서는 항상 아래와 같은 형태로 출력되어야 합니다.

- x 주차 주간보고 -
부서 :
이름 :
업무 요약 :

1주차부터 50주차까지의 보고서 파일을 만드는 프로그램을 작성하시오.

조건 : 파일명은 ‘1주차.txt’, ‘2주차.txt’, … 와 같이 만듭니다.

 

풀이

# 내가 푼 오답 풀이
import pickle

for i in range(1, 51):
    report_file = open("report.pickle", "wb")
    report = {"- " + i + "주차 주간보고 -", "부서 :", "이름 :", "업무 요약 :"}
    print(report)

 

답안

for i in range(1,51):
    with open(str(i)+"주차.txt","w",encoding="utf8") as report_file:
        report_file.write("- {0} 주차 주간보고 -".format(i))
        report_file.write("\n부서 :")
        report_file.write("\n이름 :")
        report_file.write("\n업무 요약 :")

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...