본문 바로가기

Python

211231 학습일기

어제 문제 풀었던 것(3장의 연습문제)의 풀이부터 살펴보고 점프 투 파이썬 들어가겠다.

 

1.

1번 문제를 lambda와 조건부 표현식을 이용해 푸는 방법이 나온다.

파이썬에서 lambda에 대해 배우는 건 오늘이 처음이다.

https://wikidocs.net/64

 

3.5 람다(lambda)

오늘은 람다 형식과 그것을 이용하는 여러가지 함수들에 대해서 알아보겠습니다. 당장 완벽하게 소화하실 필요는 없을 것 같구요, 가벼운 마음으로 이런 것이 있다는 정도만 아셔도 ...

wikidocs.net

여기의 링크에서 배웠다.

 

 

2.

lambda 형식은 인공지능 분야나 AutoCAD 라는 설계 프로그램에서 쓰이는 Lisp 언어에서 물려받았다.
lambda 형식을 이용하면 함수를 딱 한줄만으로 만들게 해준다.

 

lambda 형식은 다음과 같이 써준다.

lambda 매개변수 : 표현식

 

print((lambda x,y:x+y)(1,2))

#3

이걸 def를 이용한 코드로 만든다고 하면 아래와 같을 것이다.

def add(a,b):
    return a+b
print(add(1,2))

#3

 

 

3.

map() 함수에서 lambda가 쓰이는 경우를 보자.

 

map(함수, 리스트나 range 등등)

먼저, map 함수는 함수와 리스트를 인자로 받는다.
리스트 대신 range type을 인자로 받을 수도 있다.
그리고 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 다음 그 값들을 저장한다.
이 객체를 list로 묶어주면 그제서야 그 결과를 새로운 리스트에 담아준다.

 

여기 함수 자리에 lambda를 사용한 식을 넣을 수 있다.

예시로 확인하자.

a = map(lambda x:x**2,range(5))

print(a)
print(list(a))

출력값은 아래와 같다.

map object at 0x0000028A340EB940>
[0, 1, 4, 9, 16]

그냥 map() 한 결과만 출력하면 원하는 값이 출력되지 않을 것이다.

그걸 리스트로 감싸줘야한다.

 

뭐 이런 경우는 상관 없다.

a,b,c,d,e = map(lambda x:x**2,range(5))
print(a)
print(type(a))

map 한 객체들 수만큼의 변수들을 지정하는 경우. 이 경우 출력은 다음과 같이 된다.

0
<class 'int'>

 

 

3.

map도 type이다.

a = map(lambda x:x**2,range(5))
print(type(a))

#<class 'map'>

 

 

4.

reduce() 함수에서 lambda가 사용되는 경우를 보자.

 

reduce 함수에 대해 배우는 것도 오늘이 처음이다.

 

reduce() 함수의 형식은 다음과 같다.

reduce(함수,sequence)

sequence(문자열, 리스트, 튜플 등의 자료형)의 원소들을 누적적으로 함수에 적용시킨다.

 

reduce는 내장함수가 아니다.

reduce() 함수를 쓰려면 먼저 from functools import reduce 을 해줘야 한다.

 

from functools import reduce
a = reduce(lambda x,y:x+y,[1,2,3,4,5])
print(a)

#15

1이랑 2 먼저 더하고 그다음 3 더하고,.. 리스트 순으로 계속 더해나가다가 마지막에 5를 더한다. 

 

from functools import reduce
a = reduce(lambda x,y:y+x,"abcde")
print(a)

#edcba

이렇게 변주를 할 수도 있다. 이번엔 뒤에서부터 더한다.

 

 

5.

filter() 함수에서 lambda가 사용되는 경우를 보자.

 

filter()도 오늘 처음 배우는 듯한 함수이다. 

근데 단어 그대로 아닌 것은 거른다는 의미인 듯하다.

 

filter의 형식은 다음과 같다.

filter(함수, 리스트나 range)

리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들을 저장한다.

 

filter() 함수는 형식적으로 map()함수와 닮은 점이 많다.

먼저, 리스트 자리에 range type이 들어가도 된다.

두번째, filter도 type이다.

세번째, filter 한 객체들 수만큼의 변수들을 지정하는 경우 그 변수들은 자료형이 filter이 아닐 수 있다.

네번째, filter한 값들을 list로 묶어줘야 하는 경우가 많다.

 

#

a = filter(lambda x:x<5,range(10))
print(a)
print(list(a))

결괏값은 아래와 같다.

<filter object at 0x0000025E644CB940>
[0, 1, 2, 3, 4]

 

#

a,b,c,d,e = filter(lambda x:x<5,range(10))
print(a)
print(b)

결괏값은 아래와 같다.

0
1

 

 

이제 다시 점프 투 파이썬 풀이로 돌아오자.

 

6.

매개변수는 parameter

인자는 argument

 

 

7.

* 지시어는 여러개(복수개의) 인자를 함수로 받고자 할 때 쓰인다.

 

형태는 다음과 같다.

def 함수명(*매개변수명)

대체로 매개변수명으로 args 를 쓰는 것 같다.

*args 이렇게. 근데 *a, *onmyown, 등등 *만 붙어있으면 매개변수명은 내맘대로 정할 수 있다.

 

만약 이름들을 성과 이름으로 분리하는 함수를 만든다면 아래와 같이 만들 수 있을 것이다.

 

def sep(*t):
    a = []
    for i in t:
        a.append(tuple([i[:-2],i[-2:]]))
    return a

b = sep('김땡땡','이뫄뫄','오솨솨')
print(b)

 

[('김', '땡땡'), ('이', '뫄뫄'), ('오', '솨솨')]

 

 

8.

그럼 이것도 만들어보자.

사람들의 이름을 계속 받아서(input)으로 성과 이름을 분리해 정해진 리스트에 계속 저장하는 코드.

a = []
def sep(x):
    a.append(tuple([x[:-2],x[-2:]]))
    return a

while True:
    name = str(input())
    if name == '그만':
        print("잠시 멈춥니다.")
        continue

    elif name == '종료':
        print("----지금까지 모인 데이터는 다음과 같습니다.---")
        for j in a:
            print(j)
        print("---------------종료합니다.-------------------")
        break

    sep(name)

input으로 계속해서 사람들의 이름을 받는다.

잠시 쉬고 싶으면 '그만'을 입력하고, 종료하고 싶으면 '종료'를 입력한다.

'종료'를 입력하면 지금까지 모인 데이터를 출력하며 종료한다.

 

 

10.

함수는 들어온 입력값을 받아 어떤 처리를 하여 적절한 결괏값을 돌려준다.

함수는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉜다.

 

Ⅰ. 입력값 O, 결괏값 O

가장 일반적인 함수이다.

대부분 다음과 같은 형태이다.

def 함수명(매개변수):
    <수행할 문장>
    return 결괏값

ex)

#1

def add(a,b):
    result = a+b
    return result

t= add(1,2)
print(t)

#3

#2

def add(a,b):
    return a+b

t= add(1,2)
print(t)

#3

두 코드는 변수에 a+b를 지정해줬는지, 안 해줬는지 차이이다.

 

'입력값 O, 함숫값 O' 함수의 사용법은 다음과 같다. 

결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)

1번과 2번 예시에서 t = add(1,2) 에 해당하는 부분이다.

 

 

. 입력값 X, 결괏값 O

입력값이 없는 함수도 있다.

def sayhello():
    return "hi"

a = sayhello()
print(a)

#hi

 

'입력값 X, 결괏값 O' 함수의 사용법은 다음과 같다.

결괏값을 받을 변수 = 함수이름()

 

Ⅲ. 입력값 O, 결괏값 X

결괏값이 없는 함수도 있다.

예를 들면 이런거?

def noresult(a,b):
    print("결괏값은 없어요. 그냥 {},{}라고 프린트 될 뿐..".format(a,b))

noresult(1,2)

#결괏값은 없어요. 그냥 1,2라고 프린트 될 뿐..

결괏값이 없는 함수는 호출해도 돌려주는 값이 없기 때문에 noresult(1,2)와 같이 써준다.

근데 t = noresult(1,2) 해도 결과는 똑같다... 변수를 지정해도 어차피 함수는 호출되니까 그런 것 같다.

그런데!

def noresult(a,b):
    print("결괏값은 없어요. 그냥 {},{}라고 프린트 될 뿐..".format(a,b))

t = noresult(1,2)
print(t)

결괏값이 없는 함수를 변수에 호출하고 그 변수를 출력하면?

결과는 이렇게 나온다.

결괏값은 없어요. 그냥 1,2라고 프린트 될 뿐..
None

첫번째 출력문은 t = noresult(1,2) 에 해당하는 출력문이다.

두번째 출력문인 None이 print(t)에 대한 출력문이다.

돌려받을 값이 없는데 그 없는 것을 변수에 대입하여 출력하면 None이 출력된다.

그 변수의 값은 None인 것이다. None은 거짓을 나타내는 자료형 이라는 의미이다.

 

왜 "결괏값은 없어요. 그냥 1,2라고 프린트 될 뿐.."라는 문장이 출력되었는데 왜 결괏값이 없다는 것일까?

print문은 함수의 구성 요소 중 하나인 <수행할 문장> 에 해당하는 부분일 뿐이다.

 

결괏값은 오직 명령어로만 돌려받을 수 있다. 따라서 return 명령문이 없으면 결괏값도 없다.

 

'입력값 O, 결괏값 X' 함수의 사용법은 다음과 같다.

함수이름(입력인수1, 입력인수2,...)

 

 

. 입력값 X, 결괏값 X

def nonono():
    print("Nope")

nonono()

#Nope

매개변수도 없고 return문도 없다.
따라서 입력값도 결괏값도 없는 함수이다.

 

'입력값 X, 결괏값 X' 함수의 사용법은 다음과 같다.

함수이름()

 

여기서 만약 함수를 호출할 때 인수를 넣었다면?

def nonono():
    print("Nope")

nonono(1)

아래와 같은 에러가 뜬다.

TypeError: nonono() takes 0 positional arguments but 1 was given

nonono 함수는 0개의 인수만 받을 수 있는데 1개의 인수가 들어왔다는 에러메시지이다.

 

 

 

[출처]

 

<람다>

https://wikidocs.net/64

 

3.5 람다(lambda)

오늘은 람다 형식과 그것을 이용하는 여러가지 함수들에 대해서 알아보겠습니다. 당장 완벽하게 소화하실 필요는 없을 것 같구요, 가벼운 마음으로 이런 것이 있다는 정도만 아셔도 ...

wikidocs.net

 

<*args>

https://brunch.co.kr/@princox/180

 

[나름 중급 파이썬1] *args와 **kwargs

항상 헷갈리는 두 가지 다시 한번 살펴보자 | 이 글은 파이썬의 문법을 모르면 이해하기 어렵습니다. python의 함수 작성 요령, 인자(argument)와 파라미터를 이해한다면 도움이 되는 내용입니다. 아

brunch.co.kr

 

점프투파이썬

https://wikidocs.net/book/1

 

점프 투 파이썬

** 점프 투 파이썬 오프라인 책(개정판) 출간 !! (2019.06) ** * [책 구입 안내](https://wikidocs.net/4321) 이 책은 파이썬 ...

wikidocs.net

 

'Python' 카테고리의 다른 글

220106 학습일기  (0) 2022.01.06
220103 학습일기  (0) 2022.01.03
211230 학습일기  (0) 2021.12.31
211224 학습일기  (0) 2021.12.26
211223 학습일기  (0) 2021.12.23