본문 바로가기
카테고리 없음

파이썬 문법 뽀개기

by Hyeon_E 2023. 4. 27.

[ 파이썬 시작하기 ]

▶ 파이썬을 설치한다는 것은?

일종의 번역팩을 설치한다고 생각하면 됨

컴퓨터는 101010001 과 같은 언어만 알아듣기에 파이썬 문법으로 된 것을

101010001로 변환해줄 수 있도록번역 패키지를 설치하는 것

▶ VSCode에서 파이썬 파일 실행하기

  1. 파이썬 확장자(.py)를 붙여 파일을 만든다
  2. 인터프립터를 파이썬으로 바꿈
  3. 오른쪽 클릭하여 터미널에서 파이썬 실행 클릭 혹은 터미널에 python 파일명쳐도 실행됨

▶ 파이썬 문법에 시작하기 앞서

파이썬은 매우 직관적인 언어이고, 할 수 있는 것이 많음

하지만 개발자들도 모든 문법을 기억하기란 쉽지 않기에 배우는 것 외에 필요한것은 구글링해서 찾아보면 됨

 

[ 변수 선언과 자료형 ]

▶ 변수 선언

변수이름 = 값

 

출력할때는 print()를 사용

a = 3        # 3을 a에 넣음
print(a)
b = a        # a에 들어 있는 값인 3을 b에 넣음
print(b)
a = 5        # a에 5라는 새로운 값을 넣음
print(a, b)  # 5 3

▶ 숫자형 자료형

'자료형'이란 프로그래밍을 할때 쓰이는 숫자, 문자열 등 자료 형태로 사용하는 모든것을 뜻함

 

다양한 형태의 숫자를 쓸 수 있음

a = 5
b = 4.8

 

숫자 간에는 사칙연산이 가능함. 몫과 나머지도 구할 수 있음

a = 7
b = 2

a+b   # 9 
a-b   # 5
a*b   # 14
a/b   # 3.5
a//b  # 3, 몫
a%b   # 1, 나머지
a**b  # 49, 거듭제곱

a+3*b         # 13, 여러 연산을 한 줄에 할 경우 사칙연산의 순서대로!
(a+3)*b       # 20, 소괄호를 이용해서 먼저 계산할 부분을 표시해줄 수 있음!

 

변수에 저장된 값에 연산을 한 후 다시 그 값을 같은 변수에 저장할 수 있음

 

a = 5
a = a + 3 # 5에 3을 더한 값을 다시 a에 저장
print(a)  # 8
a += 3    # 줄여 쓸 수도 있음. 같은 의미!

▶ Bool 자료형

참/거짓을 나타내는 불(Boolean)자료형이 있음

x = True   # 참
y = False  # 거짓

z = true   # name 'true' is not defined, 에러
True = 1   # 에러

 

  • 소문자로 쓰면 자료형으로 인식하지 않고 변수명이라 생각해 에러가 남
  • True/False는 변수명으로 쓸 수 없음

보통 '비교연산자'의 결과로 나타내기 위해 쓰임

4 > 2      # True  크다
5 < 1      # False 작다
6 >= 5     # True  크거나 같다
4 <= 4     # True  작거나 같다
3 == 5     # False 같다
4 != 7     # True  같지 않다

 

Bool자료형에는 논리연산자를 이용할 수 있음

a = 4 > 2  # True
not a      # False    NOT 연산자로 참을 거짓으로, 거짓을 참으로 바꿔줌
a and b    # False    AND 연산자로 모두 참이어야 참을 반환
a or b     # True     OR 연산자로 둘 중 하나만 참이면 참

 

[ 문자열 다루기 ]

▶ 문자열

/문자열 기초/

파이썬에서는 '글'도 데이터로 사용할수 있음. 이것을 '문자열'이라고 함

# 작은 따옴표 또는 큰 따옴표. 둘 다 같음
a = "aa"
b = 'aa'

 

따옴표로 감싸지 않으면 변수이름을 뜻하기 때문에 꼭 구분해서 써야함

a = 1
b = "a"
c = a
print(a, b, c) # 1 "a" 1

 

문자열에 따옴표를 포함해야할 때

print("I'm happy :)")

 

/문자열 연산/

문자열 간의 더하기는 두 문자열을 이어붙인 문자열을 반환함

first_name = "Harry"
last_name = "Potter"

first_name + last_name  # HarryPotter
first_name + " " + last_name  # Harry Potter

a = "3"
b = "5"
a + b    # 35

 

문자열과 정수를 더하면 에러

a = "3"
a + 5    # 문자열과 숫자형은 더할 수 없어서 에러!

 

문자열의 길이는 len()함수를 써서 구할수 있음

print(len("abcde"))           # 5
print(len("Hello, Sparta!"))  # 14
print(len("안녕하세요."))      # 6

 

그 외에도 다양한 기능을 쓸 수 있음

특정 자료형 뒤에 .을 붙이고 쓰는 내장 함수들을 '메소드(method)'라고 함

 

  • 모든 알파벳을 대문자/ 소문자로 바꾸기
sentence = 'Python is FUN!'

sentence.upper()  # PYTHON IS FUN!
sentence.lower()  # python is fun!

 

  • 특정 문자를 기준으로 문자열 나누기
# 이메일 주소에서 도메인 'gmail'만 추출
myemail = 'test@gmail.com'

result = myemail.split('@') # ['test','gmail.com'] ('리스트'자료형)

result[0] # test (리스트의 첫번째 요소)
result[1] # gmail.com (리스트의 두 번째 요소

result2 = result[1].split('.') # ['gmail','com']

result2[0] # gmail -> 알고 싶었던 것
result2[1] # com

# 한 줄로 한 번에!
myemail.split('@')[1].split('.')[0]

 

  • 특정 문자를 다른 문자로 바꾸기
txt = '서울시-마포구-망원동'
print(txt.replace('-', '>')) # '서울시>마포구>망원동'

 

/인덱싱과 슬라이싱/

문자열은 '문자들의 모임'이기 때문에 그 일부를 따로 떼어 부르는 방법이 있음

한 글자 씩 부를 때는 몇 번째인지 '인덱스'를 넣어 불러서 '인덱싱'이라고 함

f="abcdefghijklmnopqrstuvwxyz"
f[1]   # b 파이썬은 숫자를 0부터 셈

 

문자열의 일부를 잘라낼 때는 '슬라이싱'이라고 함

f[4:15]  # efghijklmno           f[4]부터 f[15] 전까지, 총 15-4=11개!

f[8:]    # ijklmnopqrstuvwxyz    f[8]부터 끝까지, 앞의 8개 빼고!
f[:7]    # abcdefg               시작부터 f[7] 전까지, 앞의 7개!

f[:]     # abcdefghijklmnopqrstuvwxyz  처음부터 끝까지

 

특정 문자열로 자르고 싶을때 split('문자열')을 활용함

myemail = 'abc@sparta.co'

domain = myemail.split('@')[1].split('.')[0]
print(domain)

 

[ 리스트와 딕셔너리 ]

▶ 리스트(list)

/리스트 기초/

순서가 있는, 다른 자료형들의 모임

a = [1, 5, 2]
b = [3, "a", 6, 1]
c = []
d = list()
e = [1, 2, 4, [2, 3, 4]]

 

리스트 길이도 len()함수를 사용해서 잴 수 있음

a = [1, 5, 2]
print(len(a))   # 3

b = [1, 3, [2, 0], 1]
print(len(b))   # 4

 

순서가 있기 때문에, 문자열에서처럼 인덱싱과 슬라이싱을 사용할 수 있음

a = [1, 3, 2, 4]
print(a[3])  # 4
print(a[1:3]) # [3, 2]
print(a[-1]) # 4 (맨 마지막 것)

 

리스트의 요소가 리스트라면 중첩해서

a = [1, 2, [2, 3], 0]
print(a[2])      # [2, 3]
print(a[2][0])   # 2

 

/리스트의 더 많은 기능들/

  • 덧붙이기
a = [1, 2, 3]
a.append(5)
print(a)     # [1, 2, 3, 5]

a.append([1, 2])
print(a)     # [1, 2, 3, 5, [1, 2]]


# 더하기 연산과 비교!
a += [2, 7]
print(a)     # [1, 2, 3, 5, [1, 2], 2, 7]

 

  • 정렬하기
a = [2, 5, 3]
a.sort()
print(a)   # [2, 3, 5]
a.sort(reverse=True)
print(a)   # [5, 3, 2]

 

  • 요소가 리스트 안에 있는지 알아보기
a = [2, 1, 4, "2", 6]
print(1 in a)      # True
print("1" in a)    # False
print(0 not in a)  # True

 

▶ 딕셔너리(dictionary)

/딕셔너리 기초/

딕셔너리는 키(key)와 밸류(value)의 쌍으로 이루어진 자료의 모임

person = {"name":"Bob", "age": 21}
print(person["name"])

 

딕셔너리를 만드는 데는 여러가지 방법을 쓸 수 있음

a = {"one":1, "two":2}

# 빈 딕셔너리 만들기
a = {}
a = dict()

 

딕셔너리의 요소에는 순서가 없기 때문에 인덱싱을 사용할 수 없음

person = {"name":"Bob", "age": 21}
print(person[0])   # 0이라는 key가 없으므로 KeyError 발생!

 

딕셔너리의 값을 업데이트하거나 새로운 쌍의 자료를 넣을 수 있음

person = {"name":"Bob", "age": 21}

person["name"] = "Robert"
print(person)  # {'name': 'Robert', 'age': 21}

person["height"] = 174.8
print(person)  # {'name': 'Robert', 'age': 21, 'height': 174.8}

 

딕셔너리의 밸류로는 아무 자료형이나 쓸 수 있음(즉 다른 딕셔너리를 넣을 수도 있음)

person = {"name":"Alice", "age": 16, "scores": {"math": 81, "science": 92, "Korean": 84}}
print(person["scores"])             # {'math': 81, 'science': 92, 'Korean': 84}
print(person["scores"]["science"])  # 92

 

/딕셔너리의 더 많은 기능들/

  • 딕셔너리 안에 해당 키가 존재하는지 알고 싶을 때는 in을 사용
person = {"name":"Bob", "age": 21}

print("name" in person)       # True
print("email" in person)      # False
print("phone" not in person)  # True

▶ 리스트와 딕셔너리의 조합

딕셔너리는 리스트와 함게 쓰여 자료를 정리하는데 쓰일 수 있음

people = [{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38}]

# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'

person = {'name': 'john', 'age': 7}
people.append(person)

# people의 값은? [{'name':'bob','age':20}, {'name':'carry','age':38}, {'name':'john','age':7}]
# people[2]['name']의 값은? 'john'

 

[ 조건문 ]

▶ if문

조건을 만족했을 때만 특정 코드를 실행하도록 하는 문법

조건에는 불 자료형이 들어감

파이썬은 어디까지 구문에 포함되는지를 들여쓰기로 구분하기 때문에 들여쓰기가 아주 중요함

if 조건:
    조건이 True일때 실행될 코드

 

예시

money = 2000
if money > 3800:
    print("택시 타자!")
else:
    print("걸어가자...")

▶ else와 elif

조건이 만족하지 않을때 다른 코드를 실행하고 싶을때 쓰는 문법

elif는 다양한 조건을 판단할때 사용하면 좋음

 

if 조건1:
    조건1만 만족했을때 실행될 코드
elif 조건2:
    조건2만 만족했을때 실행될 코드
else:
    조건1과 조건2가 둘다 만족되지 않을때 실행될 코드

 

예시

age = 27
if age < 20:
    print("청소년입니다.")
elif age < 65:
    print("성인입니다.")
else:
    print("무료로 이용하세요!")

 

[ 반복문 ]

▶ for문

임무를 한번에 묶어서 반복 실행시키도록 하는 문법

 

for 변수 in 반복값or리스트or튜플:
	반복적으로 실행될 코드

예시

fruits = ['사과', '배', '감', '귤']

for fruit in fruits:
    print(fruit)
  1. in 뒤에 존재하는 리스트 순서를 한번씩 대입하면서 변수에 넣어줌
  2. 처음에는 사과를 fruit 변수에 넣어 print 출력
  3. 두번째 배를 fruit 변수에 넣어 print 출력
  4. 반복
  5. 마지막으로 귤까지 출력되면 반복문에서 빠져 나오게 됨

▶ enumerate, break

enumerate()는 파이썬 내장함수

for 문의 in 뒷부분을 enumerate() 함수로 한번 감싸주면

인덱스(index)와 원소를 동시에 접근하면서 루프를 돌릴 수 있음

 

만약 인덱스를 0이 아니라 1로 시작하고 싶다면

eumerate()함수를 호출할때 start 인자에 시작하고 싶은 숫자를 넘기면 됨

 

for i, fruit in enumerate(fruits):
    print(i,fruit)
    
# 0 사과
# ...
# 3 귤

for i, fruit in enumerate(fruits, start=1):
    print(i,fruit)
    
# 1 사과
# ...
# 4 귤

 

break는 반복문에서 제어흐름을 벗어나기 위해 사용

즉, 루프를 완전히 중단하는 것

continue와 다른점은 break는 제어흐름을 중단하고 빠져나오지만,

continue제어 흐름(반복)을 유지한 상태에서 코드의 실행만 건너뛰는 역할을 함

  • break: 제어흐름 중단
  • continue: 제어흐름은 유지, 코드 실행만 건너뜀

 

for i, fruit in enumerate(fruits):
    print(i, fruit)
    if i == 2:
        break
# 0 사과
# 1 배
# 2 감

 

[ 함수 ]

▶ 함수 사용 방법

함수반복적으로 사용하는 코드들에 이름을 붙여놓은 것

 

def hello():
		print("안녕!")
    print("또 만나요!")


hello()

 

조건문에 넣을 값을 바꿔가면서 결과를 확인할때 쓰면 편함

def bus_rate(age):
		if age > 65:
		    print("무료로 이용하세요")
		elif age > 20:
		    print("성인입니다.")
		else:
		    print("청소년입니다")

bus_rate(27)
bus_rate(10)
bus_rate(72)

 

단순한 출력 뿐만 아니라 결과 값을 돌려주도록 함수를 만들수도 있음(return)

def bus_fee(age):
		if age > 65:
		    return 0
		elif age > 20:
		    return 1200
		else:
		    return 0     


money = bus_fee(28)
print(money)

 

[ 튜플, 집합 ]

▶ 튜플(tuple)

튜플리스트와 비슷하지만 불변인 자료형

리스트와 같이 순서가 존재

a = (1,2,3)
print(a[0])

a = (1,2,3)
a[0] = 99 # 이러한 작업이 불가능함

 

튜플은 딕셔너리 대신 리스트와 튜플로 딕셔너리 '비슷하게' 만들어 사용해야 할때 많이 쓰임

a_dict = [('bob','24'),('john','29'),('smith','30')]

▶ 집합(set)

집합은 말 그대로 '집합'을 구현하는 방법

장점으로 중복이 제거됨

a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]
a_set = set(a)
print(a_set)  #{1, 2, 3, 4, 5}

 

교집합/ 합집합/ 차집합도 구할 수 있음

a = set(['사과','감','수박','참외','딸기'])
b = set(['사과','멜론','청포도','토마토','참외'])
print(a & b)  # 교집합, {'참외', '사과'}
print(a | b)  # 합집합, {'참외', '수박', '감', '멜론', '청포도', '토마토', '사과', '딸기'}

 

[ f-string ]

▶ 변수로 더 직관적인 문자열 만들기

f를 앞에 붙여준 다음에 문자열을 쓰면 f-string이 됨

 

예시

scores = [
    {'name':'영수','score':70},
    {'name':'영희','score':65},
    {'name':'기찬','score':75},
    {'name':'희수','score':23},
    {'name':'서경','score':99},
    {'name':'미주','score':100},
    {'name':'병태','score':32}    
]

라는 정보가 있는데

 

for s in scores:
    name = s['name']
    score = str(s['score'])
    print(name+'는 '+score+'점 입니다')

로 출력할수도 있음

 

for s in scores:
    name = s['name']
    score = str(s['score'])
    print(f'{name}은 {score}점입니다')

f-string을 이용하면 훨씬 간단하게 가능함

 

[ 예외처리 ]

▶ try - except문

에러가 있어도 건너뛰게 할수 있는 방법

하지만 실제 프로젝트에 남용하는것은 금물! 어디서 에러가 났는지 알수가 없음

 

예시

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby'},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    if person['age'] > 20:
        print (person['name'])

20세보다 큰 나이가 많은 사람을 출력하려고 하는데 데이터 하나가 잘못 들어감(bobby의 age 데이터가 없음)

 

for person in people:
    try:
        if person['age'] > 20:
            print (person['name'])
    except:
        name = person['name']
        print(f'{name} - 에러입니다')

try except 구문을 이용하면 에러를 넘길 수 있음

 

[ 파일 불러오기 ]

from 파일명 import *

파이썬파일 상단에 입력. 파일은 불러오고 싶은 파일명을 넣어주면 됨

예시

# main_func.py
def say_hi():
	print('안녕!')

복잡한 함수를 넣어놓는 파일

 

# main_test.py
from main_func import *

say_hi()

뼈대가 되는 파일 

파일에 함수로 만들지 않았어도 다른 파일에서 함수를 갖다가 쓰기 때문에 오류가 발생하지 않고 잘 돌아감

 

[ 한줄의 마법 ]

▶ if문 - 삼향연산자

항이 3개라 삼항연산자라고 부름

(참일때 값) if (조건) else (거짓일때 값)

예시

num = 3
if num%2 == 0:
    result = "짝수"
else:
    result = "홀수"
print(f"{num}은 {result}입니다.")

if-else문을 이용해 조건에 따라 다른값을 변수에 저장하는 것을

 

num = 3
result = "짝수" if num%2 == 0 else "홀수"
print(f"{num}은 {result}입니다.")

한줄에 적을 수 있음

▶ for문 - 한방에 쓰기

예시

a_list  = [1, 3, 2, 5, 1, 2]
b_list = []
for a in a_list:
    b_list.append(a*2)
print(b_list)

a_list의 각 요소에 2를 곱한 새로운 리스트를 만드는 것을

 

a_list  = [1, 3, 2, 5, 1, 2]
b_list = [a*2 for a in a_list]
print(b_list)

한번에 쓸 수 있음

 

[ map, filter, lambda식 ]

▶ map, 리스트의 모든 원소를 조작

예시

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'
result = map(check_adult, people)
print(list(result))

1차 조작

people를 하나하나 돌면서 check_adult에 넣고 그 결과값을 result넣음

그 후 result를 리스트로 묶고 출력

 

def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'
result = map(check_adult, people)
print(list(result))

2차 조작

성인이라고 하자 만약에 person에 age가 20보다 크면, 아니면 청소년으로 리턴하자

 

result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))

people를 하나씩 돌며 x에 넣을껀데 x는 저 조건식을 돌아 age가 20보다 크면 성인을 아니면 청소년을 리턴

x는 변수로 마음대로 변경할 수 있음 하지만 보통 x라고 많이 씀

 

3차 조작

▶ filter, 리스트의 모든 원소 중 특별한 것만 뽑기

result = filter(lambda x: x['age'] > 20, people)
print(list(result))

people를 하나씩 돌며 x에 넣을껀데 x에 age가 20보다 큰것만 result에 넣음

 

[ 함수의 매개변수 ]

def cal(a, b):
    return a + 2 * b
print(cal(3, 5))  #13
print(cal(5, 3))  #11
print(cal(a=3, b=5))  #13
print(cal(b=5, a=3))  #13

함수에 인수를 넣을때 어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있음

 

def cal(a, b):
    return a + 2 * b
print(cal(3, 5))  #13
print(cal(5, 3))  #11
print(cal(a=3, b=5))  #13
print(cal(b=5, a=3))  #13

특정 매개변수에 디폴트 값을 지정해줄 수 있음

 

def call_names(*args):
    for name in args:
        print(f'{name}야 밥먹어라~')
call_names('철수','영수','희재')
#철수야 밥먹어라~
#영수야 밥먹어라~
#희재야 밥먹어라~

입력값의 개수를 지정하지 않고 모두 받는 방법

- 여러개의 인수를 하나의 매개변수로 받을때 관례적으로 args라는 이름을 사용(arguments라는 뜻)

 

def get_kwargs(**kwargs):
    print(kwargs)
get_kwargs(name='bob')
get_kwargs(name='john', age='27')

키워드 인수를 여러 개 받는 방법(딕셔너리로 나옴)

 

 

 

댓글