Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- effective
- reactor
- libuv
- VCS
- html
- spring
- redis
- r
- javascript
- Heap
- 네트워크
- reactive
- Java
- network
- cache
- Static
- mongodb
- AWS
- mybatis
- 데이터통신
- Linux
- ajax
- git
- socket
- Elk
- github
- HTTP
- Lombok
- nodejs
- NoSQL
Archives
- Today
- Total
빨간색코딩
파이썬의 기초 (개발환경 세팅, 문법) 본문
- 참조문서
- 점프 투 파이썬 : https://wikidocs.net/book/1
다른 언어에 어느정도 다룰 수 있는 상태라면, 아래만 봐도 파이썬을 이해하는데 크게 문제는 없을 정도로만 정리했다.
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