가상 환경(virtual environment)
: pip라는 패키지 인스톨러를 사용해 패키지들을 설치하고 관리할 때, 가상환경을 활용하여 각 프로젝트마다 독립적인 환경을 구성해주므로써 호환성 문제를 최소화 시킬 수 있다.
코드 컨벤션
: 스타일을 통일하자는 "약속"
파이썬 컨벤션 가이드 PEP-8
코드 컨벤션은 언어에 따라 요구하는 내용이 다름.
파이썬에서는 네이밍 컨벤션으로
변수/함수를 네이밍할 때는 Snake 표기법을, Class를 네이밍할 때는 Pascal 표기법을 사용
네이밍 컨벤션
: 대표적으로 Pascal, Snake, Camel 표기법이 존재
Pascal
: PythonIsVeryGood ;각 단어를 대문자로 구별Camel
: pythonIsVeryGood ;Pascal과 동일하지만, 첫 문자가 소문자로 시작Snake
: pythonis_very_good ;각 단어를 언더바( )로 구분변수 유효 범위(variable scope)
변수 유효 범위
: 변수가 선언된 위치나 키워드에 따라 변수를 사용할 수 있는 범위가 달라지게 되는데, 이를 변수 유효 범위 혹은 variable scope라고 부른다.
유효 범위에 따라 지역 변수(local variable)와
전역 변수(global variable)로 나뉜다.
지역 변수(local variable); 함수 내부에서 선언되며 다른 함수에 영향X. global 키워드를 사용해 전역 변수로 재선언할 수 있음.
def func1():
number = 10 # 함수 내에서 number라는 지역 변수를 선언
def func2():
print(number) # func1에서 생성된 지역 변수는 funt2에서 접근할 수 없다.
func1()
func2()
"""
Traceback (most recent call last):
File "sample.py", line 8, in <module>
func2()
File "sample.py", line 5, in function2
print(number)
NameError: name 'number' is not defined
"""
전역 변수(global variable); 함수 밖에서 선언되며 어디서든 접근가능.
number = 10 # 함수 밖에서 number라는 전역 변수 생성
def func():
print(number) # 전역 변수는 자유롭게 접근할 수 있다.
func() # 함수를 실행하면 10이 정상적으로 출력된다.
*전역 변수를 권장하지 않음.
: 코드가 길어질수록 전역 변수로 선언 된 값은 어디서 값이 변했는지 추적하기 어렵고, 문제가 생겼을 때 디버깅을 하기 어려워짐. 참고) stackoverflow의 글
#이런 방식으로 하기
test = 123
def func():
return 456
def func2(value):
print(value)
result = func()
func2(result)
- 자주 사용되는 모듈 및 패턴
조건문 심화
# == ;값이 일치하는지 비교
"a" == "a" # True
"a" == "b" # False
1 == "1" # False, 값은 동일하지만 자료형이 다르기 때문
# != ;값이 일치하지 않는지 비교
0 != 1 # True
0 != 0 # False
# >, < ;값이 큰지 작은지 비교
5 > 2 # True
1 < 0 # False
1 > 1 # False
# >=, <= ;값이 크거나 같은지, 작거나 같은지 비교
1 >= 1 # True
# in ;특정 값이 list / tuple / set에 포함되어 있는지 확인
4 in [1, 2, 3] # False
1 in (1, 2, 3) # True
# 모든 비교 연산자의 결과는 print()로 확인할 수 있다
print(1 == 1) # True
if condition: # 조건이 True일 경우
# some code
# not 키워드를 사용할 경우 조건이 False일 때 실행
elif not condition: # 조건이 False일 경우
# some code
else: # 위 조건들 중 만족하는게 없을 경우
# some code
if condition1 and condition2: # 두 조건을 모두 만족할 경우
# some code
elif condition or condition: # 두 조건 중 하나라도 만족할 경우
# some code
else:
# some code
empty_string = ""
empty_list = []
if not empty_string:
print("string is empty!!")
if not empty_list:
print("list is empty!!")
print(bool(""))
print(bool(0))
print(bool([]))
print(bool("sample"))
print(bool([1, 2]))
print(bool(1))
print(bool(-1)) # 0이 아닌 숫자는 True로 판단
# sample result
"""
False
False
False
True
True
True
True
"""
# all() : 요소들이 모두 True일 경우 True 리턴
if all([True, True, True, False, True]):
print("통과!") # False가 존재하기 때문에 분기문을 통과하지 못함
# any() : 요소들 중 하나라도 True일 경우 True 리턴
if any([False, False, False, True, False]):
print("통과!") # True가 1개 이상 존재하기 때문에 분기문을 통과함
함수의 인자와 리턴 타입
리턴 타입에 따른 활용 방법
: 함수들마다 사용법과 리턴 타입들이 다르다. 그렇기 때문에 특정 기능을 사용할 때 해당 기능의 결과물이 어떤 데이터를 리턴해 주는지 알아야 한다.
사용하는 코드의 리턴 타입을 확인하는 방법
try / exception을 활용한 에러 처리
number = "num"
try: # try 구문 안에서 에러가 발생할 경우 except로 넘어감
number = int(number) # "num"을 숫자로 바꾸는 과정에서 에러 발생
except: # 에러가 발생했을 때 처리
print(f"{number}은(는) 숫자가 아닙니다.")
number = input()
try:
int(number)
10 / number
except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
print(f"{number}은(는) 숫자가 아닙니다.")
except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
print("0으로는 나눌수 없습니다.")
except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
print(f"예상하지 못한 에러가 발생했습니다. error : {e}")
# except 문법 또한 if / elif와 같이 연달아서 작성할 수 있음.
패킹과 언패킹
: 패킹(packing)과 언패킹(unpacking)은 단어의 뜻 그대로 요소들을 묶어주거나 풀어주 것의 의미. list 혹은 dictionary의 값을 함수에 입력할 때 주로 사용.
list에서의 활용
def add(*args):
result = 0
for i in args:
result += i
return result
numbers = [1, 2, 3, 4]
print(add(*numbers))
""" 아래 코드와 동일
print(add(1, 2, 3, 4))
"""
# result output
"""
10
"""
dictionary에서의 활용
def set_profile(**kwargs):
profile = {}
profile["name"] = kwargs.get("name", "-")
profile["gender"] = kwargs.get("gender", "-")
profile["birthday"] = kwargs.get("birthday", "-")
profile["age"] = kwargs.get("age", "-")
profile["phone"] = kwargs.get("phone", "-")
profile["email"] = kwargs.get("email", "-")
return profile
user_profile = {
"name": "lee",
"gender": "man",
"age": 32,
"birthday": "01/01",
"email": "python@sparta.com",
}
print(set_profile(**user_profile))
""" 아래 코드와 동일
profile = set_profile(
name="lee",
gender="man",
age=32,
birthday="01/01",
email="python@sparta.com",
)
"""
# result print
"""
{
'name': 'lee',
'gender': 'man',
'birthday': '01/01',
'age': 32,
'phone': '-',
'email': 'python@sparta.com'
}
"""