빨간색코딩

파이썬의 기초 (개발환경 세팅, 문법) 본문

python

파이썬의 기초 (개발환경 세팅, 문법)

빨간색소년 2022. 2. 1. 14:43

다른 언어에 어느정도 다룰 수 있는 상태라면, 아래만 봐도 파이썬을 이해하는데 크게 문제는 없을 정도로만 정리했다.

0. 개발환경 세팅

  • window10 기준
  • pyenv 설치 : https://github.com/pyenv-win/pyenv-win
    • 여러 파이썬 버전을 설치하고 관리해줌. nodejs의 nvm 같은 것
    • 환경변수 설정
      • PYENV, PYENV_ROOT, PYENV_HOME = %USERPROFILE%\.pyenv\pyenv-win
      • PATH += %USERPROFILE%\.pyenv\pyenv-win\bin, %USERPROFILE%\.pyenv\pyenv-win\shims
    • pyenv rehash
    • pyenv install --list 하면 최신버전이 안오미. pyenv update 해야함
  • 가상환경 venv
    • virtualenv 는 pip로 별도 설치해야하나, venv 는 3.3부터 기본 라이브러리로 포함
    • venv는 가상환경을 파이썬 버전별로 임의로 만들 수 없음
    cd 프로젝트 디렉터리
    python -m venv .venv # .venv는 자유롭게 이름설정
    .venv\Scripts\activate # 가상환경 활성화
    .venv\Scripts\deactivate # 비활성화

1. 변수

  • 서로 다른 형끼리 덧셈하면 TypeError 발생
    • 3 + "hi" => str(3) + "hi"
  • 자료형 확인 : type(a)
  • 메모리 주소 확인 : id(a)
  • 동일한 인스턴스 확인 : a is b
  • 여러 할당
    • a, b = 'python', 'life'
    • 튜플이라 괄호 생략 가능
    • 리스트도 가능 : [a, b] = 'python', 'life'
    • swap : a, b = b, a

1-1. 숫자형

  • 정수형 : a = 123
  • 실수형 : a = 1.2
  • 8진수, 16진수 : a = 0o177

1-1-1. 사칙연산

  • 덧셈 : +
  • 뺄셈 : -
  • 곱셈 : *
  • 제곱 : **
    • ex) 3 ** 4 = 3의 4제곱 = 81
  • 나눗셈
    • 소수로 표현 : /
    • 몫만 반환 : //
  • 나머지 : %
  • 몫과 나머지를 한번에 : divmod(50, 8)
  • 대입연산 가능
    • ex) *=

1-2. 문자열

  • 형태
    • "문자열"
    • '문자열'
  • 여러줄 형태
    • \n 으로 해도 되지만 길어짐. 가독성 떨어짐
    • """문자열"""
    • '''문자열'''
  • escape : \
  • 문자열의 요소값은 바꿀 수 없음. 불변이다.

1-2-1. 문자열 연산

  • 연결 : a + b
  • 반복 : a * 2
  • 길이 : len(a)
  • 인덱스로 접근 : a[0]
    • 거꾸로 접근 a[-1] : 뒤에서 첫번째 단어
  • 인덱스로 자르기 : a[0:4] : 끝번호는 포함하지 않음
    • 끝번호 생략하면 끝까지 자른다
    • 앞번호도 마찬가지

1-2-2. 문자열 포매팅

  • 포맷 코드
    • %s : 문자열(String), 숫자형이 오더라도 문자열로 바꾸고 대입해주므로 가장 유연함
    • %c : 문자 1개(character)
    • %d : 정수(Integer)
    • %f : 부동소수(floating-point)
    • %o : 8진수
    • %x : 16진수
    • %% : Literal % (문자 % 자체)
  • %10d 는 10자리 공간으로 오른쪽 정렬시키고 대입시킴. 반대는 %-10d
  • format 함수도 가능
    • named parameter = "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
    • 왼쪽 정렬 : "{0:<10}".format("hi")
    • 오른쪽 정렬 : "{0:>10}".format("hi")
    • 중앙 정렬 : "{0:^10}".format("hi")
  • 예제
    • "I eat %d apples." %3 = "I eat {0} apples".format(3)
    • "I eat %s apples." % "five" = "I eat {0} apples".format("five")
    • "I ate %d apples. so I was sick for %s days." % (number, day) = "I ate {0} apples. so I was sick for {1} days.".format(number, day)
  • 접두사 f를 붙이면 변수를 바인딩해서 더 편하게 사용가능.
    • 파이썬 3.6부터 제공
    • f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
    • 표현식도 제공하여 {age+1} 같은 것도 가능

1-2-3. 자주쓰는 함수

  • 문자 세기 : "hobby".count("b")
  • 문자 찾기 : 문자열.find(단어)
    • 찾으면 첫 index
    • 못찾으면 -1
  • 문자 삽입 : ",".join('abcd') => 'a,b,c,d'
  • 대소문자 : upper(), lower()
  • 공백제거 : lstrip, rstrip, strip
  • 문자열 치환 : a.replace("Life", "Your leg")
  • 문자열 나누기 : b.split(':')
    • split() 만 하면 공백을 기준으로 나눈다

1-3. 리스트

  • 생성 
  • a = []
    a = list()
    b = [1, 2, 3]
    c = ['Life', 'is', 'too', 'short']
    d = [1, 2, 'Life', 'is']
    e = [1, 2, ['Life', 'is']]
  • 복사하기
    • b = a[:]
    • b = a.copy()
    • from copy import copy , b = copy(a)

1-3-1. 리스트 연산

  • 음수 인덱스는 뒤에서부터 찾는다.
  • 슬라이싱 : [0:2]
  • 더하기 : +
    • 중복제거 안된다
  • 반복하기 : *
  • 수정 : a[1] = 2
  • 삭제 : del a[1]
    • del a[2:] : 3번째 원소부터 전부 삭제

1-3-2. 자주쓰는 함수

  • 길이 구하기 : len(리스트)
  • 요소를 뒤에 추가 : append(x)
  • 요소 삽입 : insert(위치, 요소값)
  • 정렬 : sort()
  • 뒤집기 : reverse()
  • 위치반환 : index(x)
  • 첫번째로 일치하는 요소를 제거 : remove(요소값)
  • 마지막 요소 꺼내고 삭제 : pop()
    • pop(index)는 index를 꺼내고 삭제한다.
  • 특정 값 갯수 세기 : count(값)
  • 더하기의 함수버전 : a.extend(b)

1-4. 튜플

  • 리스트와 거의 동일하지만 아래와 같은 차이점이 있음
    • 리스트는 [] 이지만 튜플은 () 이다.
    • 리스트는 생성, 삭제, 수정이 가능하지만 튜플은 불변이다.
    • 1개의 요소만을 가질 때는 콤마로 이어줘야함.
  • 생성
    t1 = ()
    t2 = (1,)
    t3 = (1, 2, 3)
    t4 = 1, 2, 3
    t5 = ('a', 'b', ('ab', 'cd'))

1-5. 딕셔너리

  • Key와 Value를 한 쌍으로 갖는 자료형
  • 쌍 추가 : a[2] = 'b'
  • 쌍 삭제 : del a[2]
  • 주의사항
    • 중복 key 불가능
    • 튜플은 key로 쓸수 있지만, list는 불가능

1-5-1. 자주쓰는 함수

  • key 목록 : keys()
    • list는 아니고 dict_keys 객체이다. iterator는 가능하다. 순수 list를 얻고 싶다면, list(a.keys()) 를 해줘야함
    • dict_keys 이므로, append, insert, pop 같은 리스트의 함수들은 실행 불가능
  • value 목록 : values()
    • list는 아니고 dict_values 객체이다.
  • 쌍 목록 : items()
    • key와 value를 튜플로 묶은 dict_items 객체이다.
    • a.items() => dict_items([('name', 'pey'), ('phone', '0119993323'), ('birth', '1118')])
  • 조회 : a.get(key)
    • a[key] 는 없으면 오류발생, a.get(key)는 없으면 None
    • a.get(key, defaultValue) : key 가 없으면 미리 정해둔 기본값으로 가져옴
  • 해당 key 가 딕셔너리 안에 있는지 검사 : 'name' in a

1-6. 집합

  • 생성
    s1 = set([1,2,3]) # {1, 2, 3}
    s2 = set("Hello") # {'e', 'H', 'l', 'o'}
    s3 = set()
  • 특징
    • 중복을 허용하지 않음
    • 순서가 없음

1-6-1. 집합의 연산

  • 교집합 : s1 & s2 = s1.intersection(s2)
  • 합집합 : s1 | s2 = s1.union(s2)
  • 차집합 : s1 - s2 = s1.difference(s2)

1-6-2. 자주쓰는 함수

  • 값 추가 : add(x)
  • 여러 값 추가 : update([a, b, c])
  • 값 제거 : remove(x)

1-7. Boolean

  • bool(값) : True/False
  • 자료형의 값이 비어있으면 False
    • 1 : True
    • 0 : False
  • None도 False

2. 제어문

2-1. if문

  • 구조
    if 조건문1:
        수행문
    elif 조건문2:
        수행문
    else:
        수행문
  • 비교연산자 : <, >, ==, !=, >=, <=
  • 조건연산자 : and, or, not
  • in : x in 리스트 , x in 튜플 , x in 문자열
    • not in 도 가능
  • pass : 실행할 코드가 없는 것을 명시적으로 나타냄. 중단되진 않고 다음 코드를 계속해서 실행한다.

2-2. while문

  • 구조
    while 조건문:
        수행문
  • break : 반복문을 빠져나감
  • continue : 조건문으로 바로 돌아간다

2-3. for문

  • 구조
    for 변수 in 리스트(또는 튜플, 문자열):
        수행문
  • 다양한 for문 형태
    • for element in ['one', 'two', 'three']:
    • for (first, last) in [(1,2), (3,4), (5,6)]:
    • for index in range(len(리스트)):
  • range(start, end) : end는 미만이다. for문과 함께 잘쓰임
  • 리스트 내포
    • 구조 : [표현식 for 항목 in 반복가능객체 if 조건문]
    • 예제
      a = [1,2,3,4]
      result = [num * 3 for num in a if num % 2 == 0]
      print(result) # [6, 12]

3. 함수

  • 구조
    def 함수명(매개변수):
        수행문
  • return문이 없으면 None 이다.
  • add(1, 2) 대신 매개변수를 지정하여, add(a=1, b=2) 로 호출할 수 있다.
  • 입력받을 수 있는 매개변수가 여러개라면, 함수명(*args) 로 선언할 수 있다.
    • 내부적으로 args는 튜플로 만들어져서 넘겨진다.
  • 키워드 파라미터 : 함수명(**kwargs) 로 선언하며, 딕셔너리 형태로 넘겨진다.
    • ex) print_kwargs(name='foo', age=3)
  • 함수의 반환은 1개밖에 못한다. 따라서 여러개를 반환하고 싶다면 튜플로 묶던지 해야한다.
  • 매개변수 초기값설정이 가능하다. 함수명(a, b, c=True)
    • 뒤에 써야한다.
    • 입력값이 없다면 이걸 쓴다.
  • 로컬 변수
    • 함수 내 선언된 변수는 함수 스코프를 가진다. 밖으로 가면 유효하지 않는다.
    • 함수 밖 변수를 사용해야한다면, global a 로 접근가능하다.
  • lambda 는 def 와 비슷하지만, 한줄로 간결하게 쓸 때 사용한다. 
  • add = lambda a, b: a + b
    result = add(3, 4)

4. 입출력

  • 프롬프트 입력 : number = input("숫자를 입력하세요: ")
  • 개행없이 출력 : print(i, end=" ")

5. 클래스

  • 클래스의 함수의 첫번째 매개변수는 self로, 인스턴스가 자동으로 할당된다.a = Cal() a.함수(4, 2) Cal.함수(a, 4, 2)
  • 생성자 함수명 : __init__
  • 상속 : class 자식(부모)
  • 클래스 변수 : 객체변수는 객체마다 다르게 생성되는 변수이지만, 클래스 변수는 static한 변수다.
    • 따라서, 여러 객체가 하나의 클래스 변수를 공유한다.
    class Family:
        lastname = "김"

6. 모듈

  • 모듈은 하나의 .py 파일이다.
  • import 모듈명
    • 같은 디렉터리에 있거나, 파이썬 라이브러리여야 한다.
    • .py 확장자는 생략
  • from 모듈명 import 특정부분
    • ex) from mod1 import add, sub
  • __name__ 변수에는 내가 실행한 py일 경우, __main__ 이 저장되고, 아닐 경우, 해당 모듈명이 저장된다.
    if __name__ == "__main__":
        print(add(1, 4))
        print(sub(4, 2))

7. 패키지

  • 패키지(Packages)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리
  • 패키지 디렉터리의 구조
    game/
        __init__.py
        sound/
            __init__.py
            echo.py
            wav.py
        graphic/
            __init__.py
            screen.py
            render.py
        play/
            __init__.py
            run.py
            test.py
  • __init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할
    • python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식
    • 별다른 코드는 없음. import * 에 대비하여 __all__ 를 만지는 정도?

8. 예외처리

  • 구조
    try:
        수행문1
    except [발생 오류[as 오류 메시지 변수]]:
        수행문2
    else: # 오류가 없으면 수행
        수행문3
    finally:
        수행문4
  • 예제
    try:
        a = [1,2]
        print(a[3])
        4/0
    except ZeroDivisionError as e:
        print(e)
    except IndexError as e:
        print(e)
    # except (ZeroDivisionError, IndexError) as e:
  • 의도적으로 오류 발생시키기 : raise NotImplementedError
  • 커스텀 예외 작성 : class MyError(Exception):
    • raise MyError()
    • __str__ 를 구현하면 print(e) 를 할때 오류메세지가 출력된다.

9. 내장함수

  • import 필요없이 바로 사용 가능
  • https://wikidocs.net/32
  • enumerate : for i, name in enumerate(['body', 'foo', 'bar']):
  • filter : list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6]))
  • int : 정수형으로 변환
  • isinstance(object, class)
  • map : list(map(lambda a: a*2, [1, 2, 3, 4]))

10. 라이브러리(standard library)

11. 기타

  • with 문
    • java의 try with resource 랑 비슷한 듯
    • # AS-IS
      f = open("test.txt", "r") # 자원 획득
      text = f.read() # 자원 사용
      f.close() # 자원 반납
      
      # TO-BE
      with open("test.txt", "r") as f:
          text = f.read()

'python' 카테고리의 다른 글

Flask 기초  (0) 2022.02.02
파이썬 2.7 설치 (pip, virtualenv, window10기준)  (0) 2018.06.26
Comments