튜플은 불가변속성을 가진 리스트라고 볼 수 있습니다.
리스트나 딕셔너리에서는 안의 데이터, 속성을 바꿀수 있었는데요
튜플은 불가능합니다!
그렇지만 순서는 존재하죠!
a = (1,2,3)
print(a[0]) => 1
a[0] = 99 => 바꿀 수 없습니다!
주로 사용할때는 딕셔너리 대신 리스트와 튜플로 딕셔너리와 비슷하게 만들어 사용해야 할때 많이 쓰이는데, 불변할 내용을 담겠죠??
a_dict = [('bob','24'),('john','29'),('smith','30')]
집합은 리스트안의 중복을 제거 시켜줍니다!
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가 각각 들은 수업 찾아보기
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}점입니다')
이 것을 사용할땐 에러가 있어도 건너띄게 할 수 있는 방법인데, 예외처리를 한다고 보면된다.
하지만 이것을 남용하다가는 수천개의 코드사이에서 어떤게 에러가 났는지 찾을수 없게 되버리니까! 많이 사용하진 않는걸 추천한다!
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
만약 큰 프로젝트를 만들때 파일을 나눠서 찾기 편하게 구성해 나눠주고 싶을떈 어떻게 그 파일의 클라스(메소드)를 불러와 사용할까요?
간단합니다! import를 해주면 됩니다.
from 파일이름 import *
- '*' 의미는 그 파일안의 모든 함수를 불러오겠다 라는 의미로 만약 몇개의 함수들만 불러오고 싶다면 그 함수들의 이름만 나열해 써도 된다.
(참일때 값) 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)
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문을 사용하지않고 간단히 각 요소에 필요한 부분을 적용시킬 수 있다.
함수를 딱 한 줄만으로 만들게 해주는 함수입니다.
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]
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인 애들만 추출해 그 딕셔너리 전체를 리스트로 반환해줍니다.
-기본적으로 함수에 인수를 넣을떄,
어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있습니다.
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)
이렇게 표시해주면 되겠죠?