>>> a = [1.2, 2.5, 3.7, 4.6]
>>> for i in range(len(a)):
... a[i] = int(a[i])
...
>>> a
[1, 2, 3, 4]
>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))
>>> a
[1, 2, 3, 4]
나눗셈 후 소수점 이하를 버리는 // 연산자
몫과 나머지를 함께 구하기
몫과 나머지를 함께 구하려면 divmod를 사용하면 됩니다.
>>> divmod(5, 2) (2, 1)
참고 | 진수, 8진수, 16진수
정수는 10진수 이외에도 2진수, 8진수, 16진수로도 표현할 수 있습니다.
2진수: 숫자 앞에 0b를 붙이며 0과 1을 사용합니다.
8진수: 숫자 앞에 0o(숫자 0과 소문자 o)를 붙이며 0부터 7까지 사용합니다.
16진수: 숫자 앞에 0x 또는 0X를 붙이며 0부터 9, A부터 F까지 사용합니다(소문자 a부터 f도 가능).
>>> 0b110 6 >>> 0o10 8 >>> 0xF 15
변수 여러 개를 한 번에 만들기/y삭제
x, y, z = 10, 20, 30
x, y = 10, 20
x, y = y, x
참고 | 빈 변수 만들기
del x
x = None
입력 값을 변수 두 개에 저장하기
입력받은 값을 콤마를 기준으로 분리하기
a, b = input('문자열 두 개를 입력하세요: ').split() # 입력받은 값을 공백을 기준으로 분리
a, b = map(int, input('숫자 두 개를 입력하세요: ').split(',')) # 입력받은 값을 콤마를 기준으로 분리
print(a + b)
map을 사용하여 정수로 변환하기
- 변수1, 변수2 = map(int, input().split())
- 변수1, 변수2 = map(int, input().split('기준문자열'))
- 변수1, 변수2 = map(int, input('문자열').split())
- 변수1, 변수2 = map(int, input('문자열').split('기준문자열'))
a, b = map(int, input('숫자 두 개를 입력하세요: ').split())
print(a + b)
sep로 값 사이에 문자 넣기
>>> print(1, 2, 3, sep=', ') # sep에 콤마와 공백을 지정 1, 2, 3
>>> print(4, 5, 6, sep=',') # sep에 콤마만 지정 4,5,6
>>> print('Hello', 'Python', sep='') # sep에 빈 문자열을 지정 HelloPython
>>> print(1920, 1080, sep='x') # sep에 x를 지정 1920x1080
>> print(1, 2, 3, sep='\n') # 줄바꿈 = print('1\n2\n3')
연습문제: 날짜와 시간 출력하기
year = 2000 month = 10 day = 27 hour = 11 minute = 43 second = 59
print(year, month, day, sep='/', end=' ')
print(hour, minute, second, sep=':')
2000/10/27 11:43:59
파이썬 산술 연산자
연산자 |
기능 |
문법 |
설명 |
+ |
덧셈 |
a + b |
두 값을 더함 |
- |
뺄셈 |
a - b |
a에서 b를 뺌 |
* |
곱셈 |
a * b |
두 값을 곱함 |
/ |
나눗셈 |
a / b |
a에서 b를 나누며 결과는 실수 |
// |
버림 나눗셈 (floor division) |
a // b |
a에서 b를 나누며 소수점 이하는 버림 |
% |
나머지 |
a % b |
a에서 b를 나누었을 때 나머지를 구함 |
** |
거듭제곱 |
a ** b |
a를 b번 곱함 |
@ |
행렬 곱셈 |
a @ b |
행렬 a와 b를 곱함 |
+ |
양수 부호 |
+a |
a에 양수 부호를 붙임 |
- |
음수 부호 |
-a |
a에 음수 부호를 붙임 |
+= |
덧셈 후 할당 |
a += b |
a와 b를 더한 후 결과를 a에 할당 |
-= |
뺄셈 후 할당 |
a -= b |
a에서 b를 뺀 후 결과를 a에 할당 |
*= |
곱셈 후 할당 |
a *= b |
a와 b를 곱한 후 결과를 a에 할당 |
/= |
나눗셈 후 할당 |
a /= b |
a에서 b를 나눈 후 결과를 a에 할당(결과는 실수) |
//= |
버림 나눗셈 후 할당 |
a //= b |
a에서 b를 나눈 후 결과를 a에 할당(소수점 이하는 버림) |
%= |
나머지 연산 후 할당 |
a %= b |
a에서 b를 나누었을 때 나머지를 구하여 a에 할당 |
**= |
거듭제곱 후 할당 |
a **= b |
a를 b번 곱한 후 결과를 a에 할당 |
@= |
행렬 곱셈 후 할당 |
a @= b |
행렬 a와 b를 곱한 후 결과를 a에 할당 |
한글 문자열 출력이 안 될 때
에러가 나는 이유는 .py 파일을 UTF-8이 아닌 CP949로 저장했기 때문입니다. 이때는 스크립트 파일을 UTF-8로 저장하면 됩니다. 보통 메모장을 사용하면 기본 인코딩이 CP949라서 이런 문제가 종종 생깁니다. 메모장에서 UTF-8로 저장하려면 파일(F) > 다른 이름으로 저장(A)… > 인코딩(E)에서 UTF-8을 선택한 뒤 저장하면 됩니다. 인코딩 문제를 예방하려면 파이썬 IDLE, PyCharm 등 파이썬 전용 편집기나 개발 도구를 사용하면 됩니다. 이들 편집기, 개발 도구는 기본 인코딩이 UTF-8입니다.
빈 리스트 만들기
- 리스트 = []
- 리스트 = list()
> b = list(range(5, 12))
튜플 사용하기
튜플은 요소가 절대 변경되지 않고 유지되어야 할 때 사용합니다.
- 튜플 = (값, 값, 값)
- 튜플 = 값, 값, 값
특정 값이 있는지 확인하기
>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 30 in a True
>>> 100 in a
UTF-8 문자열의 바이트 수 구하기
>>> hello = '안녕하세요'
>>> len(hello.encode('utf-8'))
15
음수 인덱스 지정하기
>>> a = [38, 21, 53, 62, 19]
>>> a[-1] # 리스트의 뒤에서 첫 번째(인덱스 -1) 요소 출력 19
>>> a[-5] # 리스트의 뒤에서 다섯 번째(인덱스 -5) 요소 출력 38
del로 요소 삭제하기
>>> a = [38, 21, 53, 62, 19] >>> del a[2]
인덱스 증가폭 사용하기
지금까지 지정된 범위의 요소를 모두 가져왔죠? 슬라이스는 인덱스의 증가폭을 지정하여 범위 내에서 인덱스를 건너뛰며 요소를 가져올 수 있습니다.
다음은 인덱스를 3씩 증가시키면서 요소를 가져옵니다. 여기서 주의할 점은 인덱스의 증가폭이지 요소의 값 증가폭이 아니라는 점입니다.
- 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭]
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:8:3] # 인덱스 2부터 3씩 증가시키면서 인덱스 7까지 가져옴
[20, 50]
슬라이스에 요소 할당
먼저 리스트를 만든 뒤 특정 범위의 요소에 값을 할당해보겠습니다.
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:5] = ['a', 'b', 'c'] # 인덱스 2부터 4까지 값 할당
>>> a [0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]
dict로 딕셔너리 만들기
lux1 = dict(health=490, mana=334, melee=550, armor=18.72) # 키=값 형식으로 딕셔너리를 만듦
lux2 = dict(zip(['health', 'mana', 'melee', 'armor'], [490, 334, 550, 18.72])) # zip 함수로
lux3 = dict([('health', 490), ('mana', 334), ('melee', 550), ('armor', 18.72)]) # (키, 값) 형식의 튜플로 딕셔너리를 만듦
lux4 = dict({'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}) # dict 안에서 # 중괄호로 딕셔너리를 만듦
변수에 값 할당을 if, else로 축약하기
변수 x에 10이 들어있으면 y에 x를 할당하고, 아니면 y에 0을 할당하는 코드는 다음과 같이 만들 수 있습니다.
>>> x = 5
>>> if x == 10: ...
y = x ...
else: ...
y = 0 ...
변수 = 값 if 조건문 else 값 형식으로 축약 조건부 표현식(conditional expression)
>>> y = x if x == 10 else 0
elif를 사용하여 여러 방향으로 분기하기
button = int(input())
if button == 1: print('콜라')
elif button == 2:
print('사이다') elif button == 3: print('환타')
else: print('제공하지 않는 메뉴')
증가폭 사용하기
> for i in range(0, 10, 2): # 0부터 8까지 2씩 증가 ... print('Hello, world!', i)
>>> for i in reversed(range(10)): # range에 reversed를 사용하여 숫자의 순서를 반대로 뒤집음 ...
print('Hello, world!', i) # 9부터 0까지 10번 반복
while
반복문은 반복 횟수가 정해져 있지 않을 때 자주 사용하므로 이 부분을 꼭 기억해두세요. 반면 for 반복문은 반복 횟수가 정해져 있을 때 자주 사용합니다. 그러므로 for와 while의 차이점을 정확히 익혀 두고 적절한 곳에 사용하는 것이 좋습니다
i = 0
while i < 100: # i가 100보다 작을 때 반복. 0부터 99까지 증가하면서 100번 반복
i += 1 # i를 1씩 증가시킴
if i % 2 == 0: # i를 2로 나누었을 때 나머지가 0이면 짝수
continue # 아래 코드를 실행하지 않고 건너뜀
print(i)
중첩 루프 사용하기
for i in range(5): # 5번 반복. 바깥쪽 루프는 세로 방향
for j in range(5): # 5번 반복. 안쪽 루프는 가로 방향
print('j:', j, sep='', end=' ') # j값 출력. end에 ' '를 지정하여 줄바꿈 대신 한 칸 띄움
print('i:', i, '\\n', sep='') # i값 출력, 개행 문자 모양도 출력
# 가로 방향으로 숫자를 모두 출력한 뒤 다음 줄로 넘어감
# (print는 기본적으로 출력 후 다음 줄로 넘어감)
코드 단축하기 FIZZ BUZZ
특히 문자열에 True를 곱하면 문자열이 그대로 나오고, False를 곱하면 문자열이 출력되지 않습니다(True는 1, False는 0으로 연산).
print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)
>>> 'Fizz' + 'Buzz'
'FizzBuzz'
>>> 'Fizz' * True
'Fizz'
>>> 'Fizz' * False
' '
리스트 list
- append: 요소 하나를 추가.
a[len(a):] = [500, 600] == a.append([500,600])
- extend: 리스트를 연결하여 확장
- insert: 특정 인덱스에 요소 추가
- pop : 요소 삭제 후 반환
>>> a = [10, 20, 30]
>>>a.insert(2, 500)
>>> a [10, 20, 500, 30]
>>> len(a)
4
리스트에서 특정 값을 찾아서 삭제하기
>>> a = [10, 20, 30, 20]
>>> a.remove(20)
>>> a
[10, 30, 20]
특정 값의 개수
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.count(20)
리스트에서 특정 값의 인덱스 구하기
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.index(20)
참고 | sort 메서드와 sorted 함수
파이썬은 리스트의 sort 메서드뿐만 아니라 내장 함수 sorted도 제공합니다. sort와 sorted 모두 정렬을 해주는 함수지만, 약간의 차이점이 있습니다. sort는 메서드를 사용한 리스트를 변경하지만, sorted 함수는 정렬된 새 리스트를 생성합니다.
>>> a = [10, 20, 30, 15, 20, 40]
>>> a.sort() # a의 내용을 변경하여 정렬
>>> a
[10, 15, 20, 20, 30, 40]
>>> b = [10, 20, 30, 15, 20, 40]
>>> sorted(b) # 정렬된 새 리스트를 생성
[10, 15, 20, 20, 30, 40]
1
리스트의 모든 요소를 삭제하기
a = [10, 20, 30]
>>> a.clear() == del [:]
리스트가 비어 있는지 확인하기
if not len(seq): # 리스트가 비어 있으면 True
if len(seq): # 리스트에 요소가 있으면 True
if not seq: # 리스트가 비어 있으면 True
if seq: # 리스트에 내용이 있으면 True
이때는 if 조건문을 활용하여 리스트에 요소가 있을 때만 마지막 요소를 가져오면 됩니다.
seq = []
if seq: # 리스트에 요소가 있는지 확인
print(seq[-1]) # 요소가 있을 때만 마지막 요소를 가져옴
리스트의 할당과 복사 알아보기
a = [0, 0, 0, 0, 0]
b = a
인덱스와 요소를 함께 출력하기
>>> a = [38, 21, 53, 62, 19]
>>> for index, value in enumerate(a)
print(index, value)
- [식 for 변수 in 리스트]
- list(식 for 변수 in 리스트)
>>> a = [i for i in range(10)] # 0부터 9까지 숫자를 생성하여 리스트 생성
>>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = list(i for i in range(10)) # 0부터 9까지 숫자를 생성하여 리스트 생성
>>> b [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- [식 for 변수 in 리스트 if 조건식]
- list(식 for 변수 in 리스트 if 조건식)
- list(map(함수, 리스트))
- tuple(map(함수, 튜플))
input().split()과 map
>>> a = input().split() 10 20 (입력)
>>> a ['10', '20']
>>> a = map(int, input().split()) 10 20 (입력)
>>> a <map object at 0x03DFB0D0>
다시 10 20을 입력하면 맵 객체(map object)가 만들어집니다. 이 상태로는 안에 들어있는 값을 볼 수 없으므로 list를 사용해서 리스트로 출력했습니다. 리스트를 보면 [10, 20]처럼 정수 두 개가 들어있습니다.
>>> list(a)
[10, 20]
a, b = map(int, input().split())와 같은 동작
참고 | 2차원 튜플
2차원 리스트가 있으면 2차원 튜플도 있겠죠? 다음과 같이 튜플 안에 튜플을 넣는 방식,
튜플 안에 리스트를 넣는 방식, 리스트 안에 튜플을 넣는 방식 등이 가능합니다.
튜플 = ((값, 값), (값, 값), (값, 값))
튜플 = ([값, 값], [값, 값], [값, 값])
리스트 = [(값, 값), (값, 값), (값, 값)]
a = ((10, 20), (30, 40), (50, 60)) # 튜플 안에 튜플을 넣은 2차원 튜플
b = ([10, 20], [30, 40], [50, 60]) # 튜플 안에 리스트를 넣음
c = [(10, 20), (30, 40), (50, 60)] # 리스트 안에 튜플을 넣음
튜플은 내용을 변경할 수 없으므로 a는 안쪽과 바깥쪽 모두 요소를 변경할 수 없습니다.
b는 안쪽 리스트만 요소를 변경할 수 있고, c는 바깥쪽 리스트만 요소를 변경할 수 있습니다.
a[0][0] = 500 # 안쪽 튜플은 변경할 수 없음. TypeError 발생
a[0] = (500, 600) # 바깥쪽 튜플은 변경할 수 없음. TypeError 발생
b[0][0] = 500 # 안쪽 리스트는 변경할 수 있음
b[0] = (500, 600) # 바깥쪽 튜플은 변경할 수 없음. TypeError 발생
c[0][0] = 500 # 안쪽 튜플은 변경할 수 없음. TypeError 발생
c[0] = (500, 600) # 바깥쪽 리스트는 변경할 수 있음
참고 | 사람이 알아보기 쉽게 출력하기
2차원 리스트를 출력하면 한 줄로 쭉 붙어서 출력됩니다.
>>> a = [[10, 20], [30, 40], [50, 60]]
>>> a
[[10, 20], [30, 40], [50, 60]]
만약 2차원 리스트의 사각형 구조를 유지하도록 출력하려면
pprint 모듈의 pprint 함수를 사용합니다.
>>> from pprint import pprint
>>> pprint(a, indent=4, width=20)
[ [10, 20],
[30, 40],
[50, 60]]
indent는 들여쓰기 칸 수, width는 가로 폭입니다.
각자 상황에 맞게 들여쓰기 칸 수와 가로 폭을 조절해서 사용해보세요.
a = [[10, 20], [30, 40], [50, 60]]
for i in a: # a에서 안쪽 리스트를 꺼냄
for j in i: # 안쪽 리스트에서 요소를 하나씩 꺼냄
print(j, end=' ')
print()
a = [[10, 20], [30, 40], [50, 60]]
for i in range(len(a)): # 세로 크기
for j in range(len(a[i])): # 가로 크기
print(a[i][j], end=' ')
print()
요소에 접근할 때는 리스트[세로인덱스][가로인덱스] 형식으로 접근
for 반복문으로 2차원 리스트 만들기
이번에는 for 반복문을 사용하여 2차원 리스트를 만들어보겠습니다.
a = [] # 빈 리스트 생성
for i in range(3):
line = [] # 안쪽 리스트로 사용할 빈 리스트 생성
for j in range(2):
line.append(0) # 안쪽 리스트에 0 추가
a.append(line) # 전체 리스트에 안쪽 리스트를 추가
print(a)
a = [[0 for j in range(2)] for i in range(3)]
a
[[0, 0], [0, 0], [0, 0]]
톱니형 리스트 만들기
a = [3, 1, 3, 2, 5] # 가로 크기를 저장한 리스트
b = [] # 빈 리스트 생성
for i in a: # 가로 크기를 저장한 리스트로 반복
line = [] # 안쪽 리스트로 사용할 빈 리스트 생성
for j in range(i): # 리스트 a에 저장된 가로 크기만큼 반복
line.append(0)
b.append(line) # 리스트 b에 안쪽 리스트를 추가
print(b)
실행 결과
[[0, 0, 0], [0], [0, 0, 0], [0, 0], [0, 0, 0, 0, 0]]
a = [[0] * i for i in [3, 1, 3, 2, 5]]
>>> a
[[0, 0, 0], [0], [0, 0, 0], [0, 0], [0, 0, 0, 0, 0]]
sorted로 2차원 리스트 정렬하기
2차원 리스트를 정렬할 때는 sorted 함수를 사용합니다.
sorted(반복가능한객체, key=정렬함수, reverse=True 또는 False)
다음은 학생 정보가 저장된 2차원 리스트를 정렬합니다.
students = [
['john', 'C', 19],
['maria', 'A', 25],
['andrew', 'B', 7]
]
print(sorted(students, key=lambda student: student[1])) # 안쪽 리스트의 인덱스 1을 기준으로 정렬
print(sorted(students, key=lambda student: student[2])) # 안쪽 리스트의 인덱스 2를 기준으로 정렬
실행 결과
[['maria', 'A', 25], ['andrew', 'B', 7], ['john', 'C', 19]]
[['andrew', 'B', 7], ['john', 'C', 19], ['maria', 'A', 25]]
2차원 리스트의 할당과 복사 알아보기
b = a.copy()
b = copy.deepcopy(a)
'Python' 카테고리의 다른 글
PyWin32 Reference (0) | 2020.02.06 |
---|---|
PyAutoGUI (0) | 2020.02.06 |
PyQt5 실행파일 만들기 (PyInstaller) (0) | 2020.02.06 |