IT/Python

Python ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์ •๋ฆฌ

zi0_0 2025. 2. 9. 21:51

 

 

๋žŒ๋‹ค ํ•จ์ˆ˜ 

`lambda` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๋Š” ์ต๋ช… ํ•จ์ˆ˜ 
- ํ•จ์ˆ˜ ์ด๋ฆ„ ์—†์ด ์งง๊ณ  ๋‹จ์ˆœํ•œ ๋กœ์ง์„ ์ž‘์„ฑํ•  ๋•Œ ์œ ์šฉ 
  • ์–ธ์ œ ์‚ฌ์šฉ?
    • ์ƒํ™ฉ : ์งง์€ ํ•จ์ˆ˜๋ฅผ ํ•œ์ค„๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ, map() filter() sort() ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ 
    • ์‚ฌ์šฉ ์ด์œ  : ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ, ๊ฐ„๋‹จํ•œ ๋ณ€ํ™˜์„ ์‰ฝ๊ฒŒ ์ ์šฉ 
# ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์ •์˜
def add(x, y):
    return x + y

# ๋žŒ๋‹ค ํ•จ์ˆ˜ ์ •์˜
add_lambda = lambda x, y: x + y

# ๊ฒฐ๊ณผ ํ™•์ธ
print(add(3, 5))        # ์ถœ๋ ฅ: 8
print(add_lambda(3, 5)) # ์ถœ๋ ฅ: 8
# ํ•จ์ˆ˜ ์ด๋ฆ„ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ (์ •๋ ฌ ํ™œ์šฉ)
data = [(1, 2), (3, 1), (5, 0)]

# ๋‘ ๋ฒˆ์งธ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
sorted_data = sorted(data, key=lambda x: x[1])
print(sorted_data)  # ์ถœ๋ ฅ: [(5, 0), (3, 1), (1, 2)]

 

 

ํด๋ž˜์Šค, ์ธ์Šคํ„ด์Šค, ์†์„ฑ

ํด๋ž˜์Šค

  • ํด๋ž˜์Šค = ์„ค๊ณ„๋„
  • ๊ฐ์ฒด (์ธ์Šคํ„ด์Šค)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ‹€๋กœ, ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•จ
class Person:
    def __init__(self, name, age):
        self.name = name  # ์ด๋ฆ„ ์†์„ฑ
        self.age = age    # ๋‚˜์ด ์†์„ฑ

    def say_hello(self):  # ๋ฉ”์„œ๋“œ (๋™์ž‘)
        print(f"์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ {self.name}์ž…๋‹ˆ๋‹ค!")

์ธ์Šคํ„ด์Šค

  • ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์‹ค์ œ ๊ฐ์ฒด
  • ํด๋ž˜์Šค = ์„ค๊ณ„๋„, ์ธ์Šคํ„ด์Šค = ์„ค๊ณ„๋„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์‹ค์ œ ๋ฌผ๊ฑด
person1 = Person("์ง€์˜", 25)  # ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
person2 = Person("๋ฏผ์ˆ˜", 30)  # ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

# ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ
print(person1.name)  # ์ถœ๋ ฅ: ์ง€์˜
print(person2.name)  # ์ถœ๋ ฅ: ๋ฏผ์ˆ˜

์†์„ฑ

: ํด๋ž˜์Šค๋‚˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ

 

1. ํด๋ž˜์Šค ์†์„ฑ

  • ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•œ ๋ณ€์ˆ˜
  • ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ฐ’
  • ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ •์˜ํ•˜๋ฉฐ, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด๋„ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์Œ
class MyClass:
    number = 100  # ํด๋ž˜์Šค ์†์„ฑ

obj1 = MyClass()
obj2 = MyClass()

print(obj1.number)  # ์ถœ๋ ฅ: 100 (ํด๋ž˜์Šค ์†์„ฑ ์ฐธ์กฐ)
print(obj2.number)  # ์ถœ๋ ฅ: 100 (ํด๋ž˜์Šค ์†์„ฑ ์ฐธ์กฐ)

MyClass.number += 10  # ํด๋ž˜์Šค ์†์„ฑ ๋ณ€๊ฒฝ
print(obj1.number)  # ์ถœ๋ ฅ: 110 (๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ ๊ณต์œ ๋จ)
print(obj2.number)  # ์ถœ๋ ฅ: 110

 

2. ์ธ์Šคํ„ด์Šค ์†์„ฑ

  • ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ๋ณ€์ˆ˜
  • ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฐ’์œผ๋กœ, ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์™€ ๊ณต์œ ํ•˜์ง€ ์•Š์Œ
  • __init__ ๋ฉ”์„œ๋“œ์—์„œ ์ •์˜
class MyClass:
    def __init__(self, value):
        self.value = value  # ์ธ์Šคํ„ด์Šค ์†์„ฑ

obj1 = MyClass(100)
obj2 = MyClass(200)

print(obj1.value)  # ์ถœ๋ ฅ: 100 (obj1์˜ ์†์„ฑ)
print(obj2.value)  # ์ถœ๋ ฅ: 200 (obj2์˜ ์†์„ฑ)

obj1.value += 10  # obj1์˜ ์†์„ฑ ๋ณ€๊ฒฝ
print(obj1.value)  # ์ถœ๋ ฅ: 110
print(obj2.value)  # ์ถœ๋ ฅ: 200 (obj2๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ)

 

ํด๋ž˜์Šค ์ƒ์†

๊ธฐ์กด ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค (์ž์‹ ํด๋ž˜์Šค)๊ฐ€ ๋ฌผ๋ ค ๋ฐ›๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ
- ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def printinfo(self):
        print(self.name, self.age)

    def getinfo(self):
        return self.name + ', ' + str(self.age)

class Student(Person):
    def __init__(self, name, age, department, id):
        super().__init__(name, age) # ๊ผญ ๋ชจ๋“  ์ธ์ž๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„์•ผํ•จ (1๊ฐœ๋งŒ ๋ฐ›๊ธฐ ์•ˆ๋จ)
        self.department = department
        self.id = id
    
    def printstuinfo(self):
        name_age = super().getinfo() # ๋ถ€๋ชจํด๋ž˜์Šค์˜ getinfo() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•˜์—ฌ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์Œ
        print(name_age)
        print('%s๋‹˜์˜ ํ•™๊ณผ:%s, ํ•™๋ฒˆ:%s' % (self.name, self.department, self.id))

x = Student('ํ™์ง€์ˆ˜', 20, '์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™๊ณผ', '2014') 
x.printinfo() # ํ™์ง€์ˆ˜ 20
x.printstuinfo() # ํ™์ง€์ˆ˜, 20 / ํ™์ง€์ˆ˜๋‹˜์˜ ํ•™๊ณผ:์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™๊ณผ, ํ•™๋ฒˆ:2014
  • super().__init__(name)์„ ํ†ตํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ init ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”
- super() : ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ์˜ค๋ฒ„๋ผ์ด๋”ฉ
- overriding : ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ 

 

 

 

Decorator

๊ธฐ์กด ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€
- ํ•จ์ˆ˜ ์•ˆ์— ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ธฐ๋Šฅ
    • ํ•จ์ˆ˜ ์•ˆ์— ํ•ด์ค˜์•ผ ๋˜๋Š” ๋‚ด์šฉ๋“ค์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด ๋‚ผ ์ˆ˜ ์žˆ์Œ 
    • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ ์ธก๋ฉด์—์„œ ๊ต‰์žฅํžˆ ์ข‹๋‹ค
    • ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ „ํ›„์— ํ•„์š”ํ•œ๊ฒŒ ์žˆ์œผ๋ฉด `decorator` ๊ธฐ๋Šฅ ํ™œ์šฉํ•˜๋ฉด ์ข‹๋‹ค 
def my_decorator(func):
  def wrapper():
    print('ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „')
    func()
    print('ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„')
  return wrapper

def say_hello():
  print('์•ˆ๋…•ํ•˜์„ธ์š”!')

say_hello(); print() # ์•ˆ๋…•ํ•˜์„ธ์š”
say_hello = my_decorator(say_hello); say_hello() # ํ•จ์ˆ˜ํ˜ธ์ถœ์ „, ์•ˆ๋…•ํ•˜์„ธ์š”, ํ•จ์ˆ˜ํ˜ธ์ถœํ›„


# ----- decorator ์ ์šฉํ•˜๋ฉด -----
@my_decorator
def say_hello():
  print('์•ˆ๋…•ํ•˜์„ธ์š”!')

say_hello() # ํ•จ์ˆ˜ํ˜ธ์ถœ์ „, ์•ˆ๋…•ํ•˜์„ธ์š”, ํ•จ์ˆ˜ํ˜ธ์ถœํ›„

 

* ์ข€๋” ํ™œ์šฉ ์˜ˆ์‹œ 

def validate_positive_number(func):
    def wrapper(arg):
        if arg < 0:  # ์ธ์ž๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ
            raise ValueError("์ธ์ž๋Š” 0๋ณด๋‹ค ์ปค์•ผ(positive) ํ•ฉ๋‹ˆ๋‹ค.")
        return func(arg)  # ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์›๋ž˜ ํ•จ์ˆ˜ ์‹คํ–‰
    return wrapper

def validate_integer(func):
    def wrapper(arg):
        if not isinstance(arg, int) or arg < 0:  # ์ •์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ
            raise ValueError("์ธ์ž๋Š” ์ž์—ฐ์ˆ˜(integer)์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
        return func(arg)  # ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์›๋ž˜ ํ•จ์ˆ˜ ์‹คํ–‰
    return wrapper


# ----- ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ -----
@validate_positive_number
@validate_integer
def process_number(num):
    print(f"์ˆซ์ž ๊ฒ€์ฆ: {num}")

process_number(1.1) # ์—๋Ÿฌ ๋ฐœ์ƒ : ๋‘๋ฒˆ์งธ (validate_integer) ๋งŒ์กฑ ์•ˆํ•จ

 

 

Copy