Lina's Toolbox

파이썬 문법 심화 / 튜플, 집합(Set), f-string, 파일 불러오기, map, filter, lambda, *args, **kwargs 등 본문

스파르타 내일 배움 캠프 AI 웹개발 과정/python

파이썬 문법 심화 / 튜플, 집합(Set), f-string, 파일 불러오기, map, filter, lambda, *args, **kwargs 등

Woolina 2024. 7. 8. 13:07


튜플 (tuple)

 

리스트와 비슷하지만 불변인 자료형(무언가를 더하거나 뺄 수 없다.)

순서는 존재한다.

a = (1,2,3)

print(a[0])

 

# 예를 들어 이런 작업은 불가함!!

a = (1,2,3)
a[0] = 99

 

# 주로 딕셔너리 대신 리스트와 튜플로 딕셔너리 '비슷하게' 만들어 사용해야 할 때 많이 쓰임

a_dict = [('bob','24'),('john','29'),('smith','30')]

 


집합 (Set)

 

중복을 제거해줌

a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]

a_set = set(a)

print(a_set)

 

#교집합 / 합집합 / 차집합

a = ['사과','감','수박','참외','딸기']
b = ['사과','멜론','청포도','토마토','참외']

a_set = set(a)
b_set = set(b)

print(a_set & b_set)  # 교집합
print(a_set | b_set)  # 합집합
print(a_set-b_set)  # 차집합

 


예외처리

 

try - except 문

에러가 있어도 건너뛰게 할 수 있는 방법 -> 에러가 나더라도 코드가 멈추지 않고 실행 될 수 있다.

어떤 에러가 발생하는 지에 따라서도 다른 처리를 할수 있다.

📌 실무에서
서버콜 할 때 자주 사용한다. 
많이 사용하면, 어디서 에러가 났는 지 파악이 힘들어지므로, 실제 프로젝트에서는 남용 ❌

 

# 딕셔너리에 없는 key로 추출하면 에러가 발생한다.
# bobby는 다음과 같이 age가 없는 상황

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby'},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]


for person in people:
    try: # 이걸 시도해보고
        if person['age'] > 20:
            print (person['name'])
    except: # 에러가 있으면 이걸 대신 실행해!
        name = person['name']
        print(f'{name} - 에러입니다')

 


파일 불러오기

 

코드를 여러개의 파일로 분리할 수 있다.

 

분리하고 싶은 코드를 복사하여 새로운 파일(ex.main_func.py)을 만든 후 거기에 내용을 붙여넣고,

 

main_test.py

from main_func import *

say_hi()

*란 해당 파일 전체를 사용하는 것

 

from main_func import say_hi_to

def say_hi():
	print('안녕!')

이와 같이 특정함수만 사용할 수도 있지만,

 

90% 이상 보통 import *를 사용한다.

 


한 줄 축약

 

if문 - 삼항연산자

참일 때 값 if 조건 else 거짓일 때 값 

 

num = 3

if num%2 == 0:
    result = "짝수"
else:
    result = "홀수"

print(f"{num}은 {result}입니다.")

이 코드를

 

num = 3

result = "짝수" if num%2 == 0 else "홀수"

print(f"{num}은 {result}입니다.")

이렇게 적는 것!

 

 

for 문

a_list  = [1, 3, 2, 5, 1, 2]

b_list = []
for a in a_list:
    b_list.append(a*2)

print(b_list)

이 코드를

 

a_list  = [1, 3, 2, 5, 1, 2]

b_list = [a*2 for a in a_list]

print(b_list)

이렇게 적을 수 있다.

 


 

map

 

map(function, iterable)

  • function: 함수
  • iterable: 반복 가능한 객체

두 번째 인자로 들어온 반복 가능한 자료형 (리스트나 튜플)을 첫 번째 인자로 들어온 함수에 하나씩 집어넣어서 함수를 수행하는 함수

def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'

result = map(check_adult, people)
print(list(result))

 

 

lambda

 

이름이 없는 함수. 일반적으로 함수를 한 번만 사용하거나 함수를 인자로 전달해야 하는 경우에 사용

lambda 인자 : 표현식
def add(x, y):
    return x + y
    
add = lambda x, y: x + y

관용적으로 x로 사용

 

 

map 함수와의 사용

def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'

result = map(check_adult, people)
print(list(result))

이 코드도

result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))

이렇게 작성할 수 있다.

 

 

 

filter

 

리스트의 모든 원소 중 특별한 것만 뽑기

list()로 감싸준 뒤 출력해야함!

 

1. lambda와 사용

#20보다 큰 요소만 뽑기

result = filter(lambda x: x['age'] > 20, people)

print(list(result)) 

# list(result) - list로 묶어주지 않으면 그냥 오브젝트 id로 나온다.

 

2. 사용자 정의 함수를 사용

def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(is_even, numbers))
print(even_numbers)  # 출력: [2, 4, 6, 8, 10]

 

3. 내장함수를 사용

filter 함수는 None을 첫 번째 인수로 사용할 때, 이터러블에서 False인 값을 제거하는 역할을 할 수 있다.

values = [0, 1, False, 2, '', 3, None, 4, 'five']
filtered_values = list(filter(None, values))
print(filtered_values)  # 출력: [1, 2, 3, 4, 'five']

 


오브젝트

 

파이썬에서 "오브젝트(object)"는 파이썬 프로그램 내에서 사용할 수 있는 모든 데이터를 의미한다.

파이썬의 모든 데이터는 객체!

여기에는 숫자, 문자열, 리스트, 딕셔너리, 함수, 클래스 인스턴스 등이 포함된다.

 

객체의 특성 세 가지

  1. 타입(type): 객체는 특정 데이터 타입을 가집니다. 예를 들어, 정수는 int 타입이고, 문자열은 str 타입입니다.
  2. 속성(attributes): 객체는 관련된 데이터를 가질 수 있습니다. 예를 들어, 리스트 객체는 특정 인덱스에 접근할 수 있는 속성을 가집니다.
  3. 메서드(methods): 객체는 해당 객체에 관련된 동작(함수)을 가질 수 있습니다. 예를 들어, 리스트 객체는 append() 메서드를 통해 요소를 추가할 수 있습니다.

 

 

함수의 매개변수

 

* 직접 쓰는 것보단 알고 있으면 내장함수 등을 사용할 때 도큐먼트를 읽는 데 도움이 되는 내용들

# 함수에 인수를 넣을 때, 어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있다. 순서 상관 없음!

def cal(a, b):
    return a + 2 * b

print(cal(3, 5))
print(cal(5, 3))
print(cal(a=3, b=5))
print(cal(b=5, a=3))
#특정 매개변수에 디폴트 값을 지정해줄 수 있다.

def cal2(a, b=3):
    return a + 2 * b

print(cal2(4))
print(cal2(4, 2))
print(cal2(a=6))
print(cal2(a=1, b=7))

 

 

 

몇 개의 인자를 받을지 알 수 없을 때 / 위치 인수들을 튜플 형태로 받기 *args

# 입력값의 개수를 지정하지 않고 모두 받는 방법!

def call_names(*args):
    for name in args:
        print(f'{name}야 밥먹어라~')

call_names('철수','영수','희재')

💡 args가 아닌 어떤 단어를 넣어도 상관없지만, 관용적으로 arguments의 args를 사용한다.

 

 

 

몇 개의 인자를 받을지 알 수 없을 때 / 키워드 인수들을 딕셔너리 형태로 받기 **kwargs

#키워드 인수를 여러 개 받는 방법!

def example_function(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

example_function(name="Alice", age=30)  # 출력: name: Alice age: 30
example_function(country="USA", hobby="reading")  # 출력: country: USA hobby: reading

딕셔너리로 쓸 수 있게 만들어준다!

💡 마찬가지로 다른 단어도 상관 없지만, 관례적으로 keyword arguments의 kwargs

 

 

 

클래스

 

class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        if self.hp < 0:
            self.alive = False

    def status_check(self):
        if self.alive:
            print('살아있다')
        else:
            print('죽었다')

m = Monster()
m.damage(120)

m2 = Monster()
m2.damage(90)

m.status_check()
m2.status_check()