본문 바로가기

TIL

[240107] 파이썬 문법 기초

[파이썬 문법 기초 by 이범규 튜터]

 

1. 파이썬 문법 뽀개기(기초)

1) 변수

: 값을 담는 박스. 값을 가르키고 있는 것이기도 함.

: 새 변수를 만들 때 [변수이름 = 값]의 형태로 씀. a = b와 b = a는 다르고, 출력할 때는 print()를 써야 함

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

 

2) 자료형 

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

- 숫자형 자료형

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

 

- 불(Boolean) 자료형: 참/거짓을 나타냄 

x = True   # 참
y = False  # 거짓

4 > 2      # True  크다
3 == 5     # False 같다
4 != 7     # True  같지 않다

-- 논리 연산자 이용 가능 
a = 4 > 2  # True
not a      # False    NOT 연산자로 참을 거짓으로, 거짓을 참으로 바꿔준다.

a and b    # False    AND 연산자로 모두 참이어야 참을 반환한다.
a or b     # True     OR 연산자로 둘 중 하나만 참이면 참이다.

-- 주의 할 점 
z = true   # name 'true' is not defined
		   # 소문자로 쓰면 자료형으로 인식하지 않고 변수명이 되어 에러 발생
           
True = 1   # True/False는 변수명으로 쓸 수 없음

 

- 문자열 자료형  

-- 문자열 길이 구하기
text = 'abcdefghijk'

result = len(text) #문자열 길이 구하기 
print(result) #11

-- 대/소문자 바꾸기 
sentence = 'Python is FUN!'

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

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

-- 주의할 점 
a = "3"
a + 5    # 문자열과 숫자형은 연산 불가

 

└ 인덱싱과 슬라이싱

-- 문자열 자르기(슬라이싱)
text = 'abcdefghijk'

result = text[1]   # 숫자를 0부터 셈
print(result) #b 

result = text[:3] #앞에 3개만 출력
print(result) #abc

result = text[3:] #3번째 다음(4번째)부터 출력
print(result) #defghijk

result = text[3:8] #3번째 다음(4번째)부터 8번째 글자까지 출력
print(result) #defgh

result = text[:] #그대로 복사, 처음부터 끝까지
print(result) #abcdefghijk

-- 특정 문자열로 자르기 
myemail = 'abc@sparta.co'

domain = myemail.split('@')[1].split('.')[0] #@로 자르고 2번째 문자열 > 다시 .으로 자르고 첫 번째 문자열
print(domain) #sparta

 

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

 

3) 리스트(list)와 딕셔너리 (dictionary)

- 리스트: 순서가 있는, 다른 자료형의 모임 

-- 리스트 불러오기
a_list = ['사과', '배', 2,['딸기', '감']]
print(a_list[0]) #사과
print(a_list[3][1]) #감

-- 리스트 값 및 값 출력하기
b_list = [2,5,32,40,34]
b_list.append(99) #새로운 값 추가

print(b_list[5]) #99 6번째 자리수 숫자
print(b_list[:3]) #[2, 5, 32] 앞에서 3번째까지 리스트
print(b_list[-1]) #99 -1을 넣으면 마지막 값이 나옴
print(len(b_list)) #6 리스트의 길이

-- 요소 포함 여부 알아보기 
a = [2, 1, 4, "2", 6]
print(1 in a)      # True
print("1" in a)    # False
print(0 not in a)  # True

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

 

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

a_dic = {'name':'bob', 'age':27, 'friend':['영희','철수']}
a_dic['hight'] = 180 #딕셔너리에 새로운 값 추가

print( a_dic['name'] ) #bob
print( a_dic['friend'][0] ) #영희
print( a_dic ) #{'name': 'bob', 'age': 27, 'friend': ['영희', '철수'], 'hight': 180}
print( 'hight' in a_dic ) #True​

 

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

people = [
    {'name':'bob', 'age':27},
    {'name': 'nick', 'age': 40}
]

person = {'name':'sera'}  #추가 할 값 지정
people.append(person)    #people 리스트에 값 추가

print(people) #[{'name': 'bob', 'age': 27}, {'name': 'nick', 'age': 40}, {'name': 'sera'}]
print(people[1]['name']) #nick

 

4) 조건문

- if / else /  elif 

money = 1000

if money > 3800:
    print('택시타자')
elif money > 1200:       #조건이 3개 이상일 때 사용, 중복해서 기재 가능
    print('버스타자')
else:
    print('택시 못타~')
    print('허허허')
    
#택시 못타~
#허허허 
#money= 4000이면 택시타자, money가 1500이면 버스타자 출력

---
#마지막 문장 들여쓰기가 안되어 있으면 어떤 조건이라도 '허허허' 같이 출력
if money > 3800:
    print('택시타자')
else:
    print('택시 못타~')
print('허허허')

 

5) 반복문

- for문

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}
]

for person in people:    # for <변수(원소)> in <리스트(목록)>:
    name = person['name']
    age = person['age']
    if age > 20:
        print(name, age)
        
 #결과값
carry 38
ben 27
bobby 57
red 32
queen 25

 

- for문 enumerate, break

└ enumerate: 인덱스와 변수로 이루어진 튜플(tuple)을 생성. 리스트 속 값을 풀어주는 역할(unpacking)

fruits = ['사과', '배', '감', '귤','귤','수박','참외','감자','배','홍시','참외','오렌지']

for i, fruit in enumerate(fruits): #enumerate는 리스트 속 과일을 unpacking하여 넘버링
    print(i, fruit)
    if i == 3:
        break     #print 절 뒤에 넣음

 

- 연습문제 

num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]

#짝수 출력하기

for even in num_list:
    if even % 2 == 0:
        print(even)  # 2 / 6 / 2 / 4 / 6 / 2 / 4
        
#짝수가 몇 개인지 출력하기
count = 0  #개수를 세기 위한 변수 추가
for even in num_list:
    if even % 2 == 0 :
        count = count + 1 #if문 조건(짝수)이 나올 때마다 count에 1 추가 / count += 1 도 동일한 의미
print(count)  #if절 안에 넣으면 count 숫자가 반복되어 나오므로, 들여쓰기 없애고 출력 

#리스트 안에 있는 모든 숫자 더하기
sum = 0
for num in num_list:
    sum = sum + num #같은 표현 sum += num
print(sum)

#리스트 안에 있는 자연수 중 가장 큰 숫자 구하기
max = 0
for num in num_list:
    if max < num:  #num이 max 보다 크면?
        max = num   #max에 num 값을 넣어줘. 0 < 1 이면, max=1, 1 < 2 이면, max = 2.. 반복 
print(max)

 

6) 함수

: 프로그래밍에서 함수는 같은 동작을 반복하는 것. 즉 반복적으로 사용하는 코드에 이름을 붙여놓은 것

def hello():    #hello라는 함수를 저장 
    print('안녕!')
    print('좋은날이군')

hello()        #hello 실행하면, [안녕!/ 좋은날이군] 출력

----
def bus_rate(age):   #bus_rate 라는 함수를 저장
    if age > 65:
        print('무료입니다')
    elif age > 20:
        print('성인입니다')
    else:
        print('기타입니다')

bus_rate(30) #성인입니다
bus_rate(5) #기타입니다
bus_rate(70) #무료입니다

- 연습문제

#주민등록번호를 입력받아 성별을 출력하는 함수 만들기
def check_gender(pin):
    check_num = pin.split('-')[1][0]   #순서는 [1][:1]로 표기도 가능
    if int(check_num) % 2 == 0:
        print('여성')
    else:
        print('남성')
        
my_pin = check_gender('200101-3012345')
my_pin = check_gender('200101-4012345')
my_pin = check_gender('200101-2012345')
print(my_pin)

 

 

2. 파이썬 문법 뽀개기(심화)

1) 듀플과 집합

- 듀플(tuple): '리스트와 비슷하지만 불변'인 자료형. 순서 존재

a = (1,2,3)
a[0] = 99 # 1 > 99로 변경 명령
print(a[0]) #error 듀플은 목록 변경 불가해서 

#듀플은 언제 쓰는가? 
#딕셔너리 대신 리스트와 튜플로 딕셔너리 '비슷하게' 만들어 사용해야 할 때
a_dict = [('bob','24'),('john','29'),('smith','30')]

 

- 집합: 말 그대로 '집합'을 구현하는 방법. 중복 제거됨

a = ['사과', '감', '배','수박', '오렌지']
b = ['사과','멜론','청포도','복숭아','참외']

a_set = set(a)
b_set = set(b) 

print(a_set & b_set) #{'사과'} #교집합
print(a_set | b_set) #{'복숭아', '멜론', '청포도', '오렌지', '참외', '배', '감', '수박', '사과'} 
                     #합집합 중복제거
print(a_set - b_set) #{'수박', '오렌지', '배', '감'} #차집합

 

2) f-string (★)

- 변수를 중간에 넣어서, 직관적인 문자열을 만들 때 사용  

- f + ' (홑따옴표) + 문자 + {변수} + 문자 +  ' (홑따옴표)같이 사용  ex. print(f'{name}의 점수는 {score}점입니다.')

scores = [
    {'name':'영수','score':70},
    {'name':'영희','score':65},
    {'name':'기찬','score':75},
]

for s in scores:
    name = s['name']
    score = str(s['score']) #숫자를 문자열로 변경 
    print(name + '의 점수는 '+score+'점입니다.') #문자열 + 문자열 결합 & 중간 삽입 문구는 좌우측에 + 처리
	print(f'{name}의 점수는 {score}점입니다.') #f-string 10열 작성 내용과 동일한 결과 추출								
                                    #영수의 점수는 70점입니다.
                                    #영희의 점수는 65점입니다.
                                    #기찬의 점수는 75점입니다.

 

3) 예외 처리

: 에러가 있으면, 건너뛰고 계속 추출 할 수 있게 할 수 있는 방법

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:
    try:                            #30세를 초과하면, 사람 이름을 출력해  
        if person['age'] > 30:     
            print (person['name'])
    except:                         #에러가 발생하면, '(사람이름)에서 에러 발생'을 출력해 
        name = person['name']
        print(f'{name}에서 에러 발생')  #f-string
        
#carry
#bobby에서 에러 발생
#red

 

4) 파일 불러오기 

#main_func.py 파일에 함수 저장
def say_hi():
	print('안녕!')

#새로운 파일에서 [main_func.py] 파일 불러오면, 해당 파일의 함수 사용 가능! 
from main_func import *   -- 다 가져오고 싶지 않으면 * 대신 함수명 기입 
say_hi() #안녕!

 

5) 한줄의 마법

- if문: 삼항연산자

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


num = 3
result = ('짝수' if num % 2 == 0 else '홀수') #if문을 한 줄로 표현 가능
print(f'{num}은 {result}입니다.')  #3은 홀수입니다.

- for문: 한방에 써버리기

#각 리스트 값에 2를 곱해야 한다면?
a_list  = [1, 3, 2, 5, 1, 2]

b_list = []              #비어있는 리스트 b_list 선언
for a in a_list:
    b_list.append(a*2)   #b_list에 a*2 한 값을 반복해서 추가해라
print(b_list)        #[2, 6, 4, 10, 2, 4]

#한 줄로 줄이기
a_list  = [1, 3, 2, 5, 1, 2]
b_list = [a*2 for a in list] #for문 축약 - a*2를 반복해서 b_list를 만들어라
print(b_list)

 

6) map, filter, lambda식

- map: 리스트에서 원소를 하나씩 꺼내서 함수를 적용시킨 다음, 그 결과를 새로운 리스트에 담아줌 (리스트랑 병기) 

 └ ① a = map(함수, 리스트) / print(list(a)) ② a= list(map(함수, 리스트)) / print(a) 두 가지 중 하나 형식으로 작성

- lambda:  함수를 딱 한 줄로 표현 가능하도록 해주는 식 

 └ lambda 매개변수 : 표현식 / 매개 변수는 표현식이다는 의미 

 

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}
]

#1 함수 생성
def check_adult(person):
    if person['age'] >= 20:
        return '성인'
    else:
        return '청소년'  #return('성인' if person['age'] >= 20 else '청소년')으로 축약 가능 

#2 map으로 출력  
result = map(check_adult, people)  #people을 하나 하나 돌면서 check_adult에 넣어라
print(list(result))                #list로 안 묶어주면 값이 안뜸


#1-2 lambda 식 활용 시 함수 + 맵을 한 줄로 가능  
result = map(lambda person: ('성인' if person['age'] >= 20 else '청소년'), people)

#결과는 동일
#['성인', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']

 

- filter:  리스트의 모든 원소 중 특별한 것, True인 것들만 뽑아주는 것

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

#[{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38},
#{'name': 'ben', 'age': 27}, {'name': 'bobby', 'age': 57},
#{'name': 'red', 'age': 32}, {'name': 'queen', 'age': 25}]

 

7) 함수 심화

- *args: arguments의 약어. 여러 개 인수를 하나의 매개변수로 받을 때 args를 관례적으로 사용.

└ 함수가 몇 개의 인자를 받아야 할지 정할 수 없을 때 사용. 2개면 def cal(a, b), 모르면 def cal(*args)

└ *(별)이 여러 개 인자를 묶어서 하나의 듀플로 묶어주고 args에 할당? 

- **kwargs: keyword arguments의 약어. 알 수 없는 숫자만큼의 키워드를 매개변수로 받고 싶을 때 사용

 **(별별)이 여러 키워드를 묶어서 딕셔너리 형태로 만들어 주는 것  

- *args와 **kwargs 둘 다 쓰여 있다면? 

 : *args 에 매개변수를 듀플로 먼저 먹고, 그 다음 **kwargs로 키워드 변수는 딕셔너리로 먹음 (**kwargs는 먼저 사용 불가)

#매개변수 값 지정
def cal(a, b):
    return a+2*b

print(cal(1,2)) #5
print(cal(2,1)) #4
print(cal(b=2, a=1)) #5 #변수 지정시 순서 상관 없음
print(cal(a=1, b=2)) #5 #변수 지정시 순서 상관 없음

def cal(a, b=2):
    return a+2*b

print(cal(1)) #5 #안 넣으면 기본값으로 고정
print(cal(a=1)) #5 #안 넣으면 기본값으로 고정
print(cal(1,6)) #13 #값을 넣으면 새로운 값으로 계산
print(cal(a=1, b=4)) #9 #값을 넣으면 새로운 값으로 계산

#*args
def cal(*args): #함수 내 인자 무제한으로 받을 수 있음
    for name in args:
        print(f'{name} 밥먹어라~')

cal('영희','미희', '지희')
#영희 밥먹어라~ / 미희 밥먹어라~ / 지희 밥먹어라~

#**kwargs 
def cal(**kwargs): #{'키워드': '특정값'} 딕셔너리 형태로 호출하는 것 
    print(kwargs)

 

8) 클래스 (class)  

- 클래스는 똑같은 쿠키를 만들어낼 수 있는 일종의 쿠키틀로, 클래스로 만들어낸 쿠키를 객체 (object)라고 함

- 클래스로 만들어진 객체는 고유한 성격을 가지며, 다른 객체끼리 서로 영향을 주지 않음 

class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        if self.hp < 0:        #hp가 0보다 작아지면
            self.alive = False   #alive를 False로 바꿔줘

    def status_check(self):
        if self.alive == True:
            print('살았다')
        else:
            print('죽었다')

m1 = Monster()
m1.damage(150)
m1.status_check()  #죽었다

m2 = Monster()
m2.damage(80)
m2.status_check() #살았다

파이썬 즉석 세션 (by 임정 튜터) 2024-01-05

 

0) 참고 문헌

점프 투 파이썬 https://wikidocs.net/book/1

파이썬 docs https://docs.python.org/ko/3/

 

1) 메모 

- if 절 조건문은 True or False가 나오도록 지정하는 것. 

- : (콜론)은 조건절 등 문구 끝났고, 이제 수행절 쓸게 라는 의미

- 들여쓰기는 반복문, 함수, 조건절에 주로 사용됨. 들여쓰기 된 절이 위의 절에 속했다는 의미(한 묶음이야~) 

- def = definition의 약자로, def 뒤 함수명은 아무거나 써도 되지만, 내장함수는 이미 있는 거라 피해서 기입 

- print는 출력해라는 의미로 말 그대로 결과값을 표기. 안쓰면 결과값에 안 보임 

- return은 함수 조건을 저장하는것. 안 쓰면 return none 으로 저장됨

- while 반복문의 일종으로, 끝 없이 반복하다가 특정 조건을 만나면 멈추는 것

 경우에 따라 컴퓨터가 멈출 수도 있어서 가급적이면 for문으로 유한한 조건을 걸어주는 것이 좋음 

- PEP 코드 수정을 권유하는 것. 일종의 맞춤법 검사 같은 거

- 함수의 특징: ① 함수명이 있고, ② 파라미터는 있거나 없어도 되고, ③ 특정한 기능이 있고 ④ return으로 거의 마무리 

- 반복문 업그레이드 break, continue, pass