1)
*****
*****
*****
*****
*****
for i in range(5) :
for j in range(5) :
print("*", end = "")
print()
2)
*
**
***
****
*****
for i in range(1,6) :
for j in range(i) :
print("*", end = "")
print()
3)
*****
****
***
**
*
for i in range(5) :
for j in range(5-i) :
print("*", end ="")
for j in range(i) :
print(" ", end = "")
print()
4) (빈칸 대신 언더바를 넣음)
____*
___**
__***
_****
*****
for i in range(1, 6) :
for j in range(5-i) :
print(" ", end = "")
for j in range(i) :
print("*", end = "")
print()
5) (빈칸 대신 언더바를 넣음)
*****
_****
__***
___**
____*
for i in range(5, 0 ,-1) :
for j in range(5-i) :
print(" ", end = "")
for j in range(i) :
print("*", end="")
print()
: 데이터를 수정할 수 있고 수정해도 메모리 주소는 변하지 않는다.
: list, dict
# 예시에서 나온 메모리 주소는 바뀔 수 있음
lst = [1, 2, 3]
print(lst) # 출력 : [1, 2, 3]
print(id(lst)) # 출력 : 1945394713088
lst.append(4)
print(lst) # 출력 : [1, 2, 3, 4]
print(id(lst)) # 출력 : 1945394713088
:데이터를 수정할 수 없고 수정하려고 하면 새로운 객체가 생성되어 메모리 주소가 바뀐다.
: int, float, str, tuple
# 예시에서 나온 메모리 주소는 바뀔 수 있음
x = 10
print(x, id(x)) # 출력 : 10 1945317868048
x *= 3
print(x, id(x)) # 출력 : 30 1945317868688
name = "홍길동"
name[2] = "순"
문자형은 immutable하기 때문에 한 번 선언되면 수정할 수 없다.
마지막 글자를 "순"으로 바꾸고 싶다면 새로운 문자열로 만들어야 한다.
이 경우 슬라이싱 등을 사용해 문자열을 새로 생성해야 하며, 새 문자열은 기존 문자열과 다른 메모리 주소를 가지게 된다.
# 예시에서 나온 메모리 주소는 바뀔 수 있음
name = "홍길동"
print(id(name)) # 출력 : 1945420018864
name = name[:2] + "순"
print(name, id(name)) # 출력 : 홍길순 1945420169984
name = "홍길순"
print(name, id(name)) #출력 : 홍길순 1945421592208
: + 앞부분과 + 뒷부분을 연결해준다.
: 곱하는 횟수만큼 해당 리스트 또는 문자열을 반복해준다.
: 뒤에는 0 이상의 정수만 올 수 있다.
lst1 = [1, 2, 3]
lst2 = [4, 5]
str1 = "내일은 "
str2 = "주말"
print(lst1 + lst2) # 출력 : [1, 2, 3, 4, 5]
print(lst1 * 3) # 출력 : [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(str1 + str2) # 출력 : 내일은 주말
print(str2 * 10) # 출력 : 주말주말주말주말주말주말주말주말주말주말
# str1 * str2 는 오류
print(71 // 4) # 출력 : 17
print(29 / 3) # 출력 : 9.666666666666666
print(3 ** 4) # 출력 : 81
print(3 * 4) # 출력 : 12
print(3 % 2) # 출력 : 1
복합 대입 연산자는 기존 값에 연산을 수행하여 다시 저장하는 데 사용된다. 복합 대입 연산자는 불필요한 중간값을 생성하지 않고 값을 수정해서 메모리 효율적이고 실행 속도가 빠르다. 사용하면 더 간결하고 효율적이다.
+=, -= , *=, /=, //=, **=, %= 모두 가능하며 왼쪽 변수에 오른쪽 수를 연산하여 대입하면 된다.
1) 괄호
2) 거듭제곱 - 우측 결합
3) 단항 연산자(양수, 음수) - 좌측 결합
4) 곱셈, 나눗셈, 몫, 나머지 - 좌측 결합
5) 덧셈, 뺄셈 - 좌측 결합
6) 비교 연산자 (==, !=, <, > 등) - 좌측 결합
7) 논리곱 (and) - 좌측 결합
8) 논리합 (or) - 좌측 결합
9) 대입 연산자 (=) - 우측 결합
인덱스 접근 (Indexing)
: 리스트에서 특정 위치의 요소를 접근한다.
: 인덱스는 0부터 시작한다.
: 음수의 경우 오른쪽부터 왼쪽으로 접근한다.
(list[-1]은 마지막 요소)
슬라이싱 (Slicing)
: 리스트의 일부분을 추출한다.
: [start : end : step] 형태
: step은 간격이며 1일 경우 생략 가능
: start가 시작일 경우 생략 가능 (start는 포함)
: end가 끝일 경우 생략 가능 (end는 포함되지 않음)
: 음수도 가능하다.
my_list = [10, 20, 30, 40, 50]
#인덱스
print(my_list[0]) # 출력 : 10
print(my_list[4]) # 출력 : 50
print(my_list[-2]) # 출력 : 40
# 슬라이싱
print(my_list[1:4:2]) # 출력 : [20, 40]
print(my_list[:3]) # 출력 : [10, 20, 30]
print(my_list[:]) # 출력 : [10, 20, 30, 40, 50]
print(my_list[::2]) # 출력 : [10, 30, 50]
print(my_list[-4:-1]) # 출력 : [20, 30, 40]
print(my_list[::-1]) # 출력 : [50, 40, 30, 20, 10]
st = [1,2,3,4]
st[:] = []
st[:] = [] 는 리스트의 내용을 비우는 것이다.
st[:]는 리스트 st의 전체 요소를 참조하는데 []는 빈 리스트이기 때문에 리스트 st의 전체가 빈 리스트로 대체된다.
이때 리스트의 주소는 그대로 유지되고 내용만 빈 리스트가 된다.
(리스트는 mutable)
# 예시에서 나온 메모리 주소는 바뀔 수 있음
st = [1, 2, 3, 4]
print(st, id(st)) # 출력 : [1, 2, 3, 4] 1945416016960
st[:] = []
print(st, id(st)) # 출력 : [] 1945416016960
오늘은 별찍기를 많이 했다.
실행시켜보면 내 생각대로 안 된 경우가 많아서 당황스러웠는데
빨리 해야겠다고 생각해서 머리가 잘 안 굴러간 것 같다.
복습 겸 다시 해보니 재밌다.ㅋㅋㅋㅋ
별찍기 하신다고 고생 많으셨습니다. ^^;