본 과정은 제가 파이썬 수업을 들으면서 배운 내용을 복습하는 과정에서 적어본 것입니다.
틀린 부분이 있다면 댓글에 남겨주시면 고치도록 하겠습니다.
확실하지 않은 내용은 ‘(?)’을 함께 적었으니 그 내용을 아신다면 댓글에 남겨주시면 감사하겠습니다.
1) Tuple
- 할당에 투플이 큰 역할을 차지한다.
a=(1,2,3,) # 뒤에 , 를 찍어주는게 좋다.
a=(1,) # 뒤에 투플을 만들려면 ,를 찍어줘야한다.
type(a) # tuple
a=1, # 괄호를 없애도 투플이다.
type(a)
a=1,2,3, # 괄호 없애는게 편하다.
type(a) # tuple
a # (1,2,3) 한개를 할당.
a,b=1,2,3 #하나하나씩 할당하는 것
type(b) #개수가 다르면 에러가 간다.
- * 는 다양하게 쓰인다. 여기서는 나머지를 할당 받겠다는 의미로 나타난다.
# * 5가지 -> 여기서 별표는 나머지를 할당 받겠다는 의미
a,*b =1,2,3
a
b
type(a)
######################
a,*b,c=1,2,3,4,5,6
a
b
c
Out:
1
[2, 3]
int
1
[2, 3, 4, 5]
6
*a=1,2,3,4,5,6 # 할당된 것이 없으니까 이 식은 에러가 난다.
*a,=1,2,3,4,5,6 # a뒤에 ','를 붙이면 list로 바뀌게 된다. 투플인데 리스트로 변신시키고자 할 때 쓴다.
a # [1, 2, 3, 4, 5, 6]
def x():
return 1,2 # return 무조건 한개, (,)로 나눠지면 무조건 투플
- Swap 하는 방법
a=1
b=2
# (1)
a,b=b,a # 스왑(swap)은 이렇게 하는것. b=1, a=2
a # 2
b # 1
# (2) (?)
import tempfile
# 따라서 쪼개려면 임시개체를 이용해서 한다.
temp = tempfile.NamedTemporaryFile()
a = 1
b = 2
a = temp
b = temp
- 피보나치
- 튜플로 피보나치를 만들 수 있다.
- 피보나치를 만다는 방법은 다양한데 기본적으로 10가지가 있다고 한다.
a=1
b=2
a,b = b, a+b # 교과서적인 테크닉 *** 중요
a # 2
b # 3
2) list
- list(mutable) & tuple(immutable) -> (heterogeneous & sequence - indexing & sclicing)
- list 안에 list도 넣을 수 있다.
list('경아') # ['경', '아'] 문자를 나눠줄 때 list를 쓴다.
a=[1,] # list에 , 뒤에 넣어도 돌아간다.
# mutable -> 자기자신이 변해도 메모리도 변한다. (첫번째 주소값만 안 변한다.)
# 따라서 계속 추가가 되도 첫번째 주소도 바뀌지 않기에 주소값이 바뀌지 않는다.
# python의 list는 링크드로 되어있다. (?)
a # [1]
- append & extend
- append: 맨 끝에 추가가된다.
- extend: 맨 끝에 추가가 된다.
a.append(2) # 안에 들어가는 원소
a # [1, 2]
a.extend([3]) # list 형태
a # [1, 2, 3]
- 리턴값
- 리턴한다는 말은 값을 반환하며 메소드를 종료한다는 것
# mutable 조심해야할 3가지
# sequence heterogeneous
# 1) 리턴값이 없는 경우
a.index(1) # 0 -> 결과값이 나오지 않는다.
# mutable일 때는 3가지를 조심해야한다.
# 1) 실행했는데 결과값이 안나온다. 근데 값은 변하고 리턴은 없다.
def append_():
return None
# return 이 None이면 결과값이 안나온다. 내부적으로는 return None도 없다.
def xx():
a=1
xx() is None # True
# python 은 return을 생략하면 자연스럽게 None으로 바뀐다. -> mutable method 에서 많이쓴다.
# 결과값이 안튀어나올 때
# 2) 리턴값이 있는 경우, mutable인 애만 리턴값이 없는 경우가 있다.
a= [1,]
b= 1,
# 3) 리턴값이 있는데 내 자신이 바뀐다.
# ex1)
a=[1,2,3,'경아']
a.pop() # '경아' 맨 끝에 있는것 뽑아주는 것
a # [1, 2, 3] 리턴값도 있고 자기자신도 변한다.
# ex2)
def t(l):
return l.append(3) # 3 더해주는 함수 , 리턴값이 바뀐다. -> 행동은 하지만 리턴은 None이다.
b=[1,2,3]
t(b) # 행동안하는 것처럼 보이지만 행동한다. 하지만 리턴값이 안나온다.
b # [1, 2, 3, 3]
# mutable은 또 있다. -> 함수의 매개변수로 쓰일 때
def s(t,L=[]):
L.append(t) # 리턴값을 굳이 안써도된다. default 가 heap 영역에 생긴다. -> 그래서 계속 유지한다.
s(3) # 결과값 안나온다.
b # [1, 2, 3, 3]
s(b)
b # [1, 2, 3, 3]
s(3,b)
b # [1, 2, 3, 3, 3]
- list 연산자
# list도 연산자가 있다.
a=[1,2,3]
b=[3,4,5]
a+b # [1, 2, 3, 3, 4, 5] 추가된다. extend와 비슷하다.
a*3 # [1, 2, 3, 1, 2, 3, 1, 2, 3] 한쪽이 숫자일 때는 곱하기가 된다. -> 숫자가 반복된다.
a='abc'
b='경아'
a+b # 'abc경아'
a*3 # abcabcabc' 반복
'abc''경아' # 'abc경아' 문자열만 더하기 안해도 붙여준다.
# 하지만 숫자는 안됨 ex) [1,2,][2,3,]
# 리스트를 메소드로 쓰면 3가지 경우
# 1) 결과는 없지만 행동은 하는 애
# 2) 리턴값 나오는 애
# 3) 리턴값도 나오고 자기자신도 나오는 애
# 이런 함수는 안좋다.
def s (t,L=[]):
L.append(t)
return L # 계속 1씩 추가시키는 메소드. 결과값 안나온다.
s(1) # [1]
s(1) # [1, 1] 실행할때마다 계속 추가되기 때문에 이런 함수는 안좋다. (계속 누적)
3) set
- 순서가 없고 중복이 없다.
- mutable
- 내부적으로는 순서를 관리
- 사람은 순서를 관리할 수 없다.
- for 안에 set 쓸 수 있다. -> 내부적으로 순서를 관리하기 때문에
- set만의 연산자를 지원한다.
a={1,2,3,2,0}
a # {0, 1, 2, 3}
for i in a:
print(i)
# 0
# 1
# 2
# 3
- 집합 연산자 제공
- 여집합은 제공 안함
a-{2}
a&{2}
a|{2}
a^{2} # 대칭차집합 (대칭으로 나오는 것)
set() # 공집합
out:
{0, 1, 3}
{2}
{0, 1, 2, 3}
{0, 1, 3}
set()
- 고유 메서드 확인 (dir)
# dir: 고유 메서드
t=set(dir(list())) & set(dir(tuple()))
t
out:
['count',
'__gt__',
'__lt__',
'__format__',
'__sizeof__',
'__delattr__',
'__iter__',
'__doc__',
'__ge__',
'__new__',
'__len__',
'__hash__',
'index',
'__setattr__',
'__le__',
'__ne__',
'__mul__',
'__rmul__',
'__dir__',
'__init__',
'__contains__',
'__init_subclass__',
'__repr__',
'__getattribute__',
'__subclasshook__',
'__str__',
'__add__',
'__getitem__',
'__eq__',
'__reduce_ex__',
'__reduce__',
'__class__']
set(dir(tuple()))-t # immutable
set(dir(list()))-t # mutable 속성들
out:
{'__getnewargs__'}
{'__delitem__',
'__iadd__',
'__imul__',
'__reversed__',
'__setitem__',
'append',
'clear',
'copy',
'extend',
'insert',
'pop',
'remove',
'reverse',
'sort'}
4) dictionary
- mutable
{} # {}: dictionary -> 비어있는 공집합을 못만드는 이유는 집합(set)이 처음에는 파이썬에 없었다.
# 딕셔너리가 먼저 만들어져 있었기에 딕셔너리가 됨.
# 내부 구성의 우선순위는 key
# value는 모든 타입 다 올 수 있다. (heterogeneous container)
set() # set() 공집합
{''} # key -> dictionary는 Hash구조로 이루어져있음
{1:1} # 숫자는 key로 올 수 있다. 문자 올 수 있다. 하지만 list는 올 수 없다. (변할 수 있으니까)
{(1,):1} # {(1,): 1}
{1,:1} # 투플도 되는데 연산자 우선순위라서 작동이 안된다.
{(1,[1]):1} # 안에 있는것 자체가 바뀔 수 있기 때문에
# 딥카피, 스왈로 카피 할 때 한다.
[참조]
- Hash Table: 키(Key)에 데이터(Value)를 저장하는 데이터 구조
Key를 통해 바로 데이터를 받아올 수 있으므로, 속도가 획기적으로 빨라짐 파이썬 딕셔너리(Dictionary) 타입이 해쉬 테이블의 예: Key를 가지고 바로 데이터(Value)를 꺼냄 보통 배열로 미리 Hash Table 사이즈만큼 생성 후에 사용 (공간과 탐색 시간을 맞바꾸는 기법) 단, 파이썬에서는 해쉬를 별도 구현할 이유가 없음 - 딕셔너리 타입을 사용하면 됨
-
깊은 복사(deep copy): 깊은 복사는 최상위 컨테이너를 복사하고 내부의 참조 역시 원본 컨테이너의 참조를 복사한다. 깊은 복사는 copy 모듈의 deepcopy() 함수를 사용하면 된다.
-
얕은 복사(swallow copy): 얕은 복사란 최상위 컨테이너는 복사하지만 카피한 컨테이너 내부의 참조는 기존 컨테이너와 동일한 참조로 채워져 있는 것을 얘기한다.
- key & value
- [용어집][https://docs.python.org/ko/3/glossary.html] 참조
{3,2,1}
{'c':2,'a':1,'b':2} # 버전이 바뀌어서 (set) 정렬을 안해준다.
# 정렬유지하는 dictionary: orderedict -> 'key: value'
from collections import OrderedDict
# dictionary view 3가지
{'c':2,'a':1,'b':2}.keys() # [] 있다고 list가 아니다. -> for 뒤에 쓸 수 있다.
{'c':2,'a':1,'b':2}.values()
{'c':2,'a':1,'b':2}.items()
out:
{1, 2, 3}
{'c': 2, 'a': 1, 'b': 2}
dict_keys(['c', 'a', 'b'])
dict_values([2, 1, 2])
dict_items([('c', 2), ('a', 1), ('b', 2)])
- in 이용
for i in {'c':2,'a':1,'b':2}.items(): # dictionary는 for 뒤에 쓸 수 있다.
print(i)
out:
('c', 2)
('a', 1)
('b', 2)
for i in {'c':2,'a':1,'b':2}.keys():
print(i)
for i in {'c':2,'a':1,'b':2}:
print(i)
out:
c
a
b
c
a
b
3 in {1,2,3}
3 not in {1,2,3}
2 in {'c':2,'a':1,'b':2} # Flase-> key만 체크하기 때문에
x={'a':1,'b':2}
x['c'] # keyError -> key가 없기때문에 에러
out:
True
False
False
1 in [1,2,3]
'1' in [1,2,3]
'1' in ['12345']
'1' in '123456'
1 in '123' # type error (homogeneous- 문자형 1로 인식)
out:
True
False
False
True
# defualt 값을 지정해준는 식 2가지
from collections import defaultdict # 참조할때 get으로 써도된다.
dir(x) # dictionary 는 mutable - clear, pop
x.get('a') # 1 -> default 반환값을 반환해준다.
x.get('x',3) # 3
- 할당 기법
# <복습> 할당기법
# (1)
a=1
# (2)
a,b=1,2 # 동시할당 # 피보나치 기법도 알아야한다
# (3)
a=b=1 # mutable일 때 같이 바뀌므로 조심
# (4)
a,*b=1,2,3,4 # 별표 쓰는 것
# (5) -> 증감할당
a+=1
# issue: ++는 부호 취급
++a # C, java 배운사람은 이게 2가 되어야하는데, 파이썬은 ++를 그냥 부호로 인식한다.
--a
# a++ # 에러가난다. -> SyntaxError : 문법에 맞지 않는다.
# (6) -> 선언
int a; a = 1 # 선언과 할당을 분리할 수 있는데, 타입이 없어지고 숫자를 선언하는 방식을 안만들어 놓음.
# global, nonlocal 선언과 비슷하다.
# mutable 문제점
a=b=[1,2,3,] # mutable로 할당할때 주의
a
b
b.append(4)
a # a도 같이 바뀐다.
out:
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
--------------------------------
b=[1,2,3,4,5,6]
a # 재할당하면 주소가 바뀐다.
out:
[1, 2, 3, 4]
5) if문
- True or False
{} # 객체 값이 있냐 없냐에 따라 T,F 체크 (존재론적 유무)
if 0:
print('T')
else:
print('F') # -> F : 없는 애는 다 F - 존재론 적 관점
if 2:
print('T')
else:
print('F') # -> T
if 0.0:
print('T')
else:
print('F') # -> F
if []:
print('T') # -> F
else:
print('F') # -> F : list 입장에서는 없으니까 F
if None:
print('T')
else:
print('F') # -> F : None은 없으니까 F
None == False # False : 파이썬에서 F=0, None은 값이 없다.
if '':
print('T')
else:
print('F') # -> F
if "":
print('T')
else:
print('F') # -> F
if '''''':
print('T')
else:
print('F') # -> F
if a is not None:
print('T')
else:
print('F') # -> T
- and , or
0 and 3 # 1 은 true -> 앞에 true인지 false인에 따라 true 일 때만 뒤에 값이 나온다.
1 and 3
'''''' and 3
[1,2,3] and 3
1 or 3 # 1 이 true -> 뒤에거 안본다. (뭐가나오든 체크를 하지 않는다.)
3 or 1/0
# and, or 은 뒤에 복잡하게 만들 수 있다.
out:
0
3
''
3
1
3
6) for문
- python은 반복문 2가지 : 브레이크, 컨틴뉴 기법
%%timeit # 몇초동안 몇개 실행되는가 체크
temp = []
for i in range(100):
temp.append(i)
-
for i in # for in 다음 올 수 있는 것은 iterable!
-
iterable (이터러블) -> 순회 가능 한 것 (container는 기본적으로 다 이터러블 , sequence (6가지) <- iterable (bytes, str, bytearray, range, list, tuple) 멤버들을 한 번에 하나씩 돌려줄 수 있는 객체. 이터러블의 예로는 모든 (list, str, tuple 같은) 시퀀스 형들, dict 같은 몇몇 비시퀀스 형들, 파일 객체들, iter() 나 시퀀스 개념을 구현하는 getitem() 메서드를 써서 정의한 모든 클래스의 객체들이 있습니다. set, frozenset, range
- iterater: 1개의 속성을 뽑아낼 수 있는 것
- iterable 만드는 2 가지 방식
- iterable 상속
- duck-typing 방식으로 literable
- duck-typing (덕 타이핑): 올바른 인터페이스를 가졌는지 판단하는데 객체의 형을 보지 않는 프로그래밍 스타일
def x ():
for i in range(100):
temp.append(i)
dir([x]) #__getitem__ -> iterable
for i in range(10):
print(i)
out:
0
1
2
3
4
5
6
7
8
9
---------------------------
for i in '경아':
print(i)
for i in 1,2,3,'경아',4: # tuple로 인식
print(i)
for i in {1,2,3}:
print(i)
out:
경
아
1
2
3
경아
4
1
2
3
- for문에 dictionary
# dictionary - 3가지:
{'c':2,'a':1,'b':2}.keys() # [] 있다고 list가 아니다. -> for 뒤에 쓸 수 있다.
{'c':2,'a':1,'b':2}.values()
{'c':2,'a':1,'b':2}.items()
for i in {'a':1,'b':2}.items():
print(i) # 결과값이 tuple로 나왔다.
# ('a', 1)
# ('b', 2)
- unpacking
a= 1,2,3 # tuple
type(a)
a,b,c=(1,2,3) # tuple ()씌워도 안씌워도 둘다 튜플 따라서 위에 예시랑 같다.
a
a,b,c = 1,2,3
type(a)
# integer로 바뀐다.
for i,j in {'a':1,'b':2}.items():
print(i,j) # 각각 쪼개서 나눌수 있다. : unpacking
out:
tuple
1
int
a 1
b 2
- else
for i in range(10000):
if i==10:
break
else:
print(i)
else:
print('경아') # telegram 으로 쓸 때 많이 쓴다. -> 완벽하게 다 돌아가면 나타나게하는 것
out:
경아
- else 3가지 쓰이는 방법
- for에 쓰는 else는 반복문이 완전하게 실행되면 else가 출력
- if에 쓰는 else: 안 맞는다는 의미
- while에 쓰는 else: 0 이상 돌았을 때 else 값 출력
for i,j in {'a':1,'b':2}.items():
print(i,j)
else:
print('경아')
print('######')
a=10
while a>10:
a-=1
else:
print('경아') # 0번 돌알았다고 생각해서 else로 찍힌다.
while a>0:
a-=1
else:
print('경아')
print('#######')
while a>0:
a-=1
if a==5:
break
print(a)
else:
print('경아')
print('########')
while a>0:
a-=1
if a==5:
raise
print(a)
else:
print('경아')
out:
a 1
b 2
경아
######
경아
경아
#######
경아
########
경아
- continue
for i in range(10):
if i==20:
continue
else:
print(i)
else:
print('경아') # continue: break하고 에러가 안나면 쓴다. -> while에서는 많이 쓴다.
# for 하고 while 에서 차이점
# for 에서는 쓰기가 어려운 무한 루프
# while 에서는 무한 루프를 쓰기가 쉽다.
out:
0
1
2
3
4
5
6
7
8
9
경아
- 무한루프 (for vs. while)
- for 에서는 쓰기가 어려운 무한루프
- while 에서는 무한 루프를 쓰기가 쉽다.
a= input( ) # 사용자 입력받는 것 -> 모든게 str로 바뀐다.
type(a) # str
# 입력받아서 10을 더해서 출력
a= input()
int(a)+10 # type을 바꿔주는 방법이 python에는 없고, 새로 인스턴스화하는 방식을 써야한다.
# 무한루프
a=input()
try:
a =int(a)
except:
a=input() # 이처럼 실수를 할 수 있을 때 무한루프를 돌린다.
while True: # 무한루프
try:
a= int(input())
except:
continue
else:
break
while [123,12,3,2,'as']: # <- 이 while문도 가능하다. cuz 존재론적 유무 -> True
try:
a= int(input())
except:
continue
else:
break
<참조>
# python 안에 기본 내장 함수
import builtins
a= input()
a=eval(a) # 아라서 type을 바꿔준다. 좋긴한데 엄청 좋진 않다.
type(a) # 에를 들어 python 기본 문법(in, + etc)이나 식이 좀 더 길다면 에러가 뜬다.
'eval' in dir( builtins) # True 있는지 없는지 체크
# eval 보다 조금 더 우아한 애
import ast
ast.literal_eval('1.2') # 1.2 -> '고급 강의6'에서 더 깊게 배울 예정
python 형변환 2가지 (type conversion)
- 함수를 변화
- 객체 방식으로 타입을 변화
7) 선언(Declaration) - 함수
- 쓰겠다고 미리 선언하는 것
-
다른 변수는 선언하는게 없다.
- 크게 2가지 1) 함수 (function) 2) 클래스 -> nonlocal,global 포함될 수도 있고 애매
def one_two(a,b):
return [a+b,a-b] # list
a=1
b=2
x,y=one_two(a,b)
x # 3
y # -1
def cho_beauty(): # 뒤에 함수에 이름을 쓴다. 함수는 PEP8 -> snake _'바'쓰는것으로 쓴다.
a = 1 # () 비어있으면 파라미터가 없다. 결과값은 1개 ; 파이썬은 return 을 안쓰면 자동적으로 return nan을 붙여준다.
# 앞단어 동사, 뒷단어를 명사 (용어집)[https://www.python.org/dev/peps/pep-0008/]
# 선언할 때는 매개변수(parameter), 사용할 때는 인자(argument) (역할하고 행위가 다르다.)
- coding style
-
EAFP: 허락보다는 용서를 구하기가 쉽다 (Easier to ask for forgiveness than permission). ex) try, except
-
LBYL: 뛰기 전에 보라 (Look before you leap). ex) java, C
- 호출 (call)
def cho_beauty(): # Call 호출
return
def cho_beauty():
''' 설명을 적는다. '''
a = 1
callable(moon_beauty) # True : 식 (함수, 개체)를 부를 수 있느냐? -> callable
jupyter notebook HELP
- shift + tap -> 설명 보는 방법 2,4,8
- ?Name # 물음표를 앞 or 뒤
- Name?? # 물음표 2번 붙이면 설명도 보여준다.
-
help(‘for’) # help 쳐도 보여준다
- command pallete: control + shift + p
- alt -> 동시에 여러개 선택할 수 있도록 해주는 것
8) 파라미터
- 파라미터 6가지 (암기) 1) 포지셔널 2) 키워드 3) 포지셔널 온리 4) 키워드 온리 5) 가변 포지셔널 6) 가변 키워드
def moon_beauty(a):
a = 1
moon_beauty # function: __a__ 현재 작업하고 있는 타일에서 정의된 아이(?)
def moon_beauty(a,b): # 인자 두개 넣어도 에러가 안난다. 다만 argument 도 2개로 바꿔야한다.
a = 1
# 1) 포지셔널 방식
moon_beauty(3,4) # 3 4
# 2) keyword 방식 : 매개변수 이름이 들어가는 것
# 순서 바꿔써도 상관 없다.
moon_beauty(b=3,a=4) # 4 3
def moon_beauty(a,b,c):
print(a,b,c)
moon_beauty(3,c=3,b=2) # 3 2 3
moon_beauty(3,c=3,2) # 한번 키워드 쓰면 그 다음부터는 계속 keyword 방식으로 써야한다.
moon_beauty(3,c=3,a=4) # 키워드 방식 쓸 때 c가 없어서 개수가 안맞아서 에러가 난다.
# 파라미터에는 디폴트값을 둘 수 있다. 하지만 조심해야한다. - 디폴트 방식
def moon_beauty(a,b=0,c=3):
print(a,b,c)
def moon_beauty(a,b=0, 3): # 디폴트 값은 뒤에서부터 차례대로 채워져야한다. 따라서 이거는 에러
print(a,b,c)
def moon_beauty(a,b,c=0): # 아무것도 안쓰면 디폴트값이 들어간다. 따라서 키워드 값이 더 편하다. 왜냐하면 디폴트 값이 있기 때문이다.
print(a,b,c)
import pandas as pd
# 3) 키워드 온리 방식만 쓸 수 있도록 만들 수도 있다.
def moon_beauty(*, a=0, b=0,c=0): # *: 다음부터는 positional 방식으로는 절대 집어넣을 수 없다.
print(a,b,c)
moon_beauty(a=3) # 3 0 0 : 키워드 방식으로 집어 넣어야한다.
def moon_beauty(x=0,*, a=0, b=0,c=0): # *: 다음부터는 positional 방식으로는 절대 집어넣을 수 없다.
print(x,a,b,c)
moon_beauty(3) # 3 0 0 0
# 4) POSITIONAL 온리 방법은 만들기가 좀 어렵다.
all # iterable , /: positional only 방식
a=[1,2,'']
all(a) # False
all(iterable=a) # typeError -> no keyword arguments
# 5) 가변 포지셔널 방식 (가변: 개수와 상관 없는 것)
def moon_beauty(*a): # * + 문자
print(a)
moon_beauty(1,2,3,) # (1, 2, 3) 인자 없이, 개수 상관 없이 넣는 방법이 가변 포지서녈 기법
# 평균 구할 때 개수마다 함수로 만들어야 한다. 하지만 이 방식을 쓰면 개수에 상관없이 받아서 쓰면 되니깐 좋다.
def moon_beauty(*a): # * + 문자
print(sum(a))
sum # iterable, / : positional only
moon_beauty(3,2,1,4,4,2) # 16
# 6) 가변 키워드 (가변: 개수와 상관 없는 것)
def moon_beauty(**a):
print(a)
moon_beauty(a=3,b=2,c=4) # {'a': 3, 'b': 2, 'c': 4}
# 엄청 많이 나온다. dictionary 형으로 나온다.
# ex) import matplotlib.pyplot as plt
9) Argument (인자)
- *a # keywords가 포지셔널 방식으로 들어간다.
- **a # values가 keyword 방식으로 들어간다.
def moon_beauty(a,b,c):
print(a,b,c)
a=[1,2,3]
moon_beauty(a[0],a[1],a[2]) # 1 2 3
# unpacking
moon_beauty(*a) # argument * 가 쪼개준다. 따라서 개수가 맞아야한다. : unpacking
a={'a':1,'b':2,'c':3}
moon_beauty(*a) # a b c : keywords가 포지셔널 방식으로 들어간다.
moon_beauty(**a) # 1 2 3 : values가 keyword 방식으로 들어간다.
a={'a':1,'c':3,'b':2}
moon_beauty(*a) # a c b
moon_beauty(**a) # 1 2 3
from star import * # * 3가지 비밀 (?)
# %whos -> import sys, moon - module 파일이름으로 부른다.
# __all__=['a'] # * 를 쳤을 때 import 되는 애를 지정할 수 있다. 문자열만 들어올 수 있다.
# _b 는 안나온다.
# _b 는 private 처럼 쓸 수 있다.
오늘 ‘*’ 배운거 7…번 나옴
1) 할당
2) 키워드 온리방식
3) 가변 포지셔널 방식
4) 가변 키워드 방식 - dictionary 로 나온다.
5) argument : * 쪼개준다.(unpacking) - 키워드가 포지셔널 방식으로 들어감
6) argument : ** values가 keyword 방식으로 들어간다.
7) all=[‘a’] # * 를 쳤을 때 import 되는 애를 지정할 수 있다. 문자열만 들어올 수 있다.
- %whos # import sys, moon - module 파일이름으로 부른다.
- from moon import a
- moon.a
-
‘_b’ 는 private으로 %whos에 안뜬다. 8) [[1,2,3],[4,5]] # unpacking - for문, argument
- _b 하면 import name 하면 private으로 안나온다.
- unpacking 기법
[*[1,2,3],*[4,5]] # [1, 2, 3, 4, 5] list
{*[1,2,3],*[4,5]} # {1, 2, 3, 4, 5} set
{*(1,2,3),*(4,5)} # {1, 2, 3, 4, 5} tuple
{*{1,2,3},*{4,5}} # {1, 2, 3, 4, 5} set
{*{'a':1,'b':2}} # {'a', 'b'} dictionary
{**{'a':1,'b':2}} # {'a': 1, 'b': 2} dictionary <- backend 에서 쓴다.
{**{'a':1,'b':2}, **{'a':3,'b':2}} # 뒤에 있는게 덮어버린다. # dictionary, set, -> {} 중복 안된다.
# {'a': 3, 'b': 2, 'd': 2}
10) lambda
- 선언을 하면 메모리가 올라간다.
- 메모리 소모 없이 일시적으로 쓸 수 있다.
- 함수이면서 식이다. (식: 하나의 값으로 표현할 수 있다)
- 따라서 할당할 수 있다.
(lambda : 1)() # 1 : colon 뒤에 있는 값은 리턴값
def x():
return 1
x = lambda :1
a=3
4 if a>2 else 1 # 4 : 하나의 값으로 축약할 수 있다 -> 식이다.
b= 4 if a>2 else 1 # 할당할 수 있다.
b # 4
- Argument에도 식을 넣을 수 있다.
def x(a):
print(a)
x(3)
x(4 if a>2 else 1)
x('' or 4) # or 쓰면 값이 하나 -> 따라서 식으로 넣을 수 있다.
x(lambda : 3)
out:
3
4
4
<function <lambda> at 0x00000258A6B3B268>
-------------------------------
x(lambda :3 or 4)
x((lambda :3) or 4)
x(lambda : 3 if a>3 else 4)() # function 있으면 괄호를 써야한다.\
out:
<function <lambda> at 0x00000258A6C9CE18>
<function <lambda> at 0x00000258A6C9CE18>
<function <lambda> at 0x00000258A6C9CE18>
다음 강의 예고: 함수안에 함수를 넣는 것을 배운다
무단 배포 금지
Comments