본문 바로가기

Python

Python 문법

>>> 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=b
 b = a.copy()

 

인덱스와 요소를 함께 출력하기

>>> 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()

2차원 리스트에서 for 반복문을 두 번 사용

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