list_a = [1,2,3]
list_b = [4,5,6]
print(list_a + list_b)
# [1,2,3,4,5,6]
print(list_a)
# [1,2,3] 비파괴적함수
list_a.extend(list_b)
print(list_a)
# [1,2,3,4,5,6] #파괴적함수
list_a = [1,2,3,4,5,6]
del list_a[1]
print(list_a) # [1,3,4,5,6]
list_a.pop(1) # 3
print(list_a) # [1,4,5,6]
list_a = [1,2,3,4,5,6]
del list_a[:3]
print(list_a) = [4,5,6]
temp = reversed([1,2,3,4,5,6])
for i in temp:
print("첫번째" : i)
for i in temp:
print("두번째" : i)
# 첫번째 for문만 출력됨
# why?
# reversed()의 결과가 제너레이터이기 때문에 함수의 결과를 여러번 사용할 수 없음
number = [1,2,3,4,5,6]
for i in reversed(number):
print("첫번째" : i)
for i in reversed(number):
print("두번째" : i)
# reversed()와 반복문을 조합할 때는 함수의 결과를 여러번 활용할 수 없음.
리스트를 뒤집을 때는 확장슬라이싱을 활용할 수도 있음.
number = [1,2,3,4,5,6]
for i in number[::-1]:
print(i)
# 문자열에도 사용가능
hi = "안녕하세요"
print(hi[::-1])
for i, value in enumerate(ex_list):
print(f'{i}번째 요소는 {value}이다.')
👍 짚고 넘어가기
'반복할 수 있는 것'을 iterable(이터러블)이라고 한다.
iterable한 객체라는 것은 내부에 있는 요소를 차례대로 하나씩 꺼낼 수 있는 객체를 의미한다. 리스트, 딕셔너리, 튜플, 문자열 등이 이에 해당한다.
.
이터러블 중에서 next()함수를 적용해서 하나씩 꺼낼 수 있는 요소를 iterator라고 한다.numbers = [1,2,3,4,5,6] r_num = reversed(numbers) # reversed()함수는 이터레이터를 리턴한다. print("reversed numbers : ", r_num) # <list_reversediterator 주소값> print(next(r_num)) # 6 print(next(r_num)) # 5
👍 더 중요한거
왜 리스트를 바로 리턴해주지 않고 이터레이터를 리턴해주는 것일까?
메모리의 효율성을 위해서이다. 이터레이터는 새로운 리스트를 만드는 것이 아니라 기존에 있던 리스트를 활용해서 작업하는 것이기 때문에 그때그때 필요한 만큼만 작업할 수 있다.
def power(item):
return item * item
def under_3(item):
return item < 3
list_input_a = [1,2,3,4,5]
# map(함수, 리스트) 함수를 사용합니다.
output_a = map(power, list_input_a)
print("map(power, list_input_a) : ", output_a)
print("list(map(power, list_input_a)) : ", list(output_a))
# [1,4,9,16,25]
# filter(함수, 리스트) 함수를 사용합니다.
output_b = filter(under_3, list_input_a)
print("filter(under_3, list_input_a) : ", output_b)
print("list(filter(under_3, list_input_a)) : ", list(output_b))
# [1,2]
map()함수의 리턴값을 그대로 출력해보면
<map object at 주소값>
이런 모양으로 출력된다. 제너레이터를 리턴한 것이다.
제너레이터란,
이터레이터를 직접 만들 때 사용하는 코드이다. 함수 내부에 yield 키워드를 사용하면 해당 함수는 제너레이터 함수가 된다.
제너레이터 함수를 통해 제너레이터 객체를 생성한 후, next(제너레이터 객체) 함수를 사용해 함수 내부의 코드를 실행해야한다. 이때 yield 키워드를 기준으로 실행된다.
제너레이터 객체는 함수의 코드를 조금씩 실행할 때 사용하고, 이는 메모를 효율적으로 사용할 수 있게 해준다.
만약, next()를 호출했는데 yield 키워드를 찾지 못하고 함수가 종료된 경우 StopIteration이라는 예외가 발생한다.
#for문으로 새로운 리스트 만들기
array = [1,2,3,4,5,6]
a_array = [i*i for i in array] # [1,4,9,16,25,36]
#조건 추가
b_array = [i*i for i in array if i % 2 == 1] # [1,9,25]
numbers = ["1","2","3"]
print("//".join(numbers)) # "1//2//3"
# int로 구성된 리스트를 join하려 할 경우
numbers = [1,2,3]
print("//".join(numbers))
# TypeError: sequence item 0: expected str instance, int found
print("안녕안녕하세요".count("안")) # 3
print("aabbccdd".count("a")) # 2
if key in dictionary:
print(key, ":", dictionary[key])
else:
존재하지 않는 키입니다.
value = dictionary.get("name")
print("이름", value)
# 만약 name이라는 키가 없을 경우
# 이름 : None
# name이라는 키가 있을 경우
# 이름 : 홍길동
a, b = 97, 40
print(divmod(a,b)) # (2, 17)
x, y = divmod(97, 40)
print(x) # 2
print(y) # 17