부족한 부분 채우기
참고한 곳 : 파이썬 코딩 도장
-한줄에 여러 구문을 사용할 때 세미콜론으로 구분해준다.
-보통 들여쓰기는 공백4칸(탭1칸)을 기준으로 한다.
-블록이 같으면 들여쓰기 칸수가 같아야 한다.
-//연산자는 정수끼리 나눗셈에서 소수점아래를 버려준다.
하지만 실수에 //사용하면 결과는 실수로 나온다.
-객체 자료형 알아내기 type(값)
-몫과 나머지 한꺼번에 구하기
divmod(5,2) 5를 2로 나눈 몫과 나머지
-> ( 2(몫),1(나머지) ) 튜플
-2진수 : 0b010= 2
8진수 : 0o10 = 8
16진수: 0xF = 15
-2실수 복소수로 만들기
complex(1.2 , 1.3)
- a,b= input('문자열 2개를 입력하세요').split()
-값 사이에 문자 넣기
print(1,2,3, sep=',')
-> 1,2,3
print(1,2,3, sep='\n')
-> 1,2,3
-end 사용
print(1, end=' ')
print(2, end=' ')
print(3)
->1 2 3
- 객체가 같은지 다른지 비교
is, is not은 객체끼리 비교한다.
1 is 1.0
-> False
그러나 값(숫자)를 비교할 때는 비교연산자를 사용해야한다.
a변수가 값이 있는 상태에서 다른값을 할당하면 메모리주소가 달라지므로,
a=5
a is 5 -> True
a=-6 a is -6 -> False
-bool(값)은 값이 있으면 무조건 True, 0이면 False
-단락 평가
and는 1번째만 확인하면 2번째는 확인안함.
or은 2번째까지 확인.
True and 'python' -> 'python' 마지막으로 단락평가 실시한 값 그대로 반환
'python' and True -> True
-작은 따옴표안에 작은따옴표 넣기
'python isn\'t '
-> "python isn't"
-range로 리스트 채우기
a=list(range(10))
-> [0,1,2,3,4,5,6,7,8,9]
a=list(range(10,0,-1)) (시작,끝,증가폭)
-> [10,9,8,7,6,5,4,3,2,1]
-튜플
a=(10,20,30,)
요소가 1개인 튜플 만들기
(38,) or 38,
튜플을 리스트로 만들기
a=[1,2,3]
tuple(a)
b=(4,5,6)
list(b)
-리스트 튜플 언패킹
x=[1,2,3]
a,b,c=x
-> 1 2 3 input().split()같은 느낌.
-패킹
a=[1,2,3]
-시퀀스 자료형
리스트,튜플, range, 문자열, bytes ,bytearray
특정 값 확인하기
a=[0,30,....]
30 in a -> True
1 not in a -> False
객체 연결
a = [0, 10, 20, 30]
b = [9, 8, 7, 6]
a + b [0, 10, 20, 30, 9, 8, 7, 6]
range는 안됨
-슬라이스
a=[0,10,20,30,40,50,60,70,80,90]
a[4 :-1] -> 4번째 요소부터 맨마지막 전요소(a[-2]) 까지 출력
-> [30,40,50,60,70,80]
a[2:8:3] [2]부터 [7]까지 3씩 증가시키면서
인덱스 생략하기
a[:7] -> 처음부터 [6]인덱스까지 가져오기
a[7:] -> [7]인덱스부터 끝까지 가져오기
a[:] -> 인덱스 전체 가져오기
a[: : 2] -> 처음부터 끝까지 2씩증가시키면서 가져오기
슬라이스를 활용해서 원소 할당 가능. 할당된것이 적으면 그원소만,
더 많으면 전부 초과해서 바뀜
a[2:7:2]=['a','b','c'] [2]인덱스부터 [6]인덱스까지 2씩증가시키며 할당
-> a[2] , a[4] , a[6]에 a,b,c 할당. 증가폭을 지정하면 범위 요소개수와 할당할 요소개수가
같아야한다. 증가폭지정 안하면 상관없음.
del a[2:8:2] 이렇게도 사용가능. 리스트만
-딕셔너리 만들기
딕셔너리 ={키1: 값1, 키2: 값2}
중복된 키는 저장되지 않음.
키에는 리스트, 딕셔너리 제외 다사용가능.
x={}
x-dict()
접근 방법:
lux={'health' : 490}
lux['health']
없는키에 값할당시 해당키가 추가되고 값이 할당됨
-시퀀스로 출력하기
for i in reversed('python'):
print(i,end=' ')
->n o h t y p
-append 와 extend차이
리스트안에 리스트를 append할 경우 요소1개를 추가하는것으로 간주됨.
[10,20,30,[40,50]]
그래서 len이 4임.
extend를 사용하면 리스트가 확장된다.
[10,20,30,40,50]
len이 5가 된다.
-특정값 제거하고 싶을 때 a.remove(20)
a=[10,20,30]
a.remove(20)
a=[10,30]
여러개 찾았으면 처음 찾은 값을 삭제한다.
-스택은 리스트로 구현해도 좋은데 (pop, append)
큐는 deque를 이용하는게 편하다. (append, popleft 사용)
-리스트에서 특정값 인덱스 구하기
a=[10,20,30,40]
a.index(20)
1
-특정값 개수 구하기
a.count(20)
1
-sort는 오름차순으로 정렬됨.
sort는 기존의 리스트를 변경해줌
sorted는 새 리스트를 생성해준다.
-요소 있는지 판별
if seq:
if not seq:
-리스트를 2개 만드는 방법
a=[0,0,0,0]
b=a.copy()
-인덱스와 요소 함께 출력하기
a= [38,21,53,62,19]
for 인덱스, 요소 in enumerate(리스트):
for index, value in enumerate(a):
print(index,value)
0 38
1 21
2 53
3 62
-시작 요소 1부터 시작하기
for index, value in enumerate(a, start=1)
print(index, value)
1 38
2 21
3 53
'''
-요소의 합 구하기
sum(a)
-리스트 표현식에서 if문 사용하기
a=[i for i in range(10) if i%2==0]
-for문과 if문 여러번 사용
구구단
a=[i * j for j in range(2,10) for i in range(1,10) ]
-for문 1번만으로 2차원 리스트 출력하기
a=[ [10,20] , [30,40] , [500,60] ]
for x,y in a:
print(x,y)
-리스트 표현식으로 2차원 톱니바퀴 리스트 만들기
a=[ [0] * i for i in [3,1,3,2,5] ]
[ [0,0,0] , [0] , [0,0,0] , [0,0] , [0,0,0,0,0] ]
-다차원 리스트를 복사하려면 deepcopy를 사용해야 된다.
-딕셔너리에 키,값 쌍 추가
x.setdefault('e')
키 'e'를 추가하고 값에 None을 저장한다. 키-값 쌍 추가만 가능함.
x.update(a=10) 해당 키 (a)가 있으면 수정하고 없으면 새로 추가한다.
삭제하기
x.pop(키) : 특정 키값 삭제후 반환.
x.pop(키, 기본값) : 해당 키값을 삭제하고 삭제한값을 반환하는데,
키가 없으면 기본값만 반환된다.
del a[키]도 가능.
-x.popitem() 파이썬 3.6의 경우 마지막 키, 값을 튜플형태로 반환함.
파이썬 3.5 이하에서는 매번 삭제하는 키-값쌍이 달라짐.
clear() : 모든 키-값 쌍 삭제
get(키) : 특정키의 값 가져오기
x.get('a')
x.get('a',0) 값이 있으면 해당 키값 반환. 없으면 기본값으로 지정한 0 반환
x.keys() : 키값만 반환
x.values() : 값들만 반환
dict.fromkeys(키리스트) 키리스트로 리스트 생성. 모두 None으로 저장.
keys = ['a', 'b', 'c', 'd']
x = dict.fromkeys(keys)
x {'a': None, 'b': None, 'c': None, 'd': None}
dict.fromkeys(키리스트, 기본값) 기본값으로 딕셔너리가 생성됨.
-없는 키에 접근해도 에러 발생안하도록 하기
from collections import defaultdict
y=defaultdict(int)
y['z'] -> 0이나옴. 0이 기본값.
기본값 지정하기
y=defaultdict(lamda: 'python')
-반복문으로 키값 모두 출력하기
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
for key,value in x.items():
print(key,value)
a 10
b 20
c 30
d 40
key나 value값만 가져오기
for key in x.keys():
for value in x.values():
-반복문이나 if문으로 딕셔너리 생성하기
keys=['a','b','c','d']
x={ key : value for key,value in dict.fromkeys(keys).items() }
{'a': None, 'b': None, 'c': None, 'd': None}
-딕셔너리에서 쉽게 삭제하기
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x={ key : value for key, value in x.items() if value !=20 }
{'a': 10, 'c': 30, 'd': 40}
-딕셔너리 안의 딕셔너리 접근하기
terrestrial_planet = {
'Venus':
{
'mean_radius': 6051.8 ,
'mass': 4.8676E+24 ,
'orbital_period': 224.70069
}
}
terrestrial_planet['Venus']['mean_radius']=6051.8
-딕셔너리 복사하기
리스트처럼
y=x.copy() 를 써야한다.
중첩딕셔너리의 경우 y=x.deepcopy()를 이용한다.
-세트 : 집합을 뜻함. 합집합,교집합, 차집합등의 연산이 가능함
a={'a','b','c'}
set은 요소의 순서가 정해져 있지 않아서 출력하면 매번 다르게 나온다..
중복안됨.
[]로 특정요소 출력 불가능
in 연산자로 값을 찾는다.
fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
'orange' in fruits
True
-set()으로 세트 만들기
a=set('apple')
a={'e','l','a','p'}
빈 세트를 만드려면 a=set() 으로 해야한다. a={}로 하면 딕셔너리가 생성된다.
-a=frozenset('apple')
내용을 변경할 수 없는 세트 .
-세트 합집합
a | b set.union(a,b) 둘다 사용가능
-세트의 교집합 a&b 또는 set.intersection(a,b)
-세트의 차집합 a-b set.difference(a,b)
-세트 대칭 차집합 a^b set.symmetric_dirrerence(a,b)
a ^ b
{1, 2, 5, 6}
set.symmetric_difference(a, b)
{1, 2, 5, 6}
unit 26.2.1 부터.
unit 26 ~28
unit 29.4
-return으로 여러값 전달시 default로는 튜플로 반환된다.
-리스트로 반환할 수도 있음
- 함수로 리스트,튜플 언패킹
-def print_numbers(a, b, c):
print(a)
print(b)
print(c)
x=[10,20,30]
print_numbers(*x)
10
20
30
-동적으로
-def print_numbers(
*args): for arg in args: print(arg)
-키워드인수 형식 함수 사용
def personal_info(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')
인수 순서를 안맞춰도 됨.
-딕셔너리 언패킹 . 키값이 반드시 문자열이여야 함
x = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
personal_info(**x)
이름: 홍길동
나이: 30
주소: 서울시 용산구 이촌동
*을 1개쓰면 키값들(name, age, address) 가 출력된다
def personal_info(**kwargs):
for kw, arg in kwargs.items():
print( kw, ' : ', arg, sep=' ')
-언패킹
y = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
personal_info(**y)
-def personal_info(**kwargs):
if 'name' in kwargs: # in으로 딕셔너리 안에 특정 키가 있는지 확인
print('이름: ', kwargs['name'])
if 'age' in kwargs:
print('나이: ', kwargs['age'])
if 'address' in kwargs:
print('주소: ', kwargs['address'])
-매개변수에 초기값넣기
def personal_info(name, age, address='비공개'):
... print('이름: ', name)
... print('나이: ', age)
... print('주소: ', address)
초깃값이 있는 부분은 생략하고 넣을 수 있음
personal_info('홍길동',30)
-초깃값이 지정된 변수들은 뒤쪽에 몰아주면 된다.
-람다 표현식
lambda 매개변수들 : 식
lambda x : x+10
람다로 만든 익명 함수를 호출하려면 변수에 할당해주면 된다.
plus_ten = lambda x: x+10
-람다 표현식 자체 호출
(lambda x: x+10)(1)
-람다 표현식 안에서는 변수를 만들 수 없음
(lambda x:y=10;x+y)(1) -> 안됨
람다 표현식 바깥의 변수는 사용가능
y=10
(lambda x: x+y)(1)
-람다에 map활용하기
def plus_ten(x):
return x+10
list(map(plus_ten, [1,2,3] ))
list(map(lambda x: x+10, [1,2,3]))
-람다표현식으로 조건부 표현식 사용하기
lambda 매개변수들: 식1 if 조건식 else 식2
map을 사용해서 리스트 a에서 3의배수 문자열로 변환
a=[1,2,3,4,5,6,7,8,9,10]
list(map( lambda x: str(x) if x%3==0 else x , a ))
-식 여러개 쓰고 싶을 때
list(map( lambda x: str(x) if x==1 else float(x) if x==2 else x+10 , a ))
식이 알아보기 힘들거같을 때는 그냥 def사용하기.
-map에 여러 객체 넣기
a=[1,2,3,4,5,6]
b=[2,3,4,5]
list(map(lambda x,y: x*y ,a,b)) 이렇게도 가능
-filter 반복가능한 객체에서 특정 조건에 맞는 요소만 가져온다.
filter(함수 , 반복 가능한 객체)
def f(x):
return x>5 and x< 10
a=[8,3,2,10,15,7,1,9,0,11]
list(filter(f,a))
[8,7,9]
list(filter(lambda x: x>5 and x<10, a))
[i for i in a if i>5 and i<10]
-reduce 반복가능한 객체의 각 요소를 지정된 함수로 처리한 뒤 이전 결과와 누적해서
반환하는 함수
from functools imports reduce
reduce(함수, 반복가능한 객체)
def f(x,y):
return x+y
a=[1,2,3,4,5]
reduce(f,a)
15
reduce(lambda x,y : x+y, a)
15
unit 33 부터