유용한 파이썬 기능들을 모아놓은 글입니다. 의견은 언제나 환영입니다.
이 기능은 파이썬 3.6 버전부터 사용할 수 있습니다.
F-String 포매팅은 문자열의 특정 부분을 바꾸고 싶을 때 유용하게 사용할 수 있습니다.
>>> name = "Gil-dong"
>>> age = 10
>>> print(f"Hello, My name is {name}, I'm {age+10} years old")
Hello, My name is Gil-dong, I'm 20 years old
이렇게 문자열 앞에 f만 써주면 {}안에 있는 변수, 표현식 등을 문자열에 넣을 수 있습니다.
else는 보통 if문과 같이 나오는 것이라고 알고 계신분이 많을겁니다. 하지만 파이썬에선 다른 기능이 있습니다. 바로 For문이 중간에 Break문으로 빠져나오는지 판단하는 것이죠. 원래는 Flag변수를 사용해 판단하지만, else문을 사용하여 빠져나온 경우를 편하게 처리할 수 있습니다.
for _ in range(10):
ans = input("Input answer :")
if ans == "answer":
print("success")
break
else:
print("fail")
이런 식으로 사용자가 10번 안에 answer를 입력한다면 success가, 입력하지 못한다면 else문 안에 있는 fail이 출력됩니다.
eval함수는 인수로 받은 문자열(str)로된 파이썬 표현식을 인터프리터가 번역하여 실행해 결과를 반환합니다. 하지만 표현식만을 입력받기 때문에 'x = 1 + 2'같은 실행문을 입력받으면 SyntaxError를 일으킵니다.
>>> num = 10
>>> num = eval("num + 90")
>>> num
100
exec함수는 인수로 받은 문자열(str)을 실행합니다. 반환값은 없습니다.
>>> num = 10
>>> exec("num = 100")
>>> num
100
또한 여러개의 코드를 실행할 수도 있습니다.
>>> code = """
a = 1
b = 100
print(a+b)
"""
>>> exec(code)
101
eval과 exec함수는 분명 편리한 기능이긴 하나, 입력을 제한하지 않으면 커맨드 인젝션 공격에 노출될 수 있습니다. 가령 다음과 같은 코드에선,
x = str(input("계산할 식을 입력하세요 : "))
print(eval(x))
사용자가 정말 표현식만 입력한다면 아무런 문제가 없는 코드지만, 만약 다음과 같은 코드를 입력하면
계산할 식을 입력하세요 : __import__("os").listdir()
>>> ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'python3.dll', 'python39.dll', 'pythonw.exe', 'Scripts', 'share', 'tcl', 'Tools', 'vcruntime140.dll', 'vcruntime140_1.dll']
이렇게 디렉토리가 노출됩니다. listdir()가 아니라 system("rm -rf/")
였다면... 대형 참사로 이어질 수 있겠죠. 따라서 사용자의 입력을 제한없이 받는건 위험합니다. 그러니 꼭 필요한 경우에만 사용하시는걸 권장합니다.
파이썬은 삼항연산자를 지원하지 않습니다. 대신 if문을 이용해 이를 구현할 수 있습니다.
[조건] ? [True값] : [False값] #C, Java style
[True값] if [조건] else [False값] #Python style
파이썬의 삼항연산자는 다른 언어와는 조금 다른 형태를 띄고 있습니다.
>>> a = 0
>>> b = True if a == 0 else False
>>> b
True
eval과 exec의 경우 입력된 코드를 그대로 실행시킨다는 점에 의하여 보안취약점이 발생할 수 있으므로, 주의사항도 같이 적어주시면 좋을 것 같아요!!