본문 바로가기

노력/인공지능

2. 파이썬 개인공부 2 (데이터 타입)

많이 사용하는 것은 리터럴이 있다.


range, bytearray, frozenset처럼 객체방식을 쓸 필요가 없다.


x = bytearray()


리터럴이지만 어쩔 수 없이 객체를 사용해야 하는 것 : 집합


y = set() : 이렇게 해야 공집합을 만들 수 있다.




b = list(range(10))

b : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

10

b = [range(10)]

b : [range(0, 10)]


리스트를 리터럴로 선언하는 방식과 그냥 대괄호로 선언하는 방식이 조금 다르다.


중복이 있는 리스트를 set()으로 덮어버리면 중복이 제거된 상태로 출력된다.



딕셔너리:


  그냥 일반적인 선언: y = {"a":1, "b":2}, y = {3:1, "b":2} -> 이렇게 숫자를 사용한 키도 가능하다.


  객체 방식으로 만들 때 : dict(a=1, b=2), dict(3=1, b=2) -> 리터럴을 이용해서 선언하면 이런 키는 사용이 불가능하다.

  

  - 파이썬 정의에서 키로 사용할 수 있는 것은 immutable이면 다 사용할 수 있도록 되어있다.

  

len() : 안에 iterable을 사용할 수 있다. iterable 길이를 알 수 있다.




len = 3

%whos

Variable   Type         Data/Info
---------------------------------
a          int          1
b          list         n=1
c          int          0
d          bool         True
len        int          3
x          bytearray    bytearray(b'')
y          dict         n=2

del len

위의 방법처럼 built-in 함수인 len을 내 마음대로 변경할 수 있다. 하지만 사용하지 말자.


키워드에는 이런 방법을 사용할 수 없다.

ex) in = 3은 에러




if문 :
  if 참거짓을 알 수 있는 문장 :
  
a = 1000
b = 1000

a == b : True

a is b : False

is는 값뿐만 아니라 메모리 주소까지 비교하게 된다. id(a)와 id(b)가 다르기 때문에 False가 출력된다.

a != b 

a is not b : 메모리 주소까지 비교



and, or : and는 두 개 다 true일 때, or는 둘 중 하나만 true일 때

  - 존재론적으로 생각해야 한다.

and 앞에 있는 애가 거짓이면 거짓
and 앞에가 참이면 뒤에 것으로 참 거짓을 나눈다.

or는 앞에 있는 것이 거짓이면 뒤에 것으로 참 거짓을 나눈다.
or는 앞에 값이 참이면 참

2 or 1/0 : 2  ->  앞에 값이 참이면 뒤에는 아예 보지도 않고 앞의 값으로 출력된다.

문자열 + 숫자열 안된다.

숫자 * 문자열 가능하다.

'' in 'aaa' : True



없는 것은 거짓 int() -> 0

'a' > 'Aa' : 이런것은 다 ascii코드로 비교한다. 뒤처럼 문자열인 경우 a와 A를 먼저 비교함.
             만약 앞에가 같아서 a와 a라면 그 때 뒤를 비교함.
             
t = 3 if a>5 else 5   -> 이 문장은 콜론이 없기 때문에 식이다. if가 맞다면 앞의 3 할당, 아니면 뒤의 5 할당



else 용법 3가지가 있음:
  조건문에 쓰는 else, 반복문에 쓰는 else, 예외처리에 쓰는 else
  
  - 조건문 : 조건이 참이 아니면 실행
  - 반복문 : 완벽하게 순회를 다 마쳤을 때. break로 잘렸을 때 출력 안된다. 반복문이 올바르게 수행되었는지 확인하기 위해 사용. for~else는 잘 사용하지 않는다. 알고는 있어야한다.
  - 예외처리 : 

  
for i in dict(a=3, b=3):
    print(i)
    
a
b

딕셔너리는 기본적으로 키값을 본다.

{'a':1, 'a':3} 나중값이 할당된다. a = 3

키 값은 고유할 수 밖에 없다.

{'a':1, 'b':3}.values()
{'a':1, 'b':3}.items()

for i, j in {'a':3, 'b':3}.items():
    print(i, j)

가능하다.

for i, j, k in {'a':3, 'b':3}.items():
    print(i, j, k)
    
불가능하다.


for i in enumerate('abcdefg', 1):     ->  enumerate를 사용하면 0부터 인덱스를 출력한다. iterator 옆에 콤마로 숫자를 붙이면 그 숫자부터 인덱스가 늘어난다.

    print(i)

    

(1, 'a')

(2, 'b')

(3, 'c')

(4, 'd')

(5, 'e')

(6, 'f')

(7, 'g')




list(map(lambda x:x+1, [1,2,3,4,5,6])) : 어떤 iterator를 넣어주면 1씩 증가해서 순회한다.
[2, 3, 4, 5, 6, 7]



sum(iterable) : 이터러블 값들을 더하는 함수



디자인 패턴 : 파이썬에도 기본적인 디자인 패턴들이 있다.
반복에 대한 패턴 loop pattern이라고 한다.


반복의 관점에서 보는 것 크게 2가지:
  for, while     /    가능한 한 안쓰고 사용하는 법

  loop-and-a-half
  
  
while 참거짓 :
  참이면 반복한다.  
  
  
  
  
  컴퓨터공학의 기본 2A: Abstraction, Automation
  
  
함수 선언, 할당이 동시에 이루어짐.

자바같은 언어처럼 int x = Integer();
x = 10; 이런식이면 선언과 할당이 다른것.

NameError, 파이썬 함수가 선언이 안되었을 때 사용하면 발생한다.

함수에서는 return이 무조건 있어야 한다.

파이썬에서는 return을 생략했을 때, return None을 자동으로 붙여준다.

def abc():
  pass
  
abc

<function __main__.abc>

함수에 괄호를 쓰지 않고 이름만 쓰면 function __main__.abc라는 값이 나온다.
이 값이 나오면 괄호를 써야 한다고 생각하면 된다.

callable(abc) -> True



함수부터 객체까지는 모두 잘 알아야하는 내용이다.

흐름을 가지고 이해하고 암기해야한다.



--- 파라미터(parameter)와 아규먼트(argument) 차이
 : 정의할 때 쓰는 것이 파라미터, 함수를 사용할 때 쓰는 것이 아규먼트
 
  def abc(a) -> parameter
  
  abc(10) -> argument



  - 파라미터 : 식을 사용할 수 없다. 함수 안에 함수를 사용할 수 있다.
  
  - 아규먼트 : 식을 사용할 수 있다.