파알못 파이썬: 1. 파이썬 기초

Table of Content

파이썬을 공부한 내용을 정리한 글입니다. 파알못이라 이상하거나 틀린 내용이 있을 수 있습니다…

변수

변수에 정수, 실수, boolean, 문자얼 값을 지정하는 방법은 다음과 같습니다.

student_count = 1000
rating = 4.99
is_published = True  # 또는 False

str1 = '안녕요?ㅎ'  # string은 작은 따옴표(') 또는 큰 따옴표(")로 구분
str2 = "'안녕요?ㅎ'"  # 작은 따옴표(') 입력
str3 = '"안녕요?ㅎ"'  # 큰 따옴표(") 입력
str4 = """
Multiple
Lines
"""

x = 1
y = 2

x, y = 1, 2  # 이 코드는 위의 두 코드와 동일하게 작동
x = y = 1  # x, y 둘 다 값을 1로 지정

print(str4)

정수 연산

x = 10 + 3
x += 3

x = 10 - 3
x -= 3

x = 10 / 3  # 나눈 값
x = 10 // 3  # 몫
x = 10 % 3  # 나눈 나머지
x = 10 ** 3  # n제곱
print(x)

10진수, 2진수, 16진수

파이썬에서 10진수, 2진수, 16진수 및 복소수 값을 사용하는 법은 다음과 같습니다.

x = 10
print(x)

x = 0b10  # 0b: 2진수(Binary)임을 명시
print(bin(x))  # bin(): 2진 표현 반환

x = 0x12c  # 0x: 16진수(Hexadecimal)임을 명시
print(hex(x))

x = 1 + 2j  # 복소수 표현
print(x)

문자열(Strings)

문자열의 각 요소에 접근하는 방법

course = "Python Programming"
print(len(course))  # 문자열 길이 출력(18)
print(course[0])  # 문자열의 첫번째 요소 출력 -> P
print(course[-1])  # 문자열의 맨 끝자리 출력 -> g
print(course[-2])  # 문자열의 두 번째 끝자리 출력 -> n
print(course[1:5])  # 문자열 범위 추출. end index 값은 포함 안 됨 -> ytho
print(course[:5])  # start index 생략 시 처음부터 end index까지 출력
print(course[0:])  # end index 생략 시 start index부터 끝까지 출력

유용한 문자열 메소드

course = "Python Programming"
print(course.upper())  # 모두 대문자로 변환
print(course.lower())  # 모두 소문자로 변환
print(course.title())  # 단어 첫 글자를 대문자로 변환

course = "   Python Programming    "
print(course.strip())  # 앞뒤 공백 제거. 값을 입력받을 때 유용.
print(course.lstrip())  # 왼쪽 공백 제거
print(course.rstrip())  # 오른쪽 공백 제거
print(course.find("Pro"))  # 매개변수 문자열의 인덱스(시작점) 반환. 정확한 값이 없을 시 -1 반환.
print(course.replace("P", "-"))  # 첫번째 매개변수 값을 두번째 매개변수 값으로 치환

print("Programming" in course)  # course 변수 내에 "Programming"이라는 문자열 포함 여부 반환
# course 변수 내에 "Programming"이라는 문자열 미포함 여부 반환
print("Programming" not in course)

Escape Sequences

이스케이프 시퀀스는 백슬래시()와 영문자 또는 숫자를 조합하여 만들어진 문자 조합입니다. 문자열 내에 줄바꿈 및 따옴표 등을 나타내기 위해서 사용합니다. 주요 이스케이프 시퀀스는 다음과 같습니다.

  • \": 큰 따옴표(") 출력
  • \': 작은 따옴표(‘) 출력
  • \\: 백슬래시() 출력
  • \n: 줄바꿈
# 문자열 중간에 ", ' 및 줄바꿈 추가
message = "Python \"Programming\""
message = "Python \'Programming\'"
message = "Python \nProgramming"

# 첫 줄이 빈 줄인 문자열
message = """
Python 
Programming
"""

# 첫 줄이 빈 줄이 아닌 문자열
messgae = """Python
Programming
"""

print(message)

f-string

문자열과 문자열을 이을 때 보통 +를 사용하여 이을 수 있습니다.

first = "Ing"
last = "Yeo"

full = first + " " + last

그러나 파이썬 3.6 버전부터 도입된 f-string을 사용하면 다음과 같이 효율적으로 문자열을 이을 수 있을뿐만 아니라 표현식을 사용하여 문자열 내에 함수 반환 값이나 식의 계산 값을 적용할 수 있습니다.

first = "Ing"
last = "Yeo"

full = f"{first} {last}"  # f-string: 접두어 f 또는 F를 붙이고 문자열 내에 표현식 {} 사용
test = f"{len(first)} {2 + 2}"  # 표현식 내에 함수, 식 등 사용 가능

동적 타이핑(Dynamic Typing)

정적(Static) 언어인 C++, C#, Java 등은 변수의 타입을 명시해주어야 합니다. 반면 동적(Dynamic) 언어인 Javascript, Ruby, Python 등은 값의 타입을 명시하지 않고 바로 값을 지정합니다. 변수의 타입은 런타임 시 결정됩니다.

변수의 타입을 알고 싶다면 type() 함수를 사용합니다.

age = 20
age = "Python" # 파이썬은 동적 언어이므로 
print(type(a))

타입 주석(Type Annotation)

파이썬은 동적 언어이므로 변수에 값의 타입을 명시하지 않습니다. 그러나 타입을 명시하고 싶은 경우가 있을 수 있습니다. 이 때 파이썬 3.6 부터 지원하기 시작한 타입 주석(Type Annotation)을 사용하면 됩니다.

타입 주석을 사용한다고 해서 반드시 타입 주석에 명시된 값만 와야하는 건 아닙니다. 다만 타입 주석에 명시된 타입과 다른 값을 지정한 경우 mypy 등의 일부 린터(Linter)에서 경고를 나타낼 수 있습니다.

age: int = 20  # 타입 주석: int
age = "Python"  # 타입 주석을 선언해도 다른 타입의 값을 지정할 수 있음
print(age)

변수의 타입 변환

int(), float(), bool(), str() 함수를 사용하여 변수의 타입을 변환합니다.

a = "1"
b = "1.1"
c = "True"
d = 1

print(int(a)) # 정수 변환
print(float(b)) # 실수 변환
print(bool(c)) # Boolean 변환
print(str(d)) # 문자열 변환

Boolean 타입 변환

False, 빈 문자열(""), 0, 빈 배열([]), None(null)을 Boolean 타입으로 변환하면 False가 됩니다.

전역변수와 지역변수

파이썬엔 블록 레벨 범위가 없습니다. 따라서 아래 if문에서 선언한 변수를 외부에서도 접근할 수 있습니다.

def greet():
    if True:
        message = '안녕요?ㅎ'
    print(message)

greet()

파이썬에선 기본적으로 함수 내부에서 전역변수에 접근할 수 없습니다.

message = '안녕요?ㅎ' # 전역변수

def greet():
    message = "하이요?ㅎ"  # 위에서 선언한 전역변수 값을 바꾸는 것이 아니라 이 함수의 새로운 지역변수를 만드는 코드

greet()
print(message)  # 전역변수 값은 바뀌지 않았으므로 '하이요?ㅎ'가 아닌 '안녕요?ㅎ' 출력

함수 내부에서 전역변수에 접근하려면 global 키워드를 사용합니다. 하지만 함수가 전역변수 값을 수정하는 건 부작용이 발생할 수 있으므로 권장하지 않습니다.

message = '안녕요?ㅎ'

def greet():
    # 전역변수 접근
    global message
    message = "하이요?ㅎ"

greet()
print(message)  # 전역변수 값이 함수에 의해 변경됐으므로 '안녕요?ㅎ' 출력

조건문

파이썬에서는 if문에 중괄호 {}를 쓰지 않고 콜론(:)을 사용합니다.

age = 22

if age >= 18:
  print("Adult")
elif age >= 13:
  print("Teenager")
else:
  print("Child")

print("All done!")

아무 동작도 하지 않는 조건엔 pass 키워드를 사용합니다.

if x > 1:
  pass
else:
  pass

조건이 여러개인 경우 and를 사용하여 여러 조건을 걸 수 있습니다.

age = 22
if age >= 18 and age <= 65:
  print("Eligible")

참고로, 바로 위의 코드는 아래처럼 수학적인 표현으로 바꿀 수 있습니다.

age = 22
if 18 <= age <= 65:
  print("Eligible")

삼항 연산자

삼항 연산자는 if-else 문을 한 줄의 코드로 작성할 수 있게 해주는 연산자입니다. 파이썬에서의 삼항 연산자는 다음과 같습니다.

age = 22
message = "Eligible" if age >= 18 else "Not Eligible"

루프

for문

파이썬의 for문은 객체의 요소를 하나씩 꺼내옵니다.

for x in "Python":
    print(x) 

for x in ['a', 'b', 'c']:
    print(x)

for x in range(5):  # 0 1 2 3 4 출력
    print(x)

for x in range(2, 5):  # 2 3 4 출력
    print(x)

for x in range(0, 10, 2):  # 0~9 중 짝수 출력
    print(x)

참고로 range() 함수는 범위 객체를 리턴합니다. range() 함수를 사용하면 아주 큰 범위를 지정하더라도 메모리를 적게 사용할 수 있습니다.

print(range(5)) # range(0, 5)
print(type(range(5))) # <class 'range'>

for – else 문

특정 배열 요소를 검색하다가 조건에 맞는 요소를 찾는 경우를 생각해봅시다. 예를 들어 특정 알파벳으로 시작하는 배열 요소를 찾은 경우와 그렇지 못한 경우를 나누어 출력한다면 다음과 같이 코딩할 수 있습니다.

names = ["AJohn", "Mary"]
flag = False # 플래그 사용

for name in names:
    if name.startswith("J"):
        flag = True
        print("Found")
        break

if not flag:
    print("Not found")

위의 예제에선 배열 요소를 찾은 경우와 그렇지 못한 경우를 구분짓기 위한 플래그 변수를 만들어 사용했습니다. 그러나 파이썬의 for – else 문을 사용하면 그럴 필요가 없습니다.

names = ["John", "Mary"]

for name in names:
    if name.startswith("J"):
        print("Found")
        break
else:
    print("Not found")

while

while 문은 조건이 만족할 때까지 반복합니다.

guess = 0
answer = 5

while answer != guess: # 5가 입력될 때까지 반복
    guess = int(input("Guess: "))

함수

파이썬의 함수 형식은 다음과 같습니다.

def funcname(parameter_list):
  pass

예를 들어 두 숫자를 입력받아 튜플(읽기전용 목록. 소괄호로 생성함.)을 반환하는 함수는 다음과 같습니다.

def increment_v1(number, by):
    return (number, number + by)  # 튜플 반환

print(increment_v1(2, 3))

매개변수에 값이 지정되지 않은 경우 기본 매개변수 값을 지정토록 할 수 있습니다.

def increment_v2(number, by=1):  # 매개변수에 기본값 지정
    return (number, number + by)

print(increment_v2(2)) # by 매개변수에 값 지정하지 않았으나 기본값인 1로 지정됨

콜론(:)을 사용하여 타입주석(타입힌트)를 명시하면 매개변수 값의 타입을 제한할 수 있습니다.

def increment_v3(number: int, by: int = 1):  # 매개변수에 타입주석(타입힌트) 명시
    return (number, number + by)

print(increment_v3(2, by=3))  # 읽기 쉽도록 매개변수명 명시
# print(increment_v3("ing-yeo", by=3)) # 에러! 첫번째 매개변수는 int 타입

함수의 리턴 타입을 명시한다면 화살표(->)와 콜론(:)을 사용합니다.

def increment_v3(number: int, by: int = 1) -> tuple:  # 이 함수의 리턴 타입은 tuple
    return (number, number + by)

가변 인수(*args)

매개변수로 받는 값을 모두 곱한 값을 반환하는 함수를 만든다고 가정해봅시다. 이 때 매개변수를 몇 개 받을지는 매번 다릅니다. 그렇다면 매개변수를 전달받을 경우의 수만큼 함수를 하나씩 선언해줘야 할까요?

이런 경우 함수를 선언할 때 매개변수 앞에 아스테리스크(*)를 붙여 매개변수가 가변 인수(또는 튜플, Tuple)임을 명시해주면 간단히 해결할 수 있습니다.

# 매개변수로 받는 값을 모두 곱한 값을 반환하는 함수
# 매개변수 앞에 *를 붙이면 가변 인수(튜플)임을 명시
def multiply(*list):
    total = 1
    for item in list:
        total *= item
    return total

print(multiply(2, 3, 4, 5, 6))

키워드된 가변 인수(**kwargs)

키워드된 가변 인수는 위에서 설명한 가변 인수와 비슷하지만 키값을 통해 전달받은 매개변수에 접근할 수 있습니다.

# 매개변수 앞에 **를 붙이면 키워드된 가변 인수임을 명시
def save_user(**user):
    print(user)  # 입력받은 매개변수를 Dictionary(Key-Value 쌍으로 구성된 자료의 모임) 형태로 출력
    print(user['id'])
    print(user['name'])

save_user(id=1, name="ing-yeo")

디버깅

VSCode에서 F9 키를 눌러 중단점을 설정/제거할 수 있습니다.

디버깅을 시작하려면 F5 키를 누릅니다. 디버깅 중 VSCode의 디버깅 탭으로 가면 변수, 조사식, 호출 스택 등을 볼 수 있습니다.

다음 중단점으로 이동하려면 F10 키를 누릅니다.

연습문제: Fizz Buzz

입력받은 값이 3으로 나눠지면 Fizz를, 5로 나눠지면 Buzz를 출력합니다. 3과 5로 둘 다 나눠지면 FizzBuzz를 출력합니다.

def fizz_buzz(input):
    if (input % 3 == 0) and (input % 5 == 0):
        return 'FizzBuzz'
    if input % 3 == 0:
        return 'Fizz'
    if input % 5 == 0:
        return 'Buzz'
    return input

print(fizz_buzz(15))

댓글 남기기