Python 기초

장현웅·2023년 8월 2일
0

HTML(뼈대), CSS(꾸미기) , Javascript(움직이기)를 만들어놔도 누군가가 요청했을 때 그것을 전달하는 역할을 하는 것이 '서버'이다. Python이라고 하는 프로그래밍 언어로 서버를 만들어 볼 것이다.


출처 : 스파르타코딩클럽

JavaScript는 중괄호를 사용하는 반면 Python 언어는 들여 쓰기를 사용한다.

Python은 Javascript의 'console.log'처럼 출력하는 'print()'가 있다.

print('hello world') # hello world
print('hi') # hi

변수

Python은 변수 선언이 따로 없다.

  • 그냥 아무 변수에 값을 넣어주면 된다. 페이지에 출력할 때는 코드에 print()함수를 쓴다.
a = 2
print(a) # 2
  • 콘솔에 출력할 때는 print() 함수를 쓰지 않고 변수 이름만 적고 실행해도 값이 변수에 저장된다.
a = 2
a # 2
  • 변수는 다른 값으로 선언이 가능하다.
a = 3
a = a + 1
print(a) # 4
  • 다른 변수에 들어가 있는 값을 새 변수에 넣을 수 있다.
a = 3
a = a + 1
b = a
print(a,b) # 4 4 (여러 값을 한번에 출력할 수 있다.)
c = a*b
print(a,b,c) # 4 4 16

자료형과 기본 연산

자료형은 변수에 저장할 수 있는 값과 그 형태를 말한다.

1. 숫자 자료형

  • Javascript와 마찬가지로 숫자를 값으로 가질 수 있고, 정수, 실수 모두 가능하다.
a = 3.1
b = 2
  • 숫자 자료형 간에는 사칙연산이 가능하다.
a = 3.1
b = 2

print(a+b) # 5.1
print(a-b) # 1.1
print(a*b) # 6.2
print(a/b) # 1.55
print(a//b) # 1 (몫)
print(a%b) # 1.1 (나머지) 
print(a**b) # 9.61 (거듭제곱)
print(a+2*b) # 7.1 (여러 연산을 한 줄에 할 경우 사칙연산의 순서를 따른다.)
  • 복합 대입 연산자(+=, -=, *=, /= 등)는 있지만 증감연산자(++, -- 등)은 없다.
a = 2
a = a + 2
-> a += 2 (a에 2를 더한 a+2를 a에 저장)

print(a) # 4

2. 문자열

따옴표로 감싸면 문자로 취급되어 문자열 자료로 정의된다.

a = '대한'
b = '민국'

print(a+b) # 대한민국
(문자형 자료인 값을 이어붙인 문자열을 출력)

print(a+' '+b) # 대한 민국 
(띄어쓰기도 따옴표로 문자형 자료라고 정의했기 때문에 문자열 자료로 출력된다.)
a = 1
b = 'a'
c = a

print(a, b, c) # 1 a(변수 a가 아니라 문자열 a) 1
(따옴표로 감싸지 않으면 문자형 자료로 인식하지 않고 다른 변수(변수명)으로 인식한다.)

d = x
d = "x" # NameError: name 'x' is not defined
(x라는 변수가 정의되지 않았기 때문에 에러메시지가 나온다.)
a = '3'
b = '5'
print(a+b) # 35
(문자형 자료 간의 덧셈이기 때문에 앞뒤로 이어붙인 문자열이 반환된다.)
a = 7
b = '3'
print(a+b) # TypeError: unsupported operand type(s) for +: 'int' and 'str'
(Javascript는 문자형 자료와 숫자형 자료를 더하면 숫자를 문자열로 바꾼 후 더해주지만 Python은 숫자형 자료와 문자형 자료는 연산이 불가하다.)

a = str(7) # 문자열을 출력해줌.
b = '3'
print(a+b) # 73
a = '3'
print(a*5) # 33333
(a의 자료가 문자형이기 때문에 3이 5번 반복되는 문자열이 반환된다.)
  • 문자열에 적용할 수 있는 처리
1) 문자열 연결 연산(문자열 + 문자열)
a = '안녕'
b = '하세요'
print(a+b) # 안녕하세요

2) 문자 선택 연산 (문자열[index] : 인덱싱)
a = '안녕'
b = '하세요'
print(a+b[0]) # 안녕하

3) 문자열의 길이 (len())
a = '안녕'
b = '하세요'
print(len(a+b[0])) # 3

4) 문자열의 일부 잘라내기 (슬라이싱)
f="abcdefghijklmnopqrstuvwxyz"

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  처음부터 끝까지

5) 특정 문자열로 자르기 (split('문자열'))
# 이메일 주소에서 도메인 'gmail'만 추출하기
myemail = 'test@gmail.com'

result = myemail.split('@') # ['test','gmail.com'] (뒤에 배울 '리스트'라는 자료형이에요 :)) 
							# '@'를 기준으로 두 개가 되었으니 myemail은 리스트가 됨

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

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

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

myemail = 'abc@sparta.co'

# 한 줄로 한 번에!
domain = myemail.split('@')[1].split('.')[0]
print(domain) # ['sparta', 'co']

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

3. 리스트와 딕셔너리

Python의 리스트와 딕셔너리는 Javascript와 비슷하다.

3-1) 리스트 (순서가 중요한/있는 다른 자료형들의 모임)

a_list = []
빈 리스트를 선언하고 나중에 값을 지정해줘도 된다.
변수 이름은 아무거나 가능하고 자료값이 리스트형일 경우 '[]'를 쓴다.
  • 서로 다른 자료형의 요소를 섞어서 가질 수 있다.
b_list=[1,2,'사과',3,False]

print(b_list[0]) # 1
print(b_list[2]) # 사과
print(b_list) # [1, 2, '사과', 3, False]
  • 리스트에 요소 넣기(.append())
b_list.append(4)
print(b_list) # [1, 2, '사과', 3, 4]

b_list.append([5,6])
print(b_list) # [1, 2, '사과', 3, 4, [5,6]]
(리스트형 자료를 요소로 넣을 수 있다.)
  • 리스트의 길이 구하기(len())
b_list = [1, 2, '사과', 3, 4, [5,6]]
(리스트형 자료를 요소로 가질 수 있다.)

print(len(b_list)) # 6
print(b_list[5]) # [5,6]
print(b_list[5][1]) # 6

c_list = [7,8,9]
b_list.append(c_list)

print(b_list) // [1, 2, '사과', 3, 4, [5, 6], [7, 8, 9]]
print(len(b_list)) # 7
  • 순서가 있기 때문에, 문자열에서처럼 인덱싱과 슬라이싱 사용 가능
a = [1, 3, 2, 4]
print(a[3])  # 4
print(a[1:3]) # [3, 2]
print(a[-1]) # 4 (맨 마지막 것)
print(a[-2]) # 2
  • 정렬하기
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

3-2) 딕셔너리 (순서가 따로 없어서 인덱싱을 사용할 수 없음. 다만 요소가 여러 개로 리스트형으로 표현될 경우에는 가능하다.)

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
  • 딕셔너리 안에 해당 키가 존재하는지 알고 싶을 때
person = {"name":"Bob", "age": 21}

result = ('height' in a_dict)

print(result) # False
  • 딕셔너리 리스트 새로운 값 넣기
b_dict = [
	{'name':'영수','age':27},
	{'name':'철수','age':15},
	{'name':'영희','age':20}
]

print(b_dict[0]['name']) # 영수
print(b_dict[1]['age']) # 15

b_dict[1]['age'] = 25
print(b_dict[1]['age']) # 25
변수이기 때문에 언제든 값을 변경할 수 있다.
  • 딕셔너리 리스트에 key:value 값 넣기
b_dict[0]['height'] = 170
print(b_dict) // [{'name': '영수', 'age': 27, 'height': 170}, 
				  {'name': '철수', 'age': 15}, 
				  {'name': '영희', 'age': 20}]
                  
c_dict = {'name': '미래', 'age': 22, 'height': 165}
b_dict.append(c_dict)
print(b_dict) // [{'name': '영수', 'age': 27, 'height': 170}, 
				  {'name': '철수', 'age': 15}, 
				  {'name': '영희', 'age': 20},
                  {'name': '미래', 'age': 22, 'height': 165}]

print(b_dict[3]['name']) # 미래
  • 딕셔너리 리스트에서 원하는 정보 찾기
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}}
]

smith의 science 점수 
# print(people[2]['score']['science'])
  • 딕셔너리의 길이 구하기(len())
print(len(b_dict)) # 4

4. Bool(참/거짓을 나타냄)

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 같다
a = 4 > 2  # True
not a      # False    
4 != 7     # True  같지 않다 // !, NOT 연산자 참을 거짓으로, 거짓을 참으로 바꿔준다.
a and b    # False  (&& 아님)  AND 연산자로 모두 참이어야 참을 반환한다. 
a or b     # True  (|| 아님)   OR 연산자로 둘 중 하나만 참이면 참이다.

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

age = 25

if age > 20:
	print("성인입니다")
else:
	print("청소년입니다")

# 성인입니다 (age 변수의 값에 따라서 print되는 값이 달라진다.)

money = 5000
if money > 3800: # 조건에는 불 자료형이 들어간다. money > 3800은 True
    print("택시 타자!")

# 택시 타자!
  • 함수 verson
def person(age) :
	if age > 20:
		print("성인입니다")
	else:
		print("청소년입니다")

person(15) # 청소년입니다
  • else if는 elif로 줄여쓴다.
def person(age) :
	if age > 20:
		print("성인입니다") 
	elif age >= 13:
		print("청소년입니다")  
    else:
        print("어린이입니다")

person(10) # 어린이입니다

money = 400
if money > 3800:
    print("택시 타자!")
elif money > 1200:
	print('버스를 타자!')
elif money > 600:
	print('물 사먹고 걸어가자')
else:
    print("그냥 걸어가자...")
print("그럼 뭘 타지?") # 어디까지 구문에 포함되는지를 들여쓰기로 구분한다. print("그럼 뭘 타지?")는 이 조건문에 포함되지 않기 때문에 어쨌든 출력된다.

# 그냥 걸어가자... 그럼 뭘 타지? 

반복문

반복할 것이 있고 리스트의 요소들을 하나씩 빼서 실행하는 것

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

for fruit in fruits:
	print(fruit)

# 사과
# 배
# 감
# 귤
ages = [5,10,13,23,25,9] 

for a in ages # ages의 리스트에서 요소를 하나씩 가져와서 a에 넣고 그 a를 밑에서 갖다 쓰자.
 	if a>20:
    	print("성인입니다") # 자동으로 들여쓰기가 더 들어감 = 위의 내용물이다.
 	else:
 		print("청소년입니다")

# 청소년입니다
# 청소년입니다
# 청소년입니다
# 성인입니다
# 성인입니다
# 청소년입니다
people = [{'name': '영수', 'age': 27}, 
		  {'name': '철수', 'age': 15}, 
		  {'name': '영희', 'age': 20},
          {'name': '미래', 'age': 22}]

for person in people :
	name = person['name']
    age = person['age']
		print(name,age)
# 영수 27 철수 15 영희 20 미래 22

for person in people:
    if person['age'] > 20:
        print(person['name'])
# 영수 미래
  • 함수 version
과일 수 세기

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

def how_many(a):
	count = 0
	for fruit in fruits:
		if fruit == a:
			count += 1
	return count

print(how_many('사과')) # 4
사람 나이 출력

people = [{'name': '영수', 'age': 27}, 
		  {'name': '철수', 'age': 15}, 
		  {'name': '영희', 'age': 20},
          {'name': '미래', 'age': 22}]

def my_age(a):
	for person in people:
    	if person['name'] == a:
        	return person['age']

print(my_age('영희')) # 20
print(my_age('서현')) # None
  • for문 - enumerate, break
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 i, person in enumerate(people) :
	name = person['name']
    age = person['age']
	print(i,name,age)
	if i > 5: # 5개만 출력하기 (i == 4) i는 0부터 시작
    	break

example 1) 리스트에서 짝수만 출력하는 함수 만들기

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

for num in num_list:
	if num % 2 == 0:
    	print(num)

example 2) 리스트에서 짝수의 개수를 출력하기

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

count = 0

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

print(count)

example 3) 리스트 안에 있는 모든 숫자 더하기

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

sum = 0

for num in num_list:
	sum = sum + num (sum += num)
    
print(sum)

example 4) 리스트 안에 있는 자연수 중 가장 큰 숫자 구하기

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

max = 0

for num in num_list:
	if max < num:
    	max = num

print(max)

max = num_list[0]

for num in num_list:
	if max < num:
    	max = num
        
print(max)

함수

  • 함수의 정의 - 프로그래밍에서의 함수는 같은 동작을 하는 것 / 반복적으로 사용하는 코드들에 이름을 붙여놓은 것
def hello():
	print("안녕!")
    print("또 만나요!")


hello() 
hello()
# 안녕! 또 만나요! 안녕! 또 만나요!
- 수학
f(x) = 2*x+3
y = f(2)
y의 값은? 7

- Javascript(기본 상태가 중괄호)
function f(x) {
	return 2*x+3
}


- Python(기본 상태가 들여쓰기)
def f(x):
	return 2*x+3


return이 있으면 위 함수를 그 값으로 변신시킨다고 생각해도 무방하다.
  • 함수의 응용(def : 함수를 정의한다)
def hey():
	print("헤이")

hey() # 헤이

변수를 받는 함수

def sum(a,b,c):
	return a+b+c

result = sum(1,2,3)
print(result) # 6
def bus_rate(age):
		if age > 65:
		    print("무료입니다")
            return 0
		elif age > 20:
		    print("성인입니다.")
            return 1200
		else:
		    print("청소년입니다")
            return 700

myrate = bus_rate(age)
print(myrate)

bus_rate(27) # 성인입니다 1200
bus_rate(10) # 청소년입니다 700
bus_rate(72) # 무료입니다 0

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

example 1) 주민등록번호를 입력받아 성별을 출력하는 함수 만들기

def check_gender(pin):
    print('')

my_pin = '200101-3012345'
check_gender(my_pin)

1. '-'로 쪼갠다.
2. 쪼개면 리스트 요소 두 개로 나눠짐.
3. 두 번째 중 첫 번째 글자가 홀수면 남성 짝수면 여성
4. pin은 따옴표로 감싸진 문자열이기 때문에 숫자열로 바꿔서 조건문을 돌려야함. # 문자열을 숫자열로 바꾸는 식은 int("") # javascript와는 다르게 파이썬은 문자열과 숫자열의 연산이 불가하다.
def check_gender(pin):
    num = int(pin.split('-')[1][0]) # [1][:1]도 가능
    if num % 2 == 0:
        print('여성')
    else:
        print('남성')

my_pin = "200101-3012345"
check_gender(my_pin)

튜플 & 집합

1. 튜플

튜플()은 리스트[]와 비슷하지만 불변인 자료형. 마찬가지로 순서가 존재함.

1) 리스트

a = ['사과','감','배']

a[1] = '수박'

print(a) # ['사과','수박','배']

2) 튜플 : 리스트처럼 순서가 있는 자료형인데 불변형이다.

a = ('사과','감','배')

a[1] = '수박'

print(a) # TypeError: 'tuple' object does not support item assignment
people = [{'name':'bob','age':27},{'name':'john','age':30}]

people = [('bob',27),('john',30)] # 필요에 의해서 이렇게 쓰는 경우에는 0 번째는 무조건 이름이 오고 1 번째는 무조건 나이가 온다고 볼 수 있다.

2. 집합(set)

좋은점: 중복이 제거된다. 교집합 / 합집합 / 차집합도 구할 수 있다.

a = [1,2,3,4,3,2,3,4,5,8,7,1]

a_set = set(a)

print(a_set)

# {1,2,3,4,5,7,8}
a = ['사과','감','수박','참외','딸기']
b = ['사과','멜론','청포도','토마토','참외']

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

print(a_set & b_set)  # 교집합 {'사과','참외'}
print(a_set | b_set)  # 합집합 {'사과','감','수박','참외','딸기','멜론','청포도','토마토'}

example 1) 구글링문제 - Q. A가 들은 수업 중, B가 듣지 않은 수업을 찾아보기 (차집합)

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']

a_set = set(student_a)
b_set = set(student_b)

print(a_set - b_set) # {'물리2','국어','음악','화학1'}

f-string(f'{}) : 굉장히 자주 씀.

scores = [
    {'name':'영수','score':70},
    {'name':'영희','score':65},
    {'name':'기찬','score':75},
    {'name':'희수','score':23},
    {'name':'서경','score':99},
    {'name':'미주','score':100},
    {'name':'병태','score':32}    
]
  • 이름과 점수를 모두 출력 (for 반복문)
for ns in scores:
	name = ns['name']
    score = ns['score']
    
    print(name,score) 
# 
영수 70
영희 65
기찬 75
희수 23
서경 99
미주 100
병태 32
for ns in scores:
	name = ns['name']
    score = ns['score']
    
    print(name+'는 '+score+'점 입니다')

# TypeError: can only concatenate str (not "int") to str

# 파이썬은 문자열과 숫자열의 연산이 불가하기 때문에 score부분은 문자열로 감싸줘야한다. str()

for ns in scores:
    name = ns['name']
    score = str(ns['score'])
    print(name+'는 '+score+'점 입니다') # 여기에 '+str(score)+'도 가능

#
영수는 70점 입니다
영희는 65점 입니다
기찬는 75점 입니다
희수는 23점 입니다
서경는 99점 입니다
미주는 100점 입니다
병태는 32점 입니다
  • f-stirng을 이용하면 훨씬 간단하게 가능하다. (f'{})
for s in scores:
    name = s['name']
    score = str(s['score'])
    print(f'{name}은 {score}점입니다')

예외처리(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: # 'age'값이 하나가 없음.
        print (person['name']) 
# KeyError: 'age' 에러가 남. 
# 이럴 때 try except 구문을 이용한다.

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

# 터미널에서 에러가 있을 경우 에러메시지가 뜨는 것도 try except구문을 써서 그런게 아닌가라는 생각도 든다.

파일 불러오기

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

def say_hi_to(name):
    # print('영수님 안녕하세요')
    print(f'{name}님 안녕하세요')
  • main_test.py
from main_func import * # *은 파일명에 있는 모든 함수들을 가져옴.

say_hi()
say_hi_to('영수')

# 안녕!
# 영수님 안녕하세요!

from main_func import say_hi_to

say_hi()
say_hi_to('영수')

# NameError: name 'say_hi' is not defined

식을 한 줄로 축약하기

1) if문 - 삼항연산자

num = 3

if num%2 == 0:
	# print('짝수')
    result = '짝수'
else:
	# print('홀수')
    result = '홀수'

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

# 3은 홀수입니다

이것을 한 줄에 적는 것이 파이썬의 유일한 삼항연산자인 조건식이다.

result = ('짝수' if num % 2 == 0 else '홀수')
# '짝수'라고 해라. 만약에 num을 2로 나눈 나머지가 0이면. 그게 아니면 '홀수'라고 해라.

🙂 (참일 때 값) if (조건) else (거짓일 때 값)으로 항이 3개라 삼항 연산자이다.

2) for문 - 한방에 써버리기

a_list  = [1, 3, 2, 5, 1, 2]
# 각 요소에 *2한 리스트를 만들고 싶다.
b_list = []
for a in a_list:
    b_list.append(a*2) # a_list를 돌면서 *2한 것을 b_list에 하나씩 추가해라.

print(b_list)

# [2, 6, 4, 10, 2, 4]

이것을 한 번에 쓸 수 있는 방법

b_list = [a*2 for a in a_list]
# a를 *2를 해라. a를 돌려라. a_list에 있는. 그리고 걔들을 다 리스트로 묶어라.

map, filter, lambda식

1) map - 리스트의 모든 원소를 조작하기

  • 리스트의 요소를 지정한 함수로 처리
  • map 객체를 리턴하므로 list형태로 바꿔서 프린트해야 함.
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차 조작(map - map(함수, 리스트))
def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'

result = map(check_adult, people) # people을 하나하나 돌면서 check_adult에 넣어라.
print(result)

# <map object at 0x000001F7157B8FD0>
print(list(result))

# ['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인'] 리스트로 묶어줘야 결과값이보인다.
  • 2차 조작(반복문 축약)
def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'
# '성인'이라고 하자. 만약에 person의 'age'가 20보다 크면. 그게 아니면 '청소년'이라고 하자.

result = map(check_adult, people)
print(list(result))
  • 3차 조작 ((lambda 매개변수 : 표현식) : 함수를 하나의 식으로 표현한 것)
result = map(check_adult, people)
result = map(lambda x: x, list) 
# list를 돌면서 x에 값(x)을 넣음. lambda식은 매개변수를 보통 x로 쓴다.
result = map(lambda person: ('성인' if person['age'] > 20 else '청소년'), people)
# people을 돌면서 person에 '성인' if person['age'] > 20 else '청소년'의 값을 넣음.

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

result = filter(lambda x: x['age'] > 20, people)
# people의 요소를 하나하나 x에 넣고 그 x의 'age'값이 20보다 크면 걔들만 뽑아라.
print(list(result))

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

함수의 매개변수

1) 함수에 인수를 넣을 때, 어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있다. 순서 상관 없음!

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

result = cal(1,2)
print(result) # 5

result = cal(2,1)
print(result) # 4

result = cal(a=2, b=3)
print(result) # 8

result = cal(b=3, a=2)
print(result) # 8

# 매개변수에 직접 값을 지정해주면 순서를 맞추지 않아도 된다.

2) 특정 매개변수에 디폴트 값을 지정해줄 수 있다.

def cal(a, b=2): # b의 값을 2로 고정
    return a + 2 * b

result = cal(1) # b값을 안 넣어줬지만 디폴트값이 있어서 넣었다고 인식함.
print(result) # 5 

result = cal(1,3) # 따로 값을 넣어주지 않으면 디폴트 값이 기본값으로 적용되고 직접 넣어줬을 경우 넣어준 값으로 적용됨.
print(result) # 7 

3) 입력값의 개수를 지정하지 않고 모두 받는 방법(args : arguments)

def cal(*args): # 변수인자를 무제한으로 넣을 수 있다. 그것을 리스트로 받아서 쓸 수 있다.
	for name in args:
        print(f'{name}야 밥먹어라~')

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

#
철수야 밥먹어라~
영수야 밥먹어라~
희재야 밥먹어라~

4) 키워드 인수를 여러 개 받는 방법(**kwargs : 딕셔너리 형태로 만들어서 쓸 수 있음)

def cal(**kwargs):
	print(kwargs)

cal(name='bob',age=30)
cal(height=180)
# 
{'name': 'bob', 'age': 30}
{'height': 180}

클래스

1) 언제 사용하는지가 중요하다.

예를 들어, 아주 많은 몬스터들의 HP를 관리해야 하면?

방법 1. 리스트의 순서를 잘 지켜서 각 몬스터들의 hp를 잘 적어둔다. (중앙 한 곳에 모아서 관리)

방법 2. 몬스터마다 각자의 hp를 가질 수 있게 한다.

만약 뱀이 100마리 1000마리라면 뱀의 HP를 각각 자체적으로 관리해주는 것이 효율적이고 직관적임. -> 객체지향적

  • 객체지향
    각 객체에 그것들에 관련된 속성들을 넣어두고 컨트롤 할 수 있는 함수들을 넣어둔 후 한 곳에서 함수들만 불러서 각 객체들을 제어하는 것

2) 어떻게 쓰는가?

class Monster():
    hp = 100
    alive = True

    def damage(self, attack): # self는 내가 받은 attack은 내가 받은 데미지
        self.hp = self.hp - attack
        if self.hp < 0:
            self.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(90)
m2.status_check() # 살았다.

# 자체적으로 관리가 가능
# m1, m2는 인스턴스
  • 인스턴스(instance)
    같은 클래스에 속하는 개개의 객체로, 하나의 클래스에서 생성된 객체
    즉 클래스가 구체화되어, 클래스에서 정의된 속성과 성질을 가진 실제적인 객체로 표현된 것을 의미


출처: 네이버 지식백과

1개의 댓글

comment-user-thumbnail
2023년 8월 2일

글 잘 봤습니다.

답글 달기