syntax sugar 또는 syntatic sugar는 코딩을 좀더 직관적이고 효율적으로 작성하는 것을 의미합니다.

개인적으로 javascript의 function을 () => {}로만 표현하는 것이고 심지어 괄호까지도 안써도 되는걸 보고 꽤나 놀랐습니다.

 

Medium에서 19가지 파이썬 syntax sugar를 정리한 글이 있어 소개하고자 합니다.

 

1. 딕셔너리 합치기 with | (Vertical bar 또는 pipe라고 하는군요)

1
2
3
4
5
6
7
8
cities_us = {'New York City''US''Los Angeles''US'}
cities_uk = {'London''UK''Birmingham''UK'}
cities_jp = {'Tokyo''JP'}
 
cities = cities_us | cities_uk | cities_jp
 
print(cities)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK', 'Tokyo': 'JP'}
cs

이렇게도 사용 가능합니다.

1
2
3
4
5
6
7
cities_us = {'New York City''US''Los Angeles''US'}
cities_uk = {'London''UK''Birmingham''UK'}
cities_jp = {'Tokyo''JP'}
 
cities_us |= cities_uk | cities_jp
print(cities_us)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK', 'Tokyo': 'JP'}
cs

a += 1 약간 이런개념 같기도 하고...

 

2. typing 라이브러리를 이용한 변수 변경 보호

1
2
from typing import Final
DATABASE: Final = "MySQL"
cs

콜론 Final을 설정한 변수는 수정이 불가합니다.

 

3. F-Strings

1
2
3
4
from datetime import datetime
 
print(f"Today is {datetime.today()}")
# Today is 2023-03-22 22:00:32.405462
cs

f스트링입니다. .format보다 훨씬 직관적이고 간단합니다.

 

4. ... ellipsis (말줄임표, 쩜쩜쩜)

1
2
3
4
5
6
def write_an_article():
    ...
 
 
class Author:
    ...
cs

이제 pass는 그만사용해도 될듯 합니다.

 

5. decorator 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Student:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
        self.nickname = None
 
    def set_nickname(self, name):
        self.nickname = name
 
    @staticmethod
    def suitable_age(age):
        return 6 <= age <= 70
 
 
print(Student.suitable_age(99)) # False
print(Student.suitable_age(27)) # True
print(Student('yang''zhou').suitable_age(27)) # True
cs

데코레이터의 주 목적은 @함수명 을 이용하여 기존의 함수에 새로운 기능을 추가하려 하지만 기존함수를 최대한 건드리지 않기 위하여 사용합니다.

사실 데코레이터는 개념 정리가 좀 필요하여 syntax sugar에 들어가는게 좀 그런것 같은데...

어쨌든 @함수명으로 줄일 수 있으니.

 

6. 변수 for 문과 if 문을 한번에

1
2
3
4
Entrepreneurs = ["Yang""Mark""steve""jack""tom"]
D1 = {id: name for id, name in enumerate(Entrepreneurs) if name[0].isupper()}
print(D1)
# {0: 'Yang', 1: 'Mark'}
cs

D1 = { id: name} 입니다. 그리고 뒤에 id, name을 Entrepreneurs 리스트를 반복하는데 if 문을 붙여 첫글자가 대문자인 항목만 추렸습니다.

 

7. 람다함수 이용(작은 무명의 함수를 적용하고 싶을때)

1
2
3
4
leaders = ["Warren Buffett""Yang Zhou""Tim Cook""Elon Musk"]
leaders.sort(key=lambda x: len(x))
print(leaders)
# ['Tim Cook', 'Yang Zhou', 'Elon Musk', 'Warren Buffett']
cs

leaders라는 리스트를 .sort()와 람다함수로 길이순으로 정렬하였습니다.

 

8. 변수에 if문 바로 적용

1
short_one = a if len(a) < len(b) else b
cs

자바스크립트의 ? 참인경우 : 거짓인경우 

가 생각납니다.

 

9. enumerate

1
2
3
4
5
6
7
leaders = ["Warren""Yang""Tim""Elon"]
for i,v in enumerate(leaders):
    print(i, v)
# 0 Warren
# 1 Yang
# 2 Tim
# 3 Elon
cs

리스트를 for 문으로 돌릴때 순서(index)값을 함께 불러옵니다.

저같은 경우는 순서가 필요없어도 무조건 for문은 enumerate로 돌리는 것을 습관화하고 있지요 ㅎㅎ;

 

추가로 포함하는 개수가 같은 여러 리스트를 동시에 반복할 땐 zip()을 사용합니다.

1
2
3
4
5
6
7
8
alphabet = ["a","b","c"]
korean = ["ㄱ","ㄴ","ㄷ"]
 
for a, k in zip(alphabet, korean):
    print(a, k)
# a ㄱ
# b ㄴ
# c ㄷ
cs

 

10. with as 사용

1
2
3
4
5
6
7
= open("test.txt"'w')
f.write("Hi,Yang!")
# some logic here
f.close()
 
with open("test.txt"'w'as f:
    f.write("Hi, Yang!")
cs

파이썬으로 open()을 이용하여 파일을 불러오고 종료시에는 메모리 낭비를 막기 위하여 close()를 사용하는데 위와 같이 with as 구문을 사용하여 함수처럼 묶어서 사용합니다. close()를 할 필요가 없습니다.

 

11. a_list[start:end:step]

리스트 또는 문자열의 특정부분만을 선택할 때 유용하게 사용합니다.제 다른 포스트에 이에 대한 예시가 잘 정리되어 있습니다.ㅎㅎhttps://conansjh20.tistory.com/71

 

Python, [ ] 대괄호(Square bracket)의 사용

왠지 만능인것 같은 파이썬에서의 대괄호 [ ] (Square bracket) 사용에 대해서 알아보겠습니다. 1. 리스트 가장 일반적인 사용 방법으로 리스트로 묶을 때 사용합니다. 텍스트 변수에 [ ]을 씌우면 리

conansjh20.tistory.com

 

12. := , walus operator

1
2
while (line := input()) != "stop":
    print(line)
cs

:= 는 표현식에 이름을 붙여 바로 사용할 수 있습니다.

위의 코드는 input()을 while문으로 돌려 입력한 문자가 stop이 나올때까지 내가 입력한 문자열이 계속 출력되고 while문이 반복됩니다. 이 바다코끼리 연산자는 다양하게 사용될 수 있어 별도로 공부를 해보면 좋을것 같습니다.

 

13. 

 

14. zip 기능

앞서 for 문을 돌릴때 사용하는 방법을 언급했는데 단독으로 사용하면 전체를 리스트로 출력 각 소스 리스트들의 동일 순서 항목들이 튜플로 모여 있군요.

1
2
3
4
5
6
7
id = [1234]
leaders = ['Elon Mask''Tim Cook''Bill Gates''Yang Zhou']
sex = ['male''male''male''male']
record = zip(id, leaders, sex)
 
print(list(record))
# [(1, 'Elon Mask', 'male'), (2, 'Tim Cook', 'male'), (3, 'Bill Gates', 'male'), (4, 'Yang Zhou', 'male')]
cs

 

14. 복수 조건 비교

1
2
3
4
5
6
7
8
# 자바나 C언어의 경우
if (a > 1 && a < 10){
  //do somthing
}
 
# 파이썬의 경우
if 1 < a < 10:
    //do somthing
cs

 

15. 두 변수를 서로 바꿀때

1
2
3
4
5
= 10
= 5
a, b = b, a
print(a, b)
# 5 10
cs

간단합니다.

 

16. *변수명을 이용하여 여러 값을 리스트로 한번에 받기

1
2
3
4
5
6
7
8
9
person = {'name''Yang''age'30'location''Mars'}
name, age, loc = person.values()
print(name, age, loc)
# Yang 30 Mars
 
person = {'name''Yang''age'30'location''Mars'}
name, *others = person.values()
print(name, others)
# Yang [30, 'Mars']
cs

맨 처음 항목의 value인 'Yang'은 name변수로 나머지 모든 항목의 value는 others에 리스트로...

설명이 더 필요없습니다.

 

17. *변수명을 이용하여 세트 리스트 튜플을 리스트로 합치기

1
2
3
4
5
6
= [123]
= (456)
= {789}
= [*A, *B, *C]
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]
cs

네 그렇습니다.

 

18. all(), any()

1
2
3
4
5
6
7
8
9
my_list = [357811]
all_odd = all(num % 2 == 1 for num in my_list)
print(all_odd)
# False
 
leaders = ['Yang''Elon''Sam''Tim']
starts_with_Y = any(name.startswith('Y'for name in leaders)
print(starts_with_Y)
# True
cs

 

all()은 모두가 참일때 True를 반환 하나라도 거짓이 있다면 False를 반환

any()는 하나라도 참일때 True를 반환 모두가 거짓일때 False를 반환

 

19. 숫자 사이에 자릿수 구분을 위한 _ 언더바 가능

10000000000000 을 헷갈리지 않게 10_000_000_000_000 게 써도 인지한다고 합니다.

신박합니다 이런건 ㅎㅎ

 

 

+ Recent posts