python - tuple/ set, f-string, try-except,파일분리, 삼항연산자, map,filter,lambda 식, 함수심화 정리

권수민·2023년 8월 18일
1

1) 튜플 (tuple)

튜플은 불가변속성을 가진 리스트라고 볼 수 있습니다.
리스트나 딕셔너리에서는 안의 데이터, 속성을 바꿀수 있었는데요
튜플은 불가능합니다!

그렇지만 순서는 존재하죠!

a = (1,2,3)

print(a[0]) => 1

a[0] = 99 => 바꿀 수 없습니다!

주로 사용할때는 딕셔너리 대신 리스트와 튜플로 딕셔너리와 비슷하게 만들어 사용해야 할때 많이 쓰이는데, 불변할 내용을 담겠죠??

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

2) 집합 (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) => [1,2,3,4,5]

교집합/합집하/차집합 이렇게 구할수도 있는데!
여기서 조심해야할 점은 list로는 '&'/'|'/ '-'을 사용할 수 없어요!
그렇기에 set로 타입을 바꿔줘야 한답니다!

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']

set_a = set(student_a)
set_b = set(student_b)

print(set_a - set_b) # 차집합  A가 들은 수업 중, B가 듣지 않은 수업을 찾아보기
print(set_a & set_b)  # 교집합 A가 와 B가 같이 들은 수업을 찾아보기
print(set_a | set_b)  # 합집합  A가 와 B가 각각 들은 수업 찾아보기

3) f-string

fstirng 이란 변수의 값을 문자열과 합쳐 프린트할때 더 직관적이고 편하고 유용하게 쓰이는 함수이다.

for s in scores:
    name = s['name']
    score = str(s['score'])
    print(name+'는 '+score+'점 입니다')
    print('%s는 %d점 입니다', %(name, score))
    print("{0}는 {1}점 입니다",.format(name, score))
   
    =>print(f'{name}은 {score}점입니다')

4) try - except 문

이 것을 사용할땐 에러가 있어도 건너띄게 할 수 있는 방법인데, 예외처리를 한다고 보면된다.

하지만 이것을 남용하다가는 수천개의 코드사이에서 어떤게 에러가 났는지 찾을수 없게 되버리니까! 많이 사용하진 않는걸 추천한다!

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

for person in people:
    if person['age'] > 20:
        print (person['name'])
        
# 이상태에서 만약 리스트안에 하나라도 딕셔너리에 'age'라는 값이 없다면 에러가 나버려 코드실행 중단이 된다. => KeyError: 'age'

생각해봐라, 만약에 2만개의 회원이 있고 그 위에다 코드를 실행하고 있는데 거의 끝까지 코드 실행을 기다리고 있다가 데이터가 중간에 멈춰버리면 그걸 다 시 찾아 해결하고 또 실행하고 하기엔 번거롭지 않을까?

그렇기에 예외를 넣어서 처리한다음에 어디어디에 에러가 날 수 밖에 없는 자료가 있구나 하고 그걸 고쳐주면 훨씬 편리하기에 이걸 쓰는것! => 코드를 일단 끝까지 실행시키기 위해서.

for person in people:
	try: 
    	if person['age'] > 20:
        	print (person['name']
    except: #try에서 에러가 나면 except로 에러를 넘겨 에러처리하는것. 
		name = person['name']
        print(f'{name} - 에러입니다)
=>carry
ben - 에러입니다
bobby 
red
queen

5) 여러개 파일로 분리해서 합치기 -> c 컴파일러같은..?

만약 큰 프로젝트를 만들때 파일을 나눠서 찾기 편하게 구성해 나눠주고 싶을떈 어떻게 그 파일의 클라스(메소드)를 불러와 사용할까요?

간단합니다! import를 해주면 됩니다.

from 파일이름 import *

  • '*' 의미는 그 파일안의 모든 함수를 불러오겠다 라는 의미로 만약 몇개의 함수들만 불러오고 싶다면 그 함수들의 이름만 나열해 써도 된다.

6) if문/for문...etc - 삼항연산자

  1. if 문
(참일때 값) if (조건) else (거짓일때 값) 
항이 3개라 삼항 연산자로 불리운다.

만약 조건에 따라 다른 값을 변수에 저장하고 싶다면?

num = 3

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

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


#바꾸면

num = 3 

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

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

2.for 문

a_list의 각 요소에 2를 곱한 새로운 리스트를 만들고 싶다면?

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] 

b_list = [b_list.append(a*2) for a in a_list] 
#이게 안되는 이유는 b_list가 먼저 선언되지않아 인식할 수 없는 상태이고 리스트 안에 들어가 있기 때문에 append 사용하지 않아도 되는것이기 때문!

print(b_list)

7) map - 리스트의 모든 원소를 조작하기

  1. map이라는 함수에 대해서 알아보겠습니다~

map(function, iterable)
기본적으로 iterable 안에 있는 모든 속성들을 하나하나 꺼내 function에 대입하여 정렬시키는 함수이다.
iterable 안에는 리스트나 튜플이 들어갑니다. => 돌릴 수 있는 객체

일반적으로 iterable안에는 문자열도 포함된다고 볼 수 있다. 자체적으로 리스트화로 변형시켜 함수를 실행한다.

int는 한 덩어리기때문에 iterable 안되기에 부적합한 타입으로 에러 발생.

예를 들어

str = 'hello, nice to meet you'
str2 = '안녕, 반가워'
int = 234
n = list(reversed(str))
# n = list(reversed(int)) 에러발생
n2 = list(reversed(str2))
print(n) 
=> ['u', 'o', 'y', ' ', 't', 'e', 'e', 'm', ' ', 'o', 't', ' ', 'e', 'c', 'i', 'n', ' ', ',', 'o', 'l', 'l', 'e', 'h']

print(n2)
=> ['워', '가', '반', ' ', ',', '녕', '안']

iterable을 좀 더 추가적으로 설명하겠다.
이터러블(iterable)하다는 것은 객체가 '__iter__()' 메서드 또는 '__getitem__()' 가지고 있어, 그 객체를 순회할 수 있다는 것을 의미. 즉, 객체가 이터러블하다면 for 루프 등에서 해당 객체의 요소들을 하나씩 순회하며 접근할 수 있다.

'__iter__' :메소드는 객체가 이터레이터를 반환하도록 설계되어있다. for 루프나 다른 이터레이션 컨텍스트에서 객체를 사용할 때 이 메소드는 호출.

'__getitem__': 이 메소드는 객체에서 인덱싱을 통해 요소를 가져오기 위해 설계되었습니다. 예를 들어 obj[3]과 같은 표현식이 있을 때 이 메소드가 호출된다. 리스트, 튜플, 사전(dict) 등의 내장 데이터 타입에서 이미 '__getitem__'이 구현되어 있다.

하지만 reversed(interable)같은 함수는 반환값 출력이 메모리 주소 같은 값이 나오게 됩니다. 그럼에도 불구하고, 이 reversed 객체는 순회 가능합니다.

그렇기에 출력값이 메모리여도 for 루프를 사용하여 요소에 접근할 수 있다. 그렇기 때문에 map함수 내에도 list()없이 바로 매개변수로 사용가능

data = reversed([1, 2, 3])
print(data)  
=> <list_reverseiterator object at 0x...>

for item in data:
    print(item)
=> 3,2,1

map

def check_adult(person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'
# return '성인' if person['age'](person) else '청소년' 으로 한줄처리 해줄수 있다! 

result = map(check_adult, people)
=> 리스트 형으로 변형시켜줘야 그 값이 프린트 되어 나오지 아니면 
map(check_adult, people)= <map object at 0x104bfff10>이값이 나옴.

print(list(result))

그렇기에 map 활용하여 각 요소의 타입을 바꿔줘 실행하는 등등 for문을 사용하지않고 간단히 각 요소에 필요한 부분을 적용시킬 수 있다.

  1. lambda라는 함수에 대해 알아보겠습니다~

함수를 딱 한 줄만으로 만들게 해주는 함수입니다.

lambda 매개변수 : 표현식

def hap(x, y):
return x + y
hap(10, 20) => 30

(lambda x,y: x + y)(10, 20) =>30
컨벤션 통상적으로 이름을 x,y를 사용합니다.

map에 적용시켜 보겠습니다!

위의 예시를 따라 보면 :
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))

다른예시를들어보면:

#range(5) 라고 써주면 [0, 1, 2, 3, 4]라는 리스트를 돌려줍니다. 
list(map(lambda x: x ** 2, range(5)))
[0, 1, 4, 9, 16]
  1. filter

map과 아주 유사한데, True인 것들만 뽑아 주는 함수입니다.

result = filter(lambda x: x['age'] > 20, people)
print(list(result))
=> [{'name': 'carry', 'age': 38}, {'name': 'ben', 'age': 27}, {'name': 'bobby', 'age': 58}, {'name': 'red', 'age': 32}, {'name': 'queen', 'age': 25}]

하면 그 조건에 맞는 true인 애들만 추출해 그 딕셔너리 전체를 리스트로 반환해줍니다.

8) 함수 관련 심화 내용

-기본적으로 함수에 인수를 넣을떄,
어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있습니다.

def cal2(a, b=3): 디폴트 값을 지정해줄 수 있어요.
    return a + 2 * b

print(cal2(4)) => a=4 
print(cal2(4, 2)) => b=2이로 지정된것
print(cal2(a=6)) => b=3으로 디폴트값이 있어 따로 써주지 않아도돼
print(cal2(b=7,a=1)) => 확실히 지정해준다면 순서 상관없어

-여기서 입력값 즉, 매개변수의 갯수를 무한대로 지정하지 않고 모두 받는 법이 있습니다.

바로 args라는 포인터를 받는것이죠 => 간단히 리스트라고 생각하시면 됩니다.
로 리스트 박스를 열어 안에 들어가게 해준다고 생각하시면됩니다.
여러 개의 인수를 하나의 매개변수로 받을 때 관례적으로 args라는 이름을 사용합니다
arguments라는 뜻.

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

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

-또한 키워드 인수를 여러개 받는 방법도 있는데요. 딕셔너리를 생각하시면 됩니다.
keywardarguments = kwargs
이것도 마찬가지로 컨벤션에 따라 딕셔러리를 표현할때 이 이름으로 사용됩니다.

리스트 안에 더 세분화된 리스트가 있다고 보면돼요!
큰 박스안에 네임이라는 박스가 있고 그안에 값이 있는거죠!

이번엔 그래서 '**'개가 붙습니다.

def get_kwargs(**kwargs):
    print(kwargs)

get_kwargs(name='bob')
get_kwargs(name='john', age='27')

즉, 큰 틀로 kwargs[name[bob],age[27]] 약간 이런느낌?

조금 더 심화로 보여드리면

list에서 활용

def add(*args):
    result = 0
    for i in args:     #여기서 i는 args안의 요소들
        result += i
    return result

numbers = [1, 2, 3, 4]

print(add(*numbers)) # *로 리스트를 열어줘
""" 아래 코드와 동일
print(add(1, 2, 3, 4))
"""

# result output
"""
10
"""

dictionary에서의 활용

여기서 .get('key','value')은 key에서 그 값을 가지고 오라는 뜻, 딕셔너리에 값이 있으면 그 값이 불러져오고, 없으면 부를때 넣어준 값이나온다.

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",
}
##phone관련 요소가 없네?

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': '-', 
    #그래서 여기 phone은 - 가 대신해서온다.
    'email': 'python@sparta.com'
}
"""

그래서 만약 자료속성 상관없이 매개변수를 넣고 싶을떄
def anytype(*args,**kwargs)
이렇게 표시해주면 되겠죠?

profile
초보개발자

0개의 댓글