본문 바로가기

내일배움캠프_개발일지/프로그래밍 기초_파이썬

프로그래밍 기초 - 파이썬 1

프로그래밍 기초 파이썬

 

 

폴더 : kimminsoo - sparta - programming_basis - sparta_python

 

 

 

 

 

 

1주차.   - 11월 21일(월) 시작

 

새 프로젝트 생성.

programming_basis - sparta_python 를 지정하고 프로젝트 생성.

sparta_python 안에 venv, hello.py 생성.

 

hello.py 기본 자료형, 리스트, 객체에 대한 기본적 접근에 대해서 공부.

 

 

1-3 변수 선언과 자료형에 대해서.

——

a = 2

b = 3

print(a ** b)

 

c = True

print(c)  # type(c) 해보면 class bool 로 나옴.

——

=> True 라는 값을 변수에 저장하고 타입을 검색해보면 <class ‘bool’> 로 나오더라.

마찬가지로 a 를 print(type(a)) 해보면 <class ‘int’> 로 나와.

JS 에서는 모든 타입이 객체의 형태로서 그 정보를 포함하고 있다는 것을 생각해보면, 파이썬에서는 class 로 이루어져 있다고 봐야하나?

 

 

 

 

1-5 문자열 다루기

——

first_name = 'minsoo'

last_name = 'kim'

print(last_name + first_name)

 

aa = 'a'

bb = str(2)  # 형 변환

print(aa + bb)

——

=> 자바스크립트는 1 + ’11’ 하면 ‘111’ 로 출력되지. 문맥상 number 인 1을 string 으로 바꿔버려.

허나 파이썬에서는 타입 에러를 띄움. JS 이 파이썬보다 더 미친놈인걸로.

추가로, 자바스크립트의 String(), .toString() 처럼 파이썬에는 str() 이 문자열로 형 변환 시키는 메소드.

 

 

 

——

text = 'agdsiongdadiwojd'

 

result = len(text)

print(result)  # 16

 

result2 = text[:3]    # 페이징 할 때 그 기능인데? 몇 번째 인덱스부터 몇 번째 인덱스까지 잘라라 그거.

print(result2)  # agd   왜? 0 < 3 이니까. 실제로는 2번째 인덱스 까지만 출력.

 

result3 = text[3:8]   # 기본적으로 [x:y] 이걸 slice 기능이라고 해. 헌데 걍 [:] 이렇게만 있으면 그대로 값을 복사해.

print(result3)   # siong    3번째 인덱스부터 7번째 인덱스까지 출력.

——

=> 키워드는 len(), [x:y]

둘 다 비파괴. 

 

 

 

——

myemail = "msdou46@gmail.com"

 

result4 = myemail.split('@')[1].split('.')[0]  # split() 은 매개변수를 기준으로 문자열을 잘라서 배열에 집어 넣어. 그걸 리턴. 비파괴.

print(result4)

——

=> split() 기능은 쓰임새도, 결과값도 JS 와 동등해. 문자열을 특정 문자를 기점으로 잘라내서 각각 배열에 담아버려.

 

 

 

 

 

 

1-6 리스트와 딕셔너리. 먼저 리스트.

 

——

a_list = ['사과', '배', '감', ['수박', '오이']]

b_list = [4, 8, 1, 9, 10]

c_list = [4, 8, 1, 9, 40]

 

print(a_list[3][1])  # list 의 속성을 잘 이해하고 파고파고 들어갈 수 있어.

 

b_list.append(99)  # 자바스크립트의 b_list.push() 랑 같은 기능. 배열에 새 인덱스를 추가.

print(b_list)

 

result7 = c_list[:3]

print(result7)     # [4, 8, 1]  출력. 배열에 [:3] 을 해서 2번째 인덱스까지의 값을 '배열' 로 반환.

 

result8 = c_list[-1]

print(result8)    # 인덱스에 -1 을 입력하면 가장 마지막 인덱스의 값이 출력돼. 0에서 -1 하면 맨 뒤로 가겠지.

                    # 바꿔 말하면, -2 를 입력하면 마지막에서 두 번째 요소가 출력돼.

——

=> 파이썬 또한 자바스크립트 마냥 배열도 객체도 다 내부 자료 중첩이 가능해.

마지막에 보면 리스트의 인덱스에 -1 을 입력하면 가장 마지막 인덱스의 값을 호출.

-2 를 하면 마지막에서 두 번째 요소가 출력. 

생각해보면 당연해. 배열의 가장 첫 인덱스인 0 에서 마이너를 하니까, 반대로 돌아가겠지.

 

 

——

c_list.sort()

print(c_list)   # 오름차순으로 정렬. 이거 파괴형 메소드네.

 

c_list.sort(reverse=True)

print(c_list)   # 내림차순으로 정렬. 즉 reverse 의 디폴트값은 False

——

=> 파이썬의 sort() 메소드. 매개변수로서 reverse 값을 true/fasle 로 줌에 따라 오름차순이냐 내림차순이냐가 결정.

만약에 sort() 를 메소드가 아닌 코드로 만들려면 어떻게 해야 할까…

——

const c_list = [4, 8, 1, 9, 40]

let result_list = []

——

이런 식으로 선언하고, c_list 에서 최솟값을 구해서 차례대로 result_list 에 push 해줘야 할 거 같아.

헌데, c_list 에서 차례대로 구한 최솟값이 무엇인지, result_list 에 들어간 요소가 무엇인지를 알아야 해.

즉 최솟값을 구하기 위해 for 문을 돌리며, result_list에 들어간 값이 무엇인지 찾은 다음에 그 요소를 c_list 에서 지워야 해.

어렵네…

 

 

 

——

d_list = [4, 8, 1, 9, 40]

result9 = (1 in d_list)

print(result9)     # 값이 있으면 True, 없으면 False 를 반환.

——

=> (‘찾고자 하는 값’ in list) 이렇게 했을 때, 아마 내부적으로 for 문이 돌아가는 가봐.

아마… 모든 인덱스를 검사하고 찾고자 하는 값이 있을 경우에는 True 를 반환하는 거겠지.

 

 

 

 

 

1-6 리스트와 딕셔너리. 딕셔너리.

——

a_dict = {'name': 'bob', 'age': 27, 'friend': ['영희', '철수']}  # 키:벨류 로 이루어진 속성들의 연속. 속성 = 프로퍼티

print(a_dict["name"])

print(a_dict["friend"][0])   # 이런 식으로 list 와 딕셔너리가 서로 중첩되기도.

 

a_dict['height'] = 80;

print(a_dict)    # 객체에 프로퍼티를 추가. 이건 JS와 같은 방식.

 

print('height' in a_dict) # 리스트랑 마찬가지야. 속성이 있으면 True, 없으면 False 를 반환.

——

=> 딕셔너리에 속성을 추가하는 방법은 js 와 마찬가지야.  (‘찾고자 하는 값의 키 이름’ in dict) 으로 프로퍼티 찾는 것도 똑같고.

 

 

 

——

people = [

    {'name': 'bob', 'age': 27},

    {'name': 'John', 'age': 30}

]

print(people[1]["age"])   # 30

——

=> 전형적인 배열과 딕셔너리의 조합.

우리가 몽고DB 에서 데이터를 가져오면 항상 list() 로 감싸서 클라이언트에게 response 해줬었지?

그 데이터들이 다 이런 식으로 생겨먹은거야.

이걸 JS 에서는 for문을 돌려서 각 객체의 값에 접근할 수 있었지

 

 

 

 

 

 

1-7 조건문

——

money = 3800

 

if money > 3800 :

    print('택시를 타자')

else :

    print('택시를 못 타 ㅠㅠ')

——

=> if else 구문의 경우, if 와 else 각각의 해당 사항을 코딩해 줄 때 들여쓰기를 사용해.

콜론(:) 이 나올 경우, 들여쓰기를 해야 그 내용물이 되는거야.

 

——

money = 5000

 

if money > 3800 :

    print('택시를 타자')

else :

    print('택시를 못 타 ㅠㅠ')

print('그럼 뭘 탈 까...?')

——

=>  위 코드의 경우, print('그럼 뭘 탈 까...?') 는 else 에 속하지 않는 코드이기에,

if else 의 결과와 상관없이 전역에서 출력이 되는거야.

if, for, 함수 모두 다 해당되는 사항.

 

 

——

money2 = 5000

if money2 > 3800:

    print('택시를 타자2')

elif money > 1200:       # JS의 else if 랑 같은거지.

    print('버스를 타자2')

else :

    print('걸어 가자...2')

——

=> 자바스크립트의 else if 가 파이썬에서는 elif. 마찬가지로, 여러 개를 쓸 수 있겠지.

 

 

 

 

 

 

1-8 반복문

 

——

fruits = ['사과', '배', '감', '딸기', '수박']

 

for fruit in fruits:

    print(fruit)

——

=> 가장 기초적인 for 문의 구조. 주로 배열에 많이 사용.

 

 

——

people3 = [

    {'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 someone in people3:

    if someone['age'] > 20:

        print(someone["name"], someone["age"])

——

=> 20세 초과인 사람만 출력하기.

배열을 for 문을 돌리고, 각각의 인덱스의 딕셔너리 안 age 가 20보다 클 경우, 해당 인덱스의 딕셔너리 정보를 출력.

즉, for문 안에서 if 문을 돌림으로서 배열 안에서 내가 원하는 사항 들만 뽑아낼 수 있다는 거야. 마치 데이터에서 select 문을 사용하듯!

추가로 파이썬이나 자바스크립트나 for in 문 동작 원리는… 조금 다른 거 같아.

자바스크립트에서 for in 의 변수는 인덱스인데, 파이썬에서 for in 의 변수는 인덱스에 담긴 값인 거 같아.

 

 

 

enumerate 활용하기.

——

for i, person in enumerate(people3):

    name = person["name"]

    age = person["age"]

    print(i, name, age)

    if i > 3:

        break

——

=>  for in 을 돌리고 싶은 배열을 enumerate() 로 감싸고 인덱스를 가리키는 person 앞에 i 라는 새로운 변수를 입력해줘.

그리고 print() 할 때 i 를 넣어주면, 결과값에 순서대로 번호를 매겨줘.

* 참고로 아래에 if I >3 해준건, 만약 배열의 인덱스가 수천개 인데 그냥 배열이 잘 출력되는지만 체크하고 싶은 경우,

이런 식으로 제한을 걸어서 ‘아, 잘 나오는 구나’ 라고 확인 정도만 할 수 있다는 거지.

——

0 bob 20

1 carry 38

2 john 7

3 smith 17

4 ben 27

——

이런 식으로 출력이 되겠지.

**** enumerate() 로 뽑아내는 i는 각 요소의 인덱스 값. 덕분에 쉽게 인덱스를 알 수 있어.

 

 

 

 

1-8 반복문, 연습문제.

——

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

 

print('------ 리스트에서 짝수만 출력하는 함수 만들기 ------')

for num in num_list:

    if num % 2 == 0:

        print(num);

 

print('------ 리스트에서 짝수의 개수를 출력하기 ------')

num_result = 0

for num in num_list:

    if num % 2 == 0:

        num_result += 1

print(num_result)

 

print('------ 리스트 안에 있는 모든 숫자 더하기 ------')

num_plus_result = 0

for num in num_list:

    num_plus_result += num

print(num_plus_result)

 

print('------ 리스트 안에 있는 자연수 중 가장 큰 숫자 구하기 ------')

num_higher = num_list[0]

for num in num_list:

    if num_higher < num:

        num_higher = num

print(num_higher)

——

=> 사알짝 알고리즘 적인 부분도 있어.

 

 

 

 

 

 

1-10 함수

 

——

def hello():

    print('hello')

 

hello()

——

=> 자바스크립트의 function () {} 이 파이썬에서는 def 인거지.

마찬가지로 hello() 이렇게 호출을 해줘야 함수가 발동.

 

——

def sum(a, b):

    print('더하기 시도!')

    return a + b

result10 = sum(2, 3)  # 변수에 값을 정의해서 담기 위해 sum() 함수 실행. 이 과정에서 print 가 실행돼.

print(result10)  # result10 에는 return 값만 담겼을 거야. 그니까 숫자만 print.

——

=> return 을 활용해서 반환값을 변수에 저장하여 사용하는 것도 자바스크립트와 똑같은 개념이야.

 

 

——

def bus_rate(age):

    if age > 65:

        print('무료 입니다.')

    elif age > 20:

        print('성인 입니다.')

    else:

        print('청소년 입니다.')

bus_rate(40)

——

=> if 문은 위에서 아래로 내려가며 해당 구문에서 true 가 검출될 경우 그 구문을 실행하고 종료.

즉, age > 20 이 age > 65 보다 위에 있으면 안되는거야.

 

 

 

1-10 함수 퀴즈. 주민등록 번호 입력받아서 성별 출력

——

def male_or_female(num):

    result = num.split('-')[1][0]

    print(result)

    if result == "1":

        print('남자 입니다')

    else:

        print('여자 입니다')

 

male_or_female("941206-2111111")

——

=> 입력할 때 주민번호 앞자리, 뒷자리 사이에 “-“ 를 입력해야 하잖아.

이 시점에서 입력값은 문자일 수 밖에 없어.

 

 

 

 

 

 

 

1-12 튜플, 집합

 

튜플은, 생긴 건 list 랑 똑같이 생겼는데 자료형이 불변형이야.

 

——

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

 

e_list[1] = '수박'

 

print(e_list)

——

=> 튜플은 리스트처럼 [] 로 감싸주는 것이 아닌, 배열을 () 로 감싸줘.

그래도 각 인덱스에 접근할 때에는 e_list[0] 이렇게 배열과 같은 방식으로 호출.

튜플은 배열과 달리 불편형, 즉 수정할 수 없기 때문에, 윗 코드처럼 특정 인덱스의 값을 바꾸려고 하면,

——

Traceback (most recent call last):

File "/Users/kimminsoo/sparta/programming_basis/sparta_python/hello.py", line 226, in <module>

e_list[1] = '수박'

TypeError: 'tuple' object does not support item assignment

——

이렇게 타입에러가 발생.

 

 

 

그럼 집합은 뭘까?

——

eee = [1,2,3,4,5,6,7,2,3,5,4,9]

 

eee_set = set(eee)

print(eee_set) => {1, 2, 3, 4, 5, 6, 7, 9}

——

=> 배열을 set() 으로 감싸주니 중복을 제거해주네.

 

 

교집합, 합집합 구해보기.

——

f_list = ['사과', '감', '배', '수박', '딸기']

g_list = ['배', '사과', '포도', '참와', '수박']

 

f_set = set(f_list)

g_set = set(g_list)

 

print(f_set & g_set)    # {'사과', '배', '수박'}  교집합.

print(f_set | g_set)    # {'사과', '감', '포도', '참와', '배', '수박', '딸기'}  합칩합.

——

 

 

마지막으로 차집합을 구해보자.

——

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

student_b = ['물리1','수학1','미술','화학2','체육']

 

student_a_set = set(student_a)

student_b_set = set(student_b)

 

print(student_a_set - student_b_set) // {'화학1', '음악', '물리2', '국어'}     a 에서 b 를 뺀거야.

——

 

일단 set() 자체에만 해도 중복을 제거하는 기능이 있어서 여러모로 이용할 방법이 많아.

 

 

 

 

 

 

 

1-13 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 = s["score"]

    print(f'{name}의 점수는 {score}점 입니다') // 영수의 점수는 70점 입니다 영희의 점수는 65점 입니다 기찬의 점수는 75점 입니다. ….

——

 

 

 

 

1-14 예외 처리.

 

예를 들어서, 배열을 for 문으로 돌리는데, 중간에 문제가 생겨서 에러가 뜬다면?

 

——

people4 = [

    {'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 people4:

    if person["age"] > 20:

        print(person["name"])

 

// 에러 발생

Traceback (most recent call last):

  File "/Users/kimminsoo/sparta/programming_basis/sparta_python/hello.py", line 292, in <module>

    if person["age"] > 20:

KeyError: 'age'

——

=> for 문을 신나게 돌고 있는데, 중간에 ‘bobby’ 에게는 age 프로퍼티가 없어.

헌데 if 문의 조건은 person[“age] 의 값을 체크해보고 있지.

이럴 경우 ‘age’ 라는 키가 없다고 도중에 에러를 발생시켜.

 

 

그렇다면, 작업 도중에 에러가 발생할 경우 이를 어떻게 처리해야 하며, 또 어떻게 해야 프로그램이 멈추지 않게 할 수 있을까.

 

——

for person in people4:

    try:

        if person["age"] > 20:

            print(person["name"])

    except:

        print('에러 발생!!')

 

// 결과

carry

ben

에러 발생!!

red

queen

——

=> 에러가 발생했을 때 프로그램이 멈춰버리면 큰 일이 나잖아.

그래서 도중에 에러가 발생할 경우, except 문의 내용을 실행하도록 코드를 짠거야.

for 문의 해당 차례에서 에러가 발생하면 except 의 구문을 실행하고, 프로그램을 멈추지 않은 채 다음 for 문 차례로 넘어가는 거야.

 

예를 들면, 뭔가 서버 쪽에 콜을 해서 데이터를 받아와 클라이언트 측에서 js 처리를 하는데 에러가 나거나 뭔가 데이터의 형태가 이상할 수 있어.

그럴 때 검사해 주는거지. 

허나 예외 처리 구문을 남용할 경우, 프로그램이 돌아는 가는데 자꾸 예외가 발생하고 또 무슨 에러가 났는지를 모르기 때문에 

사전 검사를 하기에도 애매해 지곤 해. 

개발 단계에서는 차라리 에러를 띄워서 사전에 문제를 봉합하는 것이 중요하지.

 

 

 

 

 

1-15 파일 불러오기

 

파일 생성.

programming_basis - sparta_python - main_func.py

programming_basis - sparta_python - main_test.py

=> hello.py 와 같은 경로에 2개를 더 생성.

 

 

——

,main_func.py>

 

 

def say_hi():

    print('안뇽!!')

 

def say_hi_to(name):

    print(f'{name}님, 안녕하세욤!')

——

=> main_func.py 파일에서 위와 같이 2개의 함수를 작성했다고 해보자. 

이제 main_test.py 파일에서 위의 파일을 import 해서 func.py 에 있는 함수를 가져와 사용해 볼거야.

 

——

<main_test.py>

 

 

from main_func import *

 

say_hi()

 

say_hi_to("김민수")

——

=> from main_func, 즉 main_func 파일에서 기능을 가져와 쓰겠다. 어떻게? Import * 요렇게.

main_func 파일에서 기능을 import 해 올 것인데, 뭘 해올 것이냐? *, 여기서 * 는 모두를 뜻해.

만약 

——

from main_func import say_hi

——

이렇게 import 한다면? say_hi() 라는 함수만 사용 가능하겠지.

 

 

 

 

 

1-16 한 줄의 마법

=> if 문을 삼항 연산자로 쓰기, for문을 한 줄로 쓰기.

 

먼저 if 문.

 

——

num2 = 3

 

if num2 % 2 == 0:

    result11 = '짝수'

else:

    result11 = '홀수'

 

print(f'{num2}은 {result11}입니다')

——

=> 이걸 한 줄로 만들어 보면 다음과 같다.

 

——

result12= ('짝수' if num2 % 2 == 0 else '홀수')

print(f'{num2}은 {result12}입니다')

——

=> 즉, < if num2 % 2. == 0 else > 를 기준으로 해서, if 문이 참이면 왼쪽의 ‘짝수’ 를, 거짓이면 오른쪽의 ‘홀수’ 를 실행하는 거야.

이 경우에는 해당 값을 result12 에 담고 있지.

정확히는, if () 의 구문이 true 면 구동이 거기서 멈추는 거야. 즉 ‘짝수’ 라는 값이 변수에 할당되겠지.

헌데 if() 구문이 거짓이면? ‘짝수’ 라는 구문을 지나치고 뒤쪽의 else 로 가는거야.

 

 

 

다음으로 for 문.

——

h_list = [1,3,2,5,1,2]

i_list = []

 

for h in h_list:

    i_list.append(h * 2)

print(i_list)        # h_list 배열에서 각 인덱스의 요소들에 2를 곱한 값을 i_list 에 차례대로 append 한다.

// [2, 6, 4, 10, 2, 4]

 

j_list = [h * 2 for h in h_list]

print(j_list)       # h_list 안에 있는 h(각 인덱스의 요소)를 돌릴 건데, 그 때마다 h*2 를 하고, 걔들을 list 로 묶어라.

// [2, 6, 4, 10, 2, 4]

——

=> 아랫쪽이 for 문을 한 줄로 쓴건데, 뭔가 전개 연산자 같네…

 

 

 

 

 

 

1-17 map, filter, lambda 식

=> 리스트의 원소, 즉 요소를 조작할 수 있는 메소드들. 

 

 

우선 map()  을 사용해보자.

——

people5 = [

    {'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): return '성인' if person["age"] > 20 else '청소년' 과 같은 결과.

    if person["age"] > 20:

        return '성인'

    else:

        return '청소년'

 

result13 = map(check_adult, people5) # people5 라는 list 의 인덱스를 하나하나 돌며 요소에 따라 값을 return, 그렇게 해서 모은 것들을 

# 배열로 묶어서 리턴하고 있는거야.

print(result13)   # map object

print(list(result13)) 

——

=> 위에서 map() 은 두 가지의 인자를 받고 있어.

첫 번째 매개변수는 check_adult() 라는 함수야. 추가로 이 함수는 person 이라는 매개변수를 받고 있어.

그럼 person 이라는 매개변수는 어디에서 오는가?

map() 함수가 두 번째로 받는 인자인 people5 라는 배열의 각 인덱스의 요소들을 check_adult() 함수가 매개변수로 받고 있는거야.

 

자바스크립트랑 비교를 해 볼까?

people5.map((value, index, array) => { value[“age”] > 20 ? Return ’성인’ : return ‘청소년’ })

=> 자바스크립트로 치면 위 코드와 같은건데, 

자바스크립트의 경우 map() 은 object 라는 객체에 속한 메소드로서, people5 라는 배열(객체)의 소속 메소드로서 호출이 돼.

그럼 콜백함수에게 자기가 알아서 value, index, array를 인자로 넘겨주지.

헌데 자바스크립트의 map() 에 반해,

파이썬의 map() 은 map object 로서 , 배열의 각 인덱스마다 실행할 함수와 배열을 차례로 매개변수로서 받고 있어.

그렇게 해서 반환한 결과값도 타입이 map object 라서, 이를 list() 로 자료형 변환 해줘야 해.

 

 

def check_adult(person):

    if person["age"] > 20:

        return '성인'

    else:

        return '청소년'

 

result13 = map(check_adult, people5)

=> 이 부분을 람다식으로 표현하자면, 다음과 같아

 

——

result14 = map(lambda person: '성인' if person["age"] > 20 else '청소년', people5)

——

=> 즉, 한 줄 짜리 함수를 굳이 따로 만드냐 이거지. 간단한 형태면 바로 콜백 함수로 넣어주는 거야.

추가로 람다식 안에서 return 을 명시하지 않고 있는데, 아마 내부에서 자기가 알아서 값을 return 시키는 것 같아.

참고로 이건 JS도 같아.

people5.map((value, index, array) => { value[“age”] > 20 ? Return ’성인’ : return ‘청소년’ }) 이거를 

people5.map((value, index, array) => { value[“age”] > 20 ? ’성인’ : ‘청소년’ }) 요렇게 해줘도 알아서 return 을 시켜.

 

 

 

다음으로 filter() 를 살펴보자.

 

——

result15 = filter(lambda x: x["age"] > 20, people5)

print(result15);

print(list(result15));

——

=> filter() 함수의 경우에도 하는 일은 자바스크립트의 filter() 와 같아.

filter() 의 첫 번째 매개변수는 배열에 적용할 구동 함수이고, 두 번째 매개변수는 대상으로 삼는 배열이야. map() 과 형태는 동일.

이제 배열의 인덱스와 요소를 하나하나 검사하는 데, 각 요소마다 함수식을 적용시켜서,

결과값으로 true 가 리턴되면 요소를 살리고, false가 리턴되면 요소를 제외시켜버려. 

그렇게 true 가 리턴된 요소들만 모아서 다시 배열을 만들고 최종적으로 return 시켜.

 

추가로, 보통 람다식을 사용할 때에는 관용적으로 배열의 요소를 x 라고 표시.

for in 문도 그렇고 람다식도 그렇고, 배열에서 가져오는 변수는 모두 ‘인덱스’ 가 아닌 인덱스 안에 담긴 ‘요소’ 를 가르켜.

JS 의 for in 문과는 다르지. 거기는 인덱스를 가리키거든.

 

 

 

 

 

 

 

1-18 함수 심화. 매개변수 다루는 법.

 

 

함수 호출 시 매개변수를 입력할 때, 인자의 이름을 맞춰준다면 순서가 상관 없어.

——

def cal(a, b):

    return a + 2 * b

result16 = cal(1, 4)

print(result16) // 9

 

result17 = cal(b=4, a=1)    # 정확히 매개변수의 이름을 일치시켜 준다면, 입력 순서가 바뀌어도 상관없어.

print(result17) // 9

——

=> 매개변수 이름을 매칭해 주고 있어. 원래라면 그냥 변수만 입력하면 순서대로 적용되는데,

함수에서 정확히 어떤 인자명으로 매개변수를 입력받고 있는지 매칭해준다면, 위 코드처럼 순서 상관 없이도 원하는 변수를 저격해서 입력 가능.

 

 

 

다음으로, 기본 매개변수 설정.

——

print('--- 기본 매개변수 설정 ---')

def cal(a, b = 3):    # b를 넣지 않았다면 기본값인 3을, 만약 넣었다면 넣은 매개변수 숫자로 적용.

    return a + 2 * b

 

result18 = cal(2)

print(result18) // 8

 

result19 = cal(2,4)

print(result19) // 10

——

=> JS랑 같아. 외부에서 매개변수를 입력해 주지 않는다면, 기본으로 설정한 인자로 활용.

만약 입력을 해준다면? 입력 받은 인자를 사용.

 

 

 

가변 매개변수 설정. 정해지지 않은 갯수의 매개변수를 입력하면, 함수 내부에서는 인자들을 모두 하나의 배열로 감싸서 사용.

——

def cal(*args):

    for name in args:

        print(f'{name}아 밥 먹을 시간이야')

 

cal('김민수', '김민호', '김민지')     //  김민수아 밥 먹을 시간이야 김민호아 밥 먹을 시간이야 김민지아 밥 먹을 시간이야

——

=>  자바스크립트의 (...args) 와 같아. 1개 이상의 매개변수를 받으면 그걸 다 배열로 감싸서 사용.

 

 

 

가변 매개변수 설정. 위랑 같은데, 이번에는 입력받은 다수의 매개변수를 딕셔너리의 키워드로서 사용. 매개변수를 전부 딕셔너리로 감싸서 사용.

——

def cal2(**kwargs):

    print(kwargs)

 

cal2(name='john', age='27') //  {'name': 'john', 'age': '27'}

——

 

 

 

 

 

1-19 클래스

=> 클래스는 ‘어떻게 사용하느냐’ 보다 ‘언제 왜 사용하느냐’ 가 훨씬 더 중요해.

우선 왜 필요한지 부터 이해하고 들어가야 하는 개념.

 

——

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('죽었다')

 

m1 = Monster()

m1.damage(150)

m1.status_check()

 

m2 = Monster()

m2.damage(90)

m2.status_check()

——

=> 세부적인 문법은 다르지만, 자바스크립트에서 클래스로 객체 인스턴스를 생성하는 것과 똑같은 원리.

단, JS 에서의 this 가 여기서는 self.