우연히 알게 되었는데, 파이썬에서는 while, for, try 구문과 else 구문을 같이 사용할 수 있다.
이를 loop-else라고도 부른다.
for x in range(3):
print (f'iteration no {(x+1)} in for loop')
else:
print ("else block in loop")
print ("Out of loop")
# OUTPUT
# >>> iteration no 1 in for loop
# >>> iteration no 2 in for loop
# >>> iteration no 3 in for loop
# >>> else block in loop
# >>> Out of loop
반복문과 else를 같이 사용하면 else 부분을 마지막에 반드시 실행한다.
이때 break로 반복문을 빠져나오면 else 부분을 실행하지 않는다.
for fruit in fruits:
if fruit == "banana":
break
else:
raise ValueError('No banana flavor found!')
이를 이용하면 위와 같은 에러 발생으로 처리할 수도 있다.
정상적으로 확인을 하면 우리는 for문의 if의 break를 거친다.
break를 거쳐서 반복문을 빠져나왔기 때문에 else는 실행하지 않는다.
하지만 for문 전체를 다 돌았음에도 불구하고 break를 거치지 않으면, else로 가고 결국 에러를 발생한다.
x = 0
while x < 3:
x += 1
print (f'iteration no {x} in while loop')
else:
print ("else block in loop")
print ("Out of loop")
# OUTPUT
# >>> iteration no 1 in for loop
# >>> iteration no 2 in for loop
# >>> iteration no 3 in for loop
# >>> else block in loop
# >>> Out of loop
while문도 for문과 유사하게 사용한다.
try:
''' something code '''
except:
''' something error '''
else:
''' something run '''
finally:
''' anyway do this '''
try에서 else는 살짝 사용이 다르다.
except는 에러가 발생했을 때, else는 에러가 발생하지 않았을 때 들어가는 부분이다.
Python 3.6에 추가한 문법이다. 숫자 어디에 사용해도 상관없는 가독성을 위한 문법이다.
# Case 2: Throw-away variable
name, _, age = ["John", 2000, 22]
print(name, age)
first, *_, last = (1, 2, 3, 4, 5, 6, 7)
print(first, last)
for _ in range(3):
print("Hello, World!")
2. 값을 무시하는 기능으로 사용한다.
보통 변수 필요 없이 반복할 때 for문에서 자주 사용한다. 가운데 예시처럼 unpacking(*)로 다중 무시도 가능하다.
# Case 3: PEP8
_single_leading_underscore: 한 모듈 내부에서만 사용하는 private 클래스/함수/변수/메소드를 선언
single_trailing_underscore_: 파이썬 키워드와의 충돌을 피하기 위해 사용
__double_leading_underscores: 하나의 문법 요소, 클래스간 속성명 충돌 방지를 위해 사용
__double_leading_and_trailing_underscores__: 스페셜 변수나 메소드에 사용(예시. __init__)
# Case 4: i18n / l10n
from django.utils.translation import ugettext as _
from django.http import HttpResponse
def translate_view(request):
translated = _('This string will be translated.')
return HttpResponse(translated)
4. 국제화(i18n) / 지역화(l10n) 함수 Convention(권장 가이드라인)으로 사용한다.
i18n / l10n 함수를 _로 바인딩하는 C Convention에서 유래하였다.
i18n / l10n 라이브러리인gettext 내장 라이브러리 API 문서와 i18n / l10n을 지원하는 Django의 공식 문서에서도 사용다.
# Case 5: Holds the last result in interactive interpreter session
>>> 4+6
10
>>> _
10
>>> _ * 3
30
>>> _ * 20
600
5. 파이썬 인터프리터에서, 가장 마지막에 실행한 결과값을 저장한다.
이는 표준 CPython 인터프리터에서 먼저 사용했으며, 다른 파이썬 인터프리터에서도 똑같이 사용할 수 있다.
이런 경우에는 어떨까? 10을 출력하고 print(10)을 출력하라는데 문자열이 아니다. 무엇을 출력할까?
result = print(10)
print(result)
print(print(10))의 코드는 위처럼 변경할 수 있다. Python3부터 print()함수는 None을 반환(return)한다. 따라서 print(result)의 출력 결과는 None이다.
def func():
''' do something '''
print( ''' print something ''' )
result = func()
print(result)
함수를 작성하고 함수의 return을 result에 저장한 뒤, result를 출력하는 코드를 작성했다고 해보자. 함수를 이용하여 코드를 작성하는 대부분의 경우에 위와 같은 형식을 따를 것이다.
이때 func()의 return이 없으니까 뭐 아무 것도 출력하지 않겠지~라는 생각으로 실행한다면, print()의 반환값 때문에 result는 None을 출력한다. 혹은 출력하는 방식이나 값이 list인지, dict인지, 문자열인지에 따라서도 달라진다. └ 예를 들면 [None, None, None]와 같은 형태로 출력할 수도 있다는 이야기이다. 고로 내게 필요한 코드만 있는지 확인하는 것이 중요하다.
print(...)
# print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
# Prints the values to a stream, or to sys.stdout by default.
# Optional keyword arguments:
# file: a file-like object (stream); defaults to the current sys.stdout.
# sep: string inserted between values, default a space.
# end: string appended after the last value, default a newline.
# flush: whether to forcibly flush the stream.
return 값 외에도 Python docs에서 print를 찾아보면 많은 parameter를 갖는 것을 볼 수 있다. sep는 출력하는 값 사이에 끼워서 출력할 값을 설정한다. default는 공백(ASCII 32번 SP)이다. end는 문장 맨 뒤에 출력할 값을 설정한다. default는 \n이다. file은 file에 값을 쓸 지 설정한다. default는 sys.stdout으로 출력이다. └ 예를 들어 print("Hello, World!", file = f)라고 하면, 출력 대신 f라는 file에 작성한다. 물론 f을 선언해둔 상태여야 한다. flush는 buffered 상태일 때 값을 바로 출력한다. default는 False이다. └ 기본적으로 print()는 buffer에 값을 저장한 뒤, 그 값을 출력한다. 이런 buffering 과정을 생략한다는 것이다. └ False 상태임에도 end parameter가 \n인 경우 내용을 바로 flush한다.
어려운 문제들에 도전하고, 간단한 문제들을 최대한 간결하게 풀려 노력하고 있다. 어째 그럴수록 기본 내장함수나 동작 구조들에 대해서 더 자세하게 알아야 하는 상황이 발생한다. 기본에 충실하자.
고민을 시작한 문제 출처 :https://www.acmicpc.net/problem/6603 참고한 문서 자료 : https://stackoverflow.com/questions/37084246/printing-using-list-comprehension 참고한 문서 자료 : https://docs.python.org/ko/3/library/functions.html#print 참고한 웹 사이트 : https://velog.io/@janeljs/python-print-sep-end-file-flush
name = input() # steve
age = int(input()) # 23
string = name + "is" + str(age) + "years old."
print(string) # steve is 23 years old.
보통 문자열을 더하는(이어주는) 코드를 짤 때 '+' 연산자를 사용한다.
이럴 때 문제점은 전부 string으로 형반환해줘야 한다.
그리고 각 문자열에 " "를 사용해 문자열임을 명시해줘야 한다는 점이다.
name = input() # steve
age = int(input()) # 23
# Example 1
string = f"{name} is {age} years old."
print(string) # steve is 23 years old.
# Example 2
string = f"He is {age-3} years old in 2020."
print(string) # He is 20 years old in 2020.
Python 3.6 이후 버전부터는 이를 f-string으로 해소할 수 있다.
Example 1처럼 f" " 안에 문자열을 작성하고, { } 안에 매개변수를 적어주면 그에 대응하는 값을 출력한다.
Example 2처럼 { } 안에 계산식을 입력하는 것도 가능하다.
# string : s / int : d / float : f
# left : null or < / center : ^ / right : >
text = "Never say never"
print(f"{text:20s}") # Never say never
print(f"{text:^20s}") # Never say never
print(f"{text:>20s}") # Never say never
number = 123456789
print(f"{number:<20d}") # 123456789
print(f"{number:^20d}") # 123456789
print(f"{number:>20d}") # 123456789
pi = 3.141592
print(f"{pi:<15f}") # 3.141592
print(f"{pi:^15f}") # 3.141592
print(f"{pi:>15f}") # 3.141592
이때 서식 지정자를 사용하여 글자를 정렬하는 것도 가능하다.
{ } 안에 colon(:)을 기준으로 왼쪽에는 변수를, 오른쪽에는 '정렬기호 + 자릿수 + 서식 지정자' 알파벳으로 적어준다.
< ^ > 는 각각 왼쪽, 가운데, 오른쪽 정렬을 하라는 정렬 기호이다.
이때 왼쪽 정렬은 < 대신 아무것도 쓰지 않아도 된다. (text 예시)
그리고 변수형에 따라 s(문자열), d(정수), f(실수)를 맞춰 작성해 주어야 한다.
number = 3.141592
print(f"number is {number:.2f}") # number is 3.14
number = 1
print(f"number is {number:.2f}") # number is 1.00
소수점 자리를 지정해줄 수도 있다.
{ } 안에 colon(:)을 기준으로 왼쪽에는 숫자를, 오른쪽에는 ".자릿수f" 형태로 적어준다.
위의 코드처럼 number:.2f로 적게 되면 number 변수를 소수점 둘째 자리까지 출력하라는 의미이다.