python, 실력 향상을 위한 19가지 syntax sugar
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
|
f = 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
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 = [1, 2, 3, 4]
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
|
a = 10
b = 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
|
A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = [*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 = [3, 5, 7, 8, 11]
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 게 써도 인지한다고 합니다.
신박합니다 이런건 ㅎㅎ