인덴트(들여쓰기)
python의 대표적인 특징으로써 공백 4칸을 원칙으로 한다.
네이밍 컨벤션
python의 변수명 네이밍 컨벤션은 자바와 달리, 각 언어를 밑줄( _ )로 구분하여 표기하는 스네이크 케이스를 따른다.
(스네이크 케이스는 일반적으로 모두 소문자로 표기하지만, 경우에 따라 시작 문자는 대문자로도 표기한다.)
타입 힌트
python은 동적 타이핑 언어이지만, 타입을 지정할 수 있는 타입 힌트 기능이 존재한다.
ex) def fn(a: int) -> bool:
하지만, 동적으로 할당될 수 있으므로, 문자열에 정수를 할당하는 등의 사용은 지양해야 한다.
리스트 컴프리헨션
python은 map, filter와 같은 함수형 기능을 지원하며, 람다 표현식도 지원한다.
ex) >>> list(map(lambda x: x + 10, [1, 2, 3]))
[11, 12, 13]
>>> [n * 2 for n in range(1, 10 + 1) if n % 2 == 1]
[2, 6, 10, 14, 18]
한 줄로 간결하게 작성할 수 있는 리스트 컴프리헨션은 가독성이 좋은 편이지만, 무리하게 복잡하게 작성할 경우 가독성을 떨어뜨릴 수 있다. 대체로 표현식은 2개를 넘지 않아야 한다.
제너레이터
제너레이터는 루프의 반복 동작을 제어할 수 있는 루틴 형태이다. 이 때, yield 구문을 사용하면 제너레이터를 리턴할 수 있다. 기존의 함수는 return 구문을 마주치면 값을 리턴하고 모든 함수의 동작을 종료하지만, yield는 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미로써, 중간 값을 리턴한 다음, 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행된다.
def get_natural_number():
n = 0
while True:
n += 1
yield n
get_natural_number()
<generator object get_natural_number at 0x10d3139d0>
다음과 같은 결과로, 함수의 리턴 값은 제너레이터가 된다. 만약, 다음 값을 생성하고 싶다면, next()를 수행하면 된다.
range
제너레이터의 방식을 활용하는 대표적인 함수로써, 주로 for 문에서 쓰인다.
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> range(5)
range(0, 5)
>>> type(range(5))
<class 'range'>
>>> for i in range(5):
... print((i, end=' ')
0 1 2 3 4
enumerate
enumerate()는 '열거하다'는 뜻의 함수로, 순서가 있는 자료형(list, set, tuple 등)을 인덱스를 포함한 enumerate 객체로 리턴한다.
>>> a = [1, 2, 3, 2, 45, 2, 5]
>>> a
[1, 2, 3, 2, 45, 2, 5]
>>> enumerate(a)
<enumerate object at 0x1010f83f0>
>>> list(enumerate(a))
[(0, 1), (1, 2), (2, 3), (3, 2), (4, 45), (5, 2), (6, 5)]
이처럼 인덱스를 자동으로 부여해준다.
// 나눗셈 연산자
/ 은 기본 나눗셈 연산자이고, // 은 몫을 구하는 연산자이다.
>>> 5 / 3
1.666666666666666667
>>> type(5 / 3)
<class 'float'>
>>> 5 // 3
1
>>> int(5 / 3)
1
나머지를 구하는 연산자는 % 이다.
>>> 5 % 3
2
몫과 나머지를 동시에 구할 땐, divmod() 함수를 사용한다.
>>> divmod(5, 3)
(1, 2)
print() 함수를 통해 값을 출력한다
>>> print('A', 'B')
A B
>>> print('A', 'B', sep=',')
A, B
>>> print('A', end = ' ')
print('B')
A B
>>> a = ['A', 'B']
>>> print(' '.join(a))
A B
>>> idx = 1
>>> fruit = 'Apple'
>>> print('{}: {}'.format(idx + 1, fruit))
2 : Apple
pass
python에서 pass는 null연산으로, 아무것도 하지 않는 기능이다. 보통 코드를 구현할 때, pass를 먼저 넣은 후, 추후 수정하며 구현할 때 쓰인다.
class MYclass(object):
def method_1(self):
pass
def method_2(self):
print('method')
c = MYclass()