2022. 11. 8. 21:03ㆍ기록/TIL
[TIL] Today I Learned - 221108
221108 기록 강의를 들으며 추가적으로 파이썬 기본서를 보면서 몇몇 부분은 더 채워봤다.
python - enumerate
강의를 듣다가 enumerate의 사용을 발견, enumerate와 range의 차이점이 뭔지 궁금해서 찾아보게 되었다.
먼저 range부터 살펴보면 range의 경우 시작점, 끝점, 그리고 어느 범위로 반복문을 진행할 것인지에 관해 step이 존재한다.
step의 경우 default로는 1이 설정되어있으며 따로 인자를 설정해주지않으면 기본값 1로 들어가게 된다.
자바나 다른 언어에서는 해당 인자를 선언하는 부분에서 곱하기 및 다른 연산을 넣는것은 가능했는데 파이썬 내부에서는 range값 내부에 다른 연산자를 넣어주는 것은 불가능으로 보인다.
# 시작점, 끝점
for i in range(start, end):
# 시작점 생략
for i in range(end):
# 어느정도 범위로 건너뛸지 결정
for i in range(start, end, step):
그다음 enumerate의 주석
class enumerate(object):
"""
Return an enumerate object.
iterable
an object supporting iteration
The enumerate object yields pairs containing a count (from start, which
defaults to zero) and a value yielded by the iterable argument.
enumerate is useful for obtaining an indexed list:
(0, seq[0]), (1, seq[1]), (2, seq[2]), ...
"""
해당 주석을 읽어보면 iterater를 사용하며 해당 enumerate를 사용하면 자연스럽게 해당 값의 순서와 객체를 페어로 연결해준다고 한다. 그래서 enumerate를 사용하면 index가 있는 리스트를 얻기 쉽다고 한다.
만약 people이라는 사람들의 이름과 나이가 있는 하나의 리스트가 있다고 하자.
해당 리스트 각 사람에게 index를 줘서 하나의 리스트를 새로 만든다고 하자
# 새롭게 만들게 된 리스트
people2 = []
# enumerate로 인덱스 값을 얻어 새롭게 만든 리스트에 추가
for e, i in enumerate(people):
name = i['name']
age = i['age']
people2.append((e, name, age))
# 결과값 확인
print(people2)
위의 결과값을 보면 e라는 변수에는 따로 별다른 명령문을 지정하지 않았지만 해당 people2 리스트를 보면 e는 각 위치에서 index의 기능을 하고 있다고 볼 수 있다.
python - set(교집합 / 차집합 / 합집합)
교집합 / 차집합 / 합집합
set은 집합 내의 중복되는 원소를 자체적으로 제거해주는 기능이 있다.
다만 set의 경우 원소의 순서를 따로 지정하지 않아서 각 원소마다의 인덱스는 존재하지 않는다. 즉 순서가 없다는 의미이다
이러한 set는 우리가 수학적으로 알고있는 교집합과 차집합 등의 기능도 간단하게 구현할 수 있다.
먼저 차집합이다. 차집합의 경우 '-'를 사용하여 구하며, difference() 메서드를 사용해도 구할 수 있다.
# 각 학생의 과목 리스트를 가져온다
student_a = ['물리2', '국어', '수학1', '음악', '화학1', '화학2', '체육']
student_b = ['물리1', '수학1', '미술', '화학2', '체육']
# 혹시 중복이 되는 경우도 존재할 수 있으니 set을 통하여 중복 부분 제거
a_set = set(student_a)
b_set = set(student_b)
# a집합에서 b집합을 빼면서 차집합 구현
print(a_set - b_set)
# difference() 메서드 사용
a_set.difference(b_set)
다음은 합집합이다. 합집합의 경우 두개의 집합을 하나로 합치는 연산이며 기호는 '|'를 사용한다.
기호가 아닌 메서드로는 union() 메서드가 존재한다.
# 각 학생의 과목 리스트를 가져온다
student_a = ['물리2', '국어', '수학1', '음악', '화학1', '화학2', '체육']
student_b = ['물리1', '수학1', '미술', '화학2', '체육']
# 혹시 중복이 되는 경우도 존재할 수 있으니 set을 통하여 중복 부분 제거
a_set = set(student_a)
b_set = set(student_b)
# a집합에서 b집합을 합하는 |
print(a_set|b_set)
# union() 메서드 사용
a_set.union(b_set)
교집합
두개의 집합에서 공통적으로 있는 원소를 골라내는 연산이다.
"&"를 사용하거나 아니면 intersection()를 사용하면 교집합의 연산을 가져올 수 있다.
# 각 학생의 과목 리스트를 가져온다
student_a = ['물리2', '국어', '수학1', '음악', '화학1', '화학2', '체육']
student_b = ['물리1', '수학1', '미술', '화학2', '체육']
# 혹시 중복이 되는 경우도 존재할 수 있으니 set을 통하여 중복 부분 제거
a_set = set(student_a)
b_set = set(student_b)
# a집합에서 b집합을 교집합을 구하는 &
print(a_set & b_set)
# intersection() 메서드 사용
a_set.intersection(b_set)
python - f string
기존의 파이썬에서도 print()로 출력을 하면서 변수를 넣을 수 있지만
해당 경우에는 매번 +와 ''로 문자와 변수를 구분해줘야 했다.
그러나 f스트링 기능을 사용하여 출력을 하면 별다른 구분 기호 없이
출력하고자 하는 위치에 변수를 선언해주면 파이썬 자체에서 해당 변수를 원하는 위치에 넣어 출력을 해주는 기능이다.
출력하고자 하는 경우가 짧은 경우에는 f 스트링을 사용하지 않아도 큰 문제는 없을 수 있다.
그러나 출력하고자 하는 출력문의 길이가 길어지는 경우 구분자로 인해 헷갈리게 되는 가능성이 높으니
보기 편하게 f 스트링을 사용하는 게 좋을 것 같다.
# 변수 선언
country1, country2 = '대한민국', '일본'
score1, score2 = 1, 1
# 출력을 하고싶은 문구의 예시
print('대한민국 : 가나 축구는 현재 1:1입니다')
# f 스트링 미사용
print({country1} + ' : ' + {country2} + '축구는 현재 ' + {score1} + ':' + {score2} + '입니다')
# f 스트링 사용
print(f'{country1} : {country2} 축구는 현재 {score1} : {score2} 입니다')
python - map, filter, lamda
map
class map(object):
"""
map(func, *iterables) --> map object
Make an iterator that computes the function using arguments from
each of the iterables. Stops when the shortest iterable is exhausted.
"""
map에는 두 가지의 인자가 들어간다. 첫 번째 인자는 map에서 실행시킬 function과 두 번째 인자는 이제 iterator이라는 각 원소를 넣거나 반환하는 작업이 가능한 오브젝트를 넣을 수 있다. 이제 map이라는 객체는 지정을 해주면 iterator에서 하나씩 원소를 빼와서 각 원소를 function에 넣어주고 반환 값을 가져온다고 볼 수 있다.
map은 간단하게 사용하는 것으로도 접근이 가능하다. 예를 들어 우리가 파이썬으로 알고리즘 문제풀이를 진행할 때 문제에서는 직접 숫자를 입력하라 한다. 다만 이때 하나의 숫자를 입력하는 경우 쉽게 int(input())을 사용하면 되지만 여러 개의 숫자를 입력하게 되는 경우에는 아래와 같이 map을 사용해서 입력해도 된다.
a, b = map(int, input().split())
위와 같이 진행을 하게 된다면 각 변수에 int(input())을 한 것과 같은 동일한 결과물이 나온다.
fiter
class filter(object):
"""
filter(function or None, iterable) --> filter object
Return an iterator yielding those items of iterable for which function(item)
is true. If function is None, return the items that are true.
"""
filter의 경우에는 이제 map과 유사하지만 틀린 점이 하나 있다.
바로 filter의 조건에 들어오는 function의 값에 대한 true값만 반환을 하는 것이다.
만약 function이 따로 존재하지 않으면 해당 경우에는 true를 반환한다고 한다.
lamda
우리가 파이썬이나 다른 언어에서 함수를 만들 때 def / function 등의 선언을 먼저 해주고 함수를 정의하였었다. 하지만 함수를 정의할 때는 해당 함수가 하나의 부분에서만 사용되는 것이 아닌 코드의 여러 곳에서 사용이 돼서 그 기능을 쉽게 사용하기 위해 하나의 함수로 정의한 것이다. 그렇다면 딱 한 가지 부분에서 작동하게 되는 함수의 경우 이것은 선언을 하는 것이 좋을까? 아니면 그때 그 순간만 사용하는 게 좋을까?라는 생각에서 나온 기능인 것 같다. lamda의 경우 def를 사용하여 함수를 정의할 정도로 복잡하지 않거나 간단하게 함수를 한 줄로 만들 때 사용한다고 한다.
lambda의 기본 틀은 아래와 같다
lambda x, y : x+y
즉 매개변수를 주고 해당 매개변수를 토대로 본인이 구현하고자 하는 표현식을 입력해주면 된다.
lamda의 경우 map과 filter와 잘 어울리는 기능이다. 만약 아래와 같은 lamda를 지정했다고 하자.
다만 이제 해당 기능은 이번 한순간만 사용하고 끝이 나는 기능이다.
lambda person : ('성인' if person['age'] > 20 else '청소년')
그렇다면 해당 기능을 사용하여 people 리스트에서 사람의 나이를 통한 구분을 한다 하면
간단하게 아래와 같이 구현할 수 있다.
people3 = list(map(lambda person : ('성인' if person['age'] > 20 else '청소년'),people))
- 앞에 있는 list의 경우 해당 값으로 나온 값을 리스트로 만들어주는 역할이다
- map의 경우 앞에서 말한 바와 같이 function과 iterator를 입력받는다
- 이 경우에는 앞에서 봤던 lambda와 예제였던 people을 가져온다
- 마지막 lambda의 경우 해당 경우에만 사용하고 싶은 조건식을 만들어서 map안에서 직접 구현도 가능하다는 것을 보여준다
참고한 기본서
'기록 > TIL' 카테고리의 다른 글
[TIL] Today I Learned - 221110 (2) | 2022.11.10 |
---|---|
[TIL] Today I Learned - 221109 (0) | 2022.11.09 |
[TIL] Today I Learned - 221107 (0) | 2022.11.07 |
[TIL] Today I Learned - 221104 (0) | 2022.11.04 |
[TIL] Today I Learned - 221103 (0) | 2022.11.03 |