본문 바로가기

공부 일지 #10 | Python Utility

@studying:)2025. 7. 30. 15:49

학습날짜: 2025.07.28 ~ 2025.07.29


🟩 Python Utility

 

1. Zip function

  • 더 작은 인덱스를 가진 변수 기준에 맞춰 같은 인덱스를 가진 값들을 튜플로 묶음
  • 인덱스를 기준으로 묶음으로 인덱싱할 수 있는 거라면(리스트, 문자열 등) 모두 packing 가능

2. Deep Copy vs Shallow Copy

  • Shallow Copy
    • 얕은 복사. 
    • immutable한 변수에서는 값이 수정되지 않기 때문에 복사 id 주소가 복사되는 것임.
      • a = 10; a = b → a, b의 id 값이 같음
      • b= 20 → b의 id 값이 a와 달라짐.
    • mutable한 변수에서 문제가 생김.
  • Deep Copy
    • 깊은 복사.
    • 객체 자체를 copy하는 것이 아닌 값만 복사해서 새 변수에 넣는 방식
    • 따라서, 복사본을 수정해도 원본이 수정되지 않음
    • import copy 필요

출력 값: ['a', 'b', 'c', 'd'] ['a', 'b', 'X', 'd']


3. List Comprehension

  • 연속된 수 또는 문자열을 만들기 위해서 리스트 내부에서 loop를 돌리는 방식
  • 패턴1. list = [ A for i in range(num) ]
  • 패턴2. list = [ A for i in range(num) if 조건 ]
  • 패턴3. list = [ A if 조건 else B for i in range(n) ]

4. Lambda Expressons : 이름이 없는 function

  • 간단한 함수의 경우, Lambda를 사용하면 간편하고 간결하게 코드를 작성할 수 있음
def add(x, y):
    return x + y

print(add(10, 20))


#위 함수를 lambda function 으로 수정해보기

f=lambda x,y: x+y
print(f(10,20))


#위 코드에서 특정 변수에 lambda함수를 넣지 않고 사용하는 방법
print((lambda x,y: x+y)(10,20))
#map 함수와 lambda 연계하기
#map(function, *iter)
#위의 x, y를 사용할 수 없으므로, 하나의 변수 x로 받은 후, index를 이용해서
#위 함수와 동일한 효과를 내게 만듬
# clone

x = ["1", "2", "3"]

list_x = list(map(int, x))
print(list_x)

# -------------------------

x = [1,2,3]
y = [4,5,6]

result = list(map(lambda v:v[0]+v[1], zip(x, y)))
print(result)

# -------------------------

test = [100, 200, 300]

# result: [101,201,301] | using lambda fn, list comprehension

t_result = [(lambda t: t+1)(t) for t in test]
print(t_result)

# ver2
f = lambda x: [i+1 for i in x]
print(f(test))

5.  Generators

  • return 대신 yield statment가 있는 function.
    • yield statement로 그 function의 state를 save한 후, return.
    • generator가 다시(next())call되면 sate는 복구됨(그 전 data value들을 모두 기억함.)
    • yield의 다음 statement에서 resume됨
  • 종류 중 하나로 list generator가 있음. 대표적으로 range() 함수
  • iter, next 함수를 구현하고 있음.
    • iter: 반복 구조를 만듦
    • next: 다음으로 넘어가게 하는 기능
  • 사용시 for문과 함게 사용해야 함
def gen_fib(n):
  """generate a Fibonacci series up to n. """
  a, b = 0, 1

  while (a < n):
    yield a # yield를 탑재하고 있는 변수를 generator라고 부름
    # 위 행에서 바로 a 값을 전송(출력), 잠시 pause되고, 아래 행부터 다시 실행
    # gen_fib()가 두번째이상 call되면 yield a 부터 다시 시작
    a, b = b, a+b
    # 이를 통해 8byte만 있어도 피보나치 수열 생성 가능

gen_fib(2000)

#사용방법 
for fib in gen_fib(100000):
  print(fib, end=",")

#print 값:
# 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,
# 17711,28657,46368,75025,

6. Catching and handlign exceptions

  • 발생한 exception을 catch해서 처리할 수 있음
  • 대부분의 에러 상황을 모두 외워서 처리하기는 어렵기 때문에, 모든 예외를 포괄적으로 처리할 수 있는 '최상위 예외 클래스(Mother Exception)'가 존재
# 활용 예시1
while True:
  try:
    x = int(input("Please enter a number: ")) #abc와 같이 문자열을 입력하면, int()과정에서 ValueError가 발생.
  except ValueError: #exception이 ValueError 종류라면 이 구문이으로 catch됨
    print("Oops! That was no valid number. Try again...")
  else: #No Exception occurs
    print(x)
    break
    
# 활용 예시2
def divide(x ,y):
  try:
    result = x / y
  # except ZeroDivisionError:
  #   print("division by zero!")
  except Exception as e: # Error 이름 모를 때, 부모가 되는 Exception을 사용해줌.
    # 그러면 Name, Value 등 모든 오류가 걸림
    print(e)
  else:
    print("result is", result)
studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차