[221121] 파이썬 기초 문법

경진·2022년 11월 21일
0

내일배움캠프

목록 보기
6/10

1. 파이썬 문법 [기초]

(1) 변수 선언과 자료형

1) 변수 선언

  • 변수 만들기 : 변수이름 = 값
  • a = bb = a는 다르다
  • 출력은 print()사용
a = 3
print (a) # 3 출력

2) 숫자의 자료형

  • + : 덧셈
  • - : 뺄셈
  • * : 곱셈
  • / : 나눗셈
  • // : 몫
  • % : 나머지
  • ** : 거듭제곱
a = 7
b = 2

a+b   # 9 
a-b   # 5
a*b   # 14
a/b   # 3.5

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

3) Bool(Boolean) 자료형

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

4) 예제

  • 숫자들의 평균 구하기
{주어진 값}
a = 24
b = 16
c = 26


{A. 풀이}
print((a+b+c)/3)


(2) 문자열 다루기

1) 문자열 기초

  • '문자'사용 - 문자열 데이터
# 작은 따옴표 또는 큰 따옴표. 둘 다 같다.

a = "aa"
b = 'aa'
# 따옴표로 감싸지 않으면 변수이름을 뜻할 수 있어 구분해서 사용할 것.

a = 1
b = "a"
c = a

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

2) 문자열 연산

  • 문자열 간 +는 두 문자열을 이어주는 역할
a = "Merry"
b = "Christmas"

print(a+b) # MerryChristmas
print(a+' '+b) # Merry Christmas


a = "2"
b = "7"
print(a+b) # 27
  • 문자열 + 정수 = Error
a = "3"
a + 5    # 문자열과 숫자형은 더할 수 없어서 에러!
  • 문자열 길이 구하기 len()
print(len("abcde"))           # 5
print(len("Hello, Sparta!"))  # 14
print(len("안녕하세요."))      # 6
  • 모든 알파벳 대문자/소문자 바꾸기 .upper() / .lower()
sentence = 'No pain, No gain'

print(sentence.upper())  # NO PAIN, NO GAIN
print(sentence.lower())  # no pain, no gain
  • 특정 문자를 기준으로 문자열 나누기 .split()
# 이메일 주소에서 도메인 'gmail'만 추출하기
myemail = 'solrasido@gmail.com'

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

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

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

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

# 한 줄로 한 번에!
myemail.split('@')[1].split('.')[0] # gmail
  • 특정 문자를 다른 문자로 바꾸기
txt = '서울특별시-양천구-목동'
print(txt.replace('-', '>')) # '서울특별시>양천구>목동'

3) 인덱싱과 슬라이싱

  • 인덱싱 : 문자열에서 한 글자 씩 부를 때 몇 번째인지 '인덱스'를 넣어 일부를 따로 떼어 부를 때 사용
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  처음부터 끝까지

4) 예제

  • 문자열의 앞의 반만 출력하기 - sparta의 앞글자 3개 출력하기
{A. 풀이}
word = "sparta"
print(word[:3]) # spa
  • 전화번호의 지역번호 출력하기
{주어진 값}
phone = "02-123-1234"


{A. 풀이}
print(phone.split('-')[0]) # 02 출력


(3) 리스트와 딕셔너리

1) 리스트(list)

  • 순서가 있는 자료형들의 모임
a = [1, 5, 2]				# [1, 5, 2]
b = [3, "a", 6, 1]			# [3, "a", 6, 1]
c = []						# []
d = list()					# []
e = [1, 2, 4, [2, 3, 4]]	# [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
  • 덧붙이기 .append()
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]  # a = a + [2, 7]
print(a)     # [1, 2, 3, 5, [1, 2], 2, 7]
  • 정렬하기 .sort()
a = [2, 5, 3]
a.sort()
print(a)   # [2, 3, 5]
a.sort(reverse=True)
print(a)   # [5, 3, 2]
  • 요소가 리스트 안에 있는지 확인하기
# 있는지 확인 'in', 없는지 확인 'not in'

a = [2, 1, 4, "2", 6]
print(1 in a)      # True
print("1" in a)    # False
print(0 not in a)  # True

2) 딕셔너리 (dictionary)

  • key: value로 이루어진 자료의 모임
person = {"name":"Solrasido", "age": 27}
print(person["name"]) # Solrasido
  • 딕셔너리를 만드는 방법
a = {"one":1, "two":2}

# 빈 딕셔너리 만들기
a = {}
a = dict()
  • 딕셔너리 요소에는 순서가 없기 때문에 인덱싱 불가
person = {"name":"Solrasido", "age": 27}
print(person[0])   # 0이라는 key가 없으므로 KeyError 발생!
  • 딕셔너리 값 업데이트 및 새로운 자료 넣기
person = {"name":"Solrasido", "age": 27}

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

person["height"] = 177.2
print(person)  # {'name': 'Robert', 'age': 27, 'height': 177.2}
  • 딕셔너리 값에는 아무 자료형이나 사용 가능 (딕셔너리 안에 다른 딕셔너리 가능)
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
  • 딕셔너리 안에 해당 key가 존재하는지 여부 알아보기 - in
person = {"name":"Solrasido", "age": 27}

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

3) 리스트와 딕셔너리 혼합

  • 딕셔너리는 리스트 안에 쓰여 자료를 정리하는데 사용함
people = [{'name': 'solrasido', 'age': 27}, {'name': 'carry', 'age': 38}]

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

person = {'name': 'john', 'age': 7}
people.append(person) #요소 삽입

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

4) 예제

  • 딕셔너리에서 원하는 정보 찾기 - smith의 science점수를 출력해라
{주어진 값}
people = [
    {'name': 'bob', 'age': 20, 'score':{'math':90,'science':70}},
    {'name': 'carry', 'age': 38, 'score':{'math':40,'science':72}},
    {'name': 'smith', 'age': 28, 'score':{'math':80,'science':90}},
    {'name': 'john', 'age': 34, 'score':{'math':75,'science':100}}
]


{A. 풀이}
print(people[3]['score']['science']) # 90


(4) 조건문

1) if 문

  • 조건을 만족(True)했을 때만 특정 코드를 실행하는 문법
money = 5000
if money > 3800: # True
	print("택시 타자!")
    
 # 파이썬에서는 포함된 구문을 들여쓰기로 구분하기 때문에 들여쓰기 확인

2) else와 elif

  • else는 조건이 False일때 실행되는 문법
money = 2000
if money > 3800: # True
    print("택시 타자!")
else: # False
    print("걸어가자...")
  • elif는 다양한 조건을 판단할 때 사용
age = 27
if age < 20:
    print("청소년입니다.")
elif age < 65:
    print("성인입니다.")
else:
    print("무료로 이용하세요!")


(5) 반복문

1) for 문

  • 0 ~ 9 까지 출력
{1. print를 통한 출력}
print(0)
print(1)
print(2)
...
print(9)


{2. for문을 통한 출력}
for i in range(10):
print(i)
  • 리스트 출력하기
fruits = ['사과', '배', '감', '귤']

for fruit in fruits:
    print(fruit)

2) for 문 - enumerate, break

  • enumerate : 리스트 앞에 인덱스를 붙여줌 (0 부터 시작)
fruits = ['사과', '배', '감', '귤','귤','수박','참외','감자','배','홍시','참외','오렌지']

for i, fruit in enumerate(fruits):
    print(i,fruit)
    
    
# 결과
0 사과
1 배
2 감
3 귤
...
11 오렌지
  • break : 특정 조건이 만족되면 종료
fruits = ['사과', '배', '감', '귤','귤','수박','참외','감자','배','홍시','참외','오렌지']

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

3) 예제

  • 리스트에서 짝수만 출력하는 함수 만들기
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]


{A. 풀이}
for num in num_list:
	if num  % 2 == 0:
    print(num)
  • 리스트에서 짝수의 개수를 출력하기
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]


{A. 풀이}
count = 0

for num in num_list:
    if num % 2 == 0:
        count += 1

print(count)
  • 리스트 안에 있는 모든 숫자 더하기
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]


{A. 풀이}
result = 0

for num in num_list:
	result += num

print(result)
  • 리스트 안에 있는 자연수 중 가장 큰 숫자 구하기
{주어진 값}
num_list = [1, 2, 3, 6, 3, 2, 4, 5, 6, 2, 4]


{A. 풀이}
max_value = 0

for num in num_list:
    if num > max_value:
			 max_value = num

print(max_value)


(6) 함수

1) 기본 사용 방법

  • 함수는 반복적으로 사용하는 코드에 이름을 붙여놓은 것
def hello():
	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) # 무료로 이용하세요

2) 예제

  • 주민등록번호를 입력 받아 성별을 출력하는 함수 만들기
{A. 풀이}
def check_gender(pin):
    num = int(pin.split('-')[1][0])
    if num % 2 == 0:
        print('여성')
    else:
        print('남성')

my_pin = "221121-1012345"
check_gender(my_pin)



2. 파이썬 문법 [심화]

(1) 튜플, 집합

1) 튜플(Tuple)

  • 리스트와 비슷하지만 불변인 자료형. 순서 존재
a = (1,2,3)

print(a[0])
  • 작업 불가 예시
a = (1,2,3)
a[0] = 99
  • 딕셔너리 대신 리스트와 튜플로 비슷하게 만들어 사용 할 때 쓰임
a_dict = [('bob','24'),('john','29'),('smith','30')]

2) 집합(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 = ['사과','감','수박','참외','딸기']
b = ['사과','멜론','청포도','토마토','참외']

print(a & b)  # 교집합
print(a | b)  # 합집합
print(a - b)  # 차집합

3) 예제

  • A가 들은 수업 중, B가 듣지 않은 수업을 찾아보기
{주어진 값}
student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']


{A. 풀이}
set_a = set(student_a)
set_b = set(student_b)

print(set_a-set_b)


(2) f-string

  • 변수로 더 직관적인 문자열 만들기 (python 3.6버전 이상 가능)
{주어진 값}
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(name+'는 '+score+'점 입니다')
  • f-string 이용하기
for s in scores:
    name = s['name']
    score = str(s['score'])
    print(f'{name}은 {score}점입니다')


(3) 예외처리 (try-except)

1) 예제

  • 20세 보다 큰 사람만 출력
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:
    if person['age'] > 20:
        print (person['name'])
  • bobbyage를 가지고 있지 않은 경우 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'},				# 에러 문장: age 없음
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

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


(4) 파일 불러오기

  • main_test.py
from main_func import *

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


(5) 한줄의 마법

1) if 문 - 삼항연산자

  • 일반 if 문
num = 3

if num%2 == 0:
    result = "짝수"
else:
    result = "홀수"

print(f"{num}은 {result}입니다.")
  • 삼항연산자
num = 3

result = "짝수" if num%2 == 0 else "홀수"

print(f"{num}은 {result}입니다.")


# 사용 방법 : (참일 때 값) if (조건) else (거짓일 때 값)

2) for 문 - 한번에 쓰기

  • a_list의 각 요소에 2를 곱한 새로운 리스트 생성
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  = [1, 3, 2, 5, 1, 2]

b_list = [a*2 for a in a_list]

print(b_list)


(6) map, filter, lambda식

1) 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}
]
  • 1차 조작
def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'

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

result = map(check_adult, people)
print(list(result))
  • 3차 조작(lambda식)
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
  • 결과
['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']
  • lambda
# 사용방법
lambda 매개변수 : 표현식

# 예시
{일반식}
def hap(x, y):
return x + y

hap(10, 20) 	# 30


{lambda식}
(lambda x,y: x + y)(10, 20)		# 30

2) filter - 리스트의 모든 원소 중 특별한 것만 뽑기

  • 주어진 값
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}
]
  • map과 아주 유사한데, True인 것들만 뽑기(lambda식)
result = filter(lambda x: x['age'] > 20, people)
print(list(result))
  • 결과
[
    {'name': 'carry', 'age': 38},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]


(7) 함수 심화

1) 함수의 매개변수

  • 함수에 인수를 넣을 때, 어떤 매개변수에 어떤 값을 넣을지 정할 수 있다. (순서 상관 없음)
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 cal2(a, b=3):
    return a + 2 * b

print(cal2(4))			# 10 (2+2*4)
print(cal2(4, 2))		# 8  (4+2*2)
print(cal2(a=6))		# 12 (6+2*3)
print(cal2(a=1, b=7))	# 15 (1+2*7)
  • 입력 값의 개수를 지정하지 않고 모두 받는 방법
    • 여러 개의 인수를 하나의 매개변수로 받을 때 *args 사용
def call_names(*args):
    for name in args:
        print(f'{name}야 밥먹어라~')

call_names('철수','영수','희재')


# 결과
철수야 밥먹어라~
영수야 밥먹어라~
희재야 밥먹어라~
  • 키워드 인수를 여러 개 받는 방법 **kwargs (keyword arguments)
def get_kwargs(**kwargs):
    print(kwargs)

get_kwargs(name='bob')
get_kwargs(name='john', age='27')


# 결과
{'name': 'bob'}
{'name': 'john', 'age': '27'}


(8) 클래스(Class)

  • 사용 시기
    • 게임 내에서 많은 몬스터들의 HP를 관리 해야하는 상황
      • 방법 1 -> 리스트의 순서를 잘 지켜서 각 몬스터들의 hp를 잘 적어둔다
      • 방법 2 -> 몬스터마다 각자의 hp를 가질 수 있게 한다. (클래스 사용)
  • 방법 2
class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        if self.hp < 0:
            self.alive = False

    def status_check(self):
        if self.alive:
            print('살아있다')
        else:
            print('죽었다')

m = Monster()
m.damage(120)

m2 = Monster()
m2.damage(90)

m.status_check()	# 죽었다
m2.status_check()	# 살아있다
profile
항상 처음 세웠던 목표 처럼

0개의 댓글