Study/Programming

Python 요약

빨간당무 2017. 7. 16. 10:20

print('hello world') # 콘솔 출력 및 #은 주석

hex() # 0x 16진수

bin() # 0b 2진수

oct() # 0o 8진수

type() # 자료 타입

+ - * / // % # 사칙 연산(+-*/), 몫, 나머지

a = 2.3j # 복소수 - class 'complex'

a.real # 실수부 = 2.0

a.imag # 허수부 = 3.0

a.conjugate() # 켤레 복소수 = (2-3j)


import math # 외부 모듈 추가

math.pi # 원주율

math.e # 자연상수 e

abs() # 절대값(내장함수)

round() # 반올림(내장함수)


math.trunc() # 버림(math)

math.factorial() # 팩토리얼 5! = 5 * 4 * 3 * 2 * 1

math.degrees(math.pi) # 라디안->도, 3.14~ -> 180.0

math.radians(180) # 도->라디안, 180 -> 3.14~


math.cos() # 라디안->코사인

math.sin() # 라디안->사인

math.tan() # 라디안->탄젠트

math.acos() # cos의 역함수, 코사인->라디안

math.asin() # sin의 역함수, 사인->라디안

math.atan() # tan의 역함수, 탄젠트->라디안


math.sin(math.radians(90)) # 1.0

math.cos(math.radians(180)) # -1.0

math.tan(math.radians(45)) # 0.9999999999999999

math.tan(math.pi/4) # 0.9999999999999999

math.acos(-1) # 3.141592653589793

math.asin(1.0) # 1.5707963267948966

math.atan(10000) # 1.5706963267952299


** # 제곱

math.pow() # 제곱

math.sqrt() # 제곱근


math.log(4, 2) # 로그, 밑수, 밑수 생략 시 자연수 e로 처리 # 2.0

math.log(math.e) # 1.0

math.log(1000, 10) # 2.9999999999999996

math.log10(1000) # 3.0 # 10을 밑수로 하는 경우 log10(n)이 log(n,10)보다 유리


'string'

"string"

'''multi

line

string'''

"""multi

line

string"""


s = 'Good Morning'

s[0:4] # 0번 부터 4번째 앞까지 분리

s[:4] # :앞에 생략시 0

s[:] # 전체 문자열 분리

len('1234') # 문자열 길이 # 4


a = 'Hello' # 예시의 문자열일 때

a.startswith('He') # 원본 문자열이 해당 문자열로 시작한다면 True 아니라면 False

a.endswith('lo') # 원본 문자열이 해당 문자열로 끝난다면 True 아니라면 False

a.find('ll') # 원본 문자열에서 해당 문자열을 앞에서 부터 찾는 다면 해당 위치 반환, 못찾았다면 -1 반환

a.rfind('ll') # 원본 문자열에서 해당 문자열을 뒤에서 부터 찾는 다면 해당 위치 반환, 못찾는다면 -1 반환

a.count('l') # 원본 문자열에서 해당 문자열이 몇 번 등장하는 지 반환

a.lstrip() # 원본 문자열에서 왼쪽 공백 모두 제거

a.rstrip() # 원본 문자열에서 오른쪽 공백 모두 제거

a.strip() # 원본 문자열에서 좌우 공백 모두 제거

a.isalpha() # 원본 문자열이 숫자와 기호를 제외한 알파벳(영문, 한글 등)으로만 이루어졌다면 True

a.isnumeric() # 원본 문자열이 숫자로만 이루어졌다면 True

a.isalnum() # 원본 문자열이 알파벳과 수로만 이루어져다면 True

a.replace('대상','교체') # 원본 문자열에서 대상 문자열을 교체 문자열로 교체함


b = 'Apple,Orange,Kiwi' # 예시의 문자열일 때

c = b.split(',') # 매개변수 문자열 기준으로 원본문자열을 나누어 리스트 작성 # ['Apple', 'Orange', 'Kiwi'] # class - list

a.uppder() # 원본 문자열을 모두 대문자로

a.lower() # 원본 문자열을 모두 소문자로


'My name is {0}. I am {1} yers old.'.format('Mario', 40) # 형식을 갖춘 문자열 생성시 사용

'My name is {name}. I am {age} yers old.'.format(name='Luigi', age=35)




a = input() # 콘솔로 입력 받음

int() # 자료형 변환

float() # 자료형 변환

complex() # 자료형 변환

str() # 자료형 변환

print(1 + '23' + 4) # error

print(1 + int('23') + 4) # 28

print(str(1) + '23' + str(4)) # '1234'


<< # 왼쪽 시프트

>> # 오른쪽 시스픝

& # 논리곱

| # 논리합

^ # 배타적 논리합 (XOR), 다르면 1 같으면 0

~ # 보수(NOT)


리스트(List[],변경가능), 튜플(Tuple(),변경불가능), 딕셔너리(Dictionary{},변경가능)


[1,2,3] + [4,5,6] # 리스트 연결 # [1, 2, 3, 4, 5, 6]

len([1,2,3]) # 리스트 길이 # 3


a = [1,2,3] # class - 'list'

a.append(4) # 리스트의 끝에 새 요소를 추가 # [1,2,3,4]

a.extend([5,6]) # 기존 리스트에 다른 리스트를 이어 붙임, +와 동일 # [1, 2, 3, 4, 5, 6]

a.insert([1,1.5]) # 리스트의 1번 위치에 1.5 요소를 삽입 # [1, 1.5, 2, 3, 4, 5, 6]

a.remove(1.5) # 리스트에서 해당 값을 찾아 첫번째로 발견된 요소를 삭제 

a.pop() # 리스트의 마지막 요소를 뽑아내고 삭제

a.index(3) # 리스트 내의 매개변수로 입력한(3)와 일치하는 첫 번째 요소의 첨자를 반환, 없는 경우 Error # 2

a.count(3) # 리스트 내의 매개변수로 입력한(3)와 일치하는 요소가 몇 개인지 반환 # 1


a.sort(reverse = True) # 리스트 내의 요소를 정렬함, reverse = True는 내림차순 # [5, 4, 3, 2, 1]

a.sort() # 리스트 내의 요소를 정렬함, 기본적으로 오름차순 # [1, 2, 3, 4, 5]

a.reverse() # 리스트 내의 요소 순서를 반대로 바꿈 # [5, 4, 3, 2, 1]

a.clear() # 리스트 내의 모든 요소 삭제 # []


a = (1,2,3) # class - 'tuple'


튜플 생성시 1개의 요소만을 갖고 시작하는 경우 주의

a = (1) # class - int # 1

a = (1,) # class - tuple # (1,)

a[0] # 1

a[1] # error

a = () # class - 'tuple # ()

a[0] # error


리스트와 튜플도 문자열의 참조연산, 슬라이싱([:]), 결합(+) 등의 연산이 가능


문자열과 리스트는 변경이 가능하지만

튜플은 변경이 불가능


a = 1,2,3 # 튜플 패킹(Tuple Packing) # class - tuple # (1,2,3)

one, two, three = a # 튜플 언패킹(Tuple Unpacking) # one = 1, two = 2, three = 3

단, 튜플 언패킹 시 튜픙 요소의 수와 각 요소를 담아낼 변수의 수가 일치해야 함


one, two, three = 1, 2, 3 # 괄호 없이 만들어진 튜플도 가능


a = ('a', 'b', 'c')

a.index('b') # 튜플 내에 매개변수로 입력한 데이터('b')와 일치하는 튜플 내 요소의 첨자 반환, 없는 경우 Error # 1

a.count('b') # 튜플 내에 매개변수로 입력한 데이터('b')와 일치하는 요소가 몇 개인지 반환 # 1

튜플은 변경이 불가능하기 때문에 제공하는 메소드가  index(), count() 밖에 없음


dic = {} # class - dict

dic['a'] = 'aa' # {'a': 'aa'}

dic['b'] = 'bb' # {'a': 'aa', 'b': 'bb'}


dic.items() # dict_items([('a', 'aa'), ('b', 'bb')])

dic.keys() # dict_keys(['a', 'b'])

dic.values() # dict_values(['aa', 'bb'])


'a' in dic.keys() # True

'aa' in dic.values() # True


dic.pop('a') # 딕셔너리 내에 있는 키-값 쌍을 제거, 값이 반환됨

dic.clear() # 모두 삭제 # {}


True / False

not, and, or

비어있는 리스트, 튜플, 딕셔너리는 False


False : bool(False), None, 0, 0.0, '', (). [], {}

True : bool(True), 'H', 1, 


==, !=, >, >=, <, <=





a = int(input())

if a == 0:

print('0')

else:

print(a)


import sys

sys.exit(0) # 프로그램 종료


if a < 0:

print('음수')

elif a > 0:

print('양수')

else:

print('0')


count = 0

limit = 10

while count < limit:

count = count + 1

print(count)


for i in (1,2,3):

print(i)


for s in ('a','b','c'):

print(s)


for s in ['a','b','c']:

print(s)


for s in {'a','b','c'}:

print(s)


for s in 'abcdef':

print(s)


for i in range(0, 5, 1): # 0~5-1 step +1 # 0 1 2 3 4

print(i)


for i in range(5, 0, -1): # 5~0+1 step -1 # 5 4 3 2 1

print(i)


for i in range(0, 5): # 0~5-1 step +1 # 0 1 2 3 4

print(i)


for i in range(5): # 0~5-1 step +1 # 0 1 2 3 4

print(i)


for i in range(1, 6): # 1~5

for j in range(i): # 0 / 01 / 012 / 0123 / 01234

print('*', end = '') # end = ''을 매개변수로 입력하면 줄바꿈을 출력하지 않음

print() # 다음줄 출력


*

**

***

****

*****


continue

break


for i in range(5, 0, -1):

for j in range(0,i,1):

print('*', end = '')

print()

*****

****

***

**

*


def hello(): # 기본 함수형

print("Hello World!")

hello()


def my_abs(arg): # 매개변수를 받는 함수형

if (arg < 0):

result = arg * -1

else:

result = arg

return result


def print_string(text, count=1): # 기본값이 지정된 함수형

for i in range(count):

print(text[i])


print_string('안녕하세요') # 안

print_string('안녕하세요', 2) # 안 / 녕


def merge_string(*text_list): # 가변 매개변수

result = ''

for s in text_list:

result = result + s

return result


merge_string('안','녕','하','세','요') # '안녕하세요'


def type_onestar(*arg): # *를 쓰면 튜플

print(type(arg))


type_onestar(1) # <class 'tuple'>


def type_twostar(**arg): # **를 쓰면 딕셔너리

print(type(arg))


type_twostar(a=1,b=2) # <class 'dict'>


def print_args(*argv, argc): # 가변 매개변수 뒤에 정의된 일반 매개변수의 경우

return 0


print_args(1,2,3,4) # 반드시 키워드 매개변수로 호출해야 함


Traceback (most recent call last):

  File "<pyshell#370>", line 1, in <module>

    print_args(1,2,3,4)

TypeError: print_args() missing 1 required keyword-only argument: 'argc'


print_args(1,2,3, argc = 4) # OK


return # return None 과 동일


기본적으로 변수는 지역 변수임


def scope_test():

global g_a

g_a = g_a + 1

print(g_a)


scope_test() # 함수 밖에서 g_a 변수가 선언되지 않았다면 아래와 같은 오류가 발생됨


Traceback (most recent call last):

  File "<pyshell#376>", line 1, in <module>

    scope_test()

  File "<pyshell#374>", line 3, in scope_test

    g_a = g_a + 1

NameError: name 'g_a' is not defined


g_a = 0 # 변수 선언


scope_test() # 변수 선언 후 호출 시 정상 작동 # 1


def some_func(count): # 재귀함수 호출

if count > 0:

some_func(count-1)

print(count)


some_func(3) # 0 / 1 / 2 / 3


def factorial(n): # 팩토리얼 함수

if n == 0:

return 1

else:

return factorial(n-1)*n


factorial(5) # 120


def no_idea(i = 0):

i = i + 1

print(i)

no_idea(i)


no_idea(1000) # 종료 조건 없이 재귀함수를 반복적으로 호출 하다 보면 파이썬이 지정한 최대 재귀 단계를 초과하여 오류발생


Traceback (most recent call last):

  File "<pyshell#393>", line 1, in <module>

    no_idea()

  File "<pyshell#392>", line 4, in no_idea

    no_idea(i)

  File "<pyshell#392>", line 4, in no_idea

    no_idea(i)

  File "<pyshell#392>", line 4, in no_idea

    no_idea(i)

  [Previous line repeated 974 more times]

  File "<pyshell#392>", line 3, in no_idea

    print(i)

RecursionError: maximum recursion depth exceeded while pickling an object


def print_something(a):

print(a)


p = print_something # 함수 이름만 지정하여 변수에 저장


p('abc') # 변수 이름 뒤에 ()를 붙여 함수처럼 호출 # 'abc'


def plus(a, b):

return a + b


def minus(a, b):

return a - b


flist = [plus, minus]


type(flist) # <class 'list'>


flist[0](1, 2)

flist[1](1, 2)


for i in range(0,2):

flist[i](1, 2)


flist2 = {0 : plus, 1 : minus}


type(flist2) # <class 'dict'>


for i in range(0,2):

flist2[i](1, 2)


def hello_korean():

print('안녕하세요')


def hello_english():

print('Hello')


def greet(hello): # 매개변수로 함수 이름을 넘김

hello()


greet(hello_korean) # 안녕하세요


greet(hello_english) # Hello


def get_greeting(where):

if where == 'K':

return hello_korean

else:

return hello_english


get_greeting('K')() # 안녕하세요


import math


def stddev(*args): # 중첩함수(Nested Function) 예제

def mean():

return sum(args) / len(args) # sum함수에 리스트를 입력하면 리스트의 모든 요소의 합을 반환함

def variance(m):

total = 0

for arg in args:

total += (arg - m) ** 2

return total / (len(args) - 1)

v = variance(mean())

return math.sqrt(v)


stddev(2.3, 1.7, 1.4, 0.7, 1.9) # 0.6

stddev(2, 3, 1) # 1.0

stddev(2, 3, 2) # 0.5773502691896258

stddev(2, 3) # 0.7071067811865476


def empty_function():

pass # 빈 구현(구현을 뒤로 미룸)


class empty_class:

pass # 클래스 구현도 뒤로 미룰 수 있음


def plus(a, b):

return a + b

def minus(a, b):

return a - b

def multiply(a, b):

return a * b

def divide(a, b):

return a / b


# calculator.py

def plus(a, b):

return a + b

def minus(a, b):

return a - b

def multiply(a, b):

return a * b

def divide(a, b):

return a / b


import 모듈명 # 모듈의 실제 파일 명은 "모듈.py"

from 모듈명 import 변수또는함수또는클래스


# calc_tester.py

import calculator


print(calculator.plus(10, 5))

print(calculator.minus(10, 5))

print(calculator.multiply(10, 5))

print(calculator.divide(10, 5))


# calc_tester2.py

from calculator import plus

from calculator import minus

from calculator import multiply

from calculator import divide


from calculator import plus, minus, multiply, divide # 위 코드 4줄과 동일한 효과


print(plus(10, 5))

print(minus(10, 5))

print(multiply(10, 5))

print(divide(10, 5))


import 시 모듈을 찾는 순서

1. 파이썬 인터프리터 내장 모듈

2. sys.path에 정의되어 있는 디렉토리


sys.path


['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\idlelib', 'C:\\Users\\Administrator\


\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python


\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\


\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\


\Python\\Python36\\lib\\site-packages']


sys.path에 정의되어 있는 디렉토리는 크게 세 가지로 구분됨

1. 파이썬 모듈이 실행되고 있는 현재 디렉토리

2. PYTHONPATH 환경변수에 정의되어 있는 디렉토리

3. 파이썬과 함께 설치된 기본 라이브러리


import sys

for path in sys.path:

print(path)


C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Lib\idlelib

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python36.zip

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\DLLs

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib

C:\Users\Administrator\AppData\Local\Programs\Python\Python36

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages


sys.builtin_module_names # 파이썬 내장 모듈 목록


('_ast', '_bisect', '_blake2', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', 


'_codecs_tw', '_collections', '_csv', '_datetime', '_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof', 


'_md5', '_multibytecodec', '_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha3', '_sha512', 


'_signal', '_sre', '_stat', '_string', '_struct', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 


'_winapi', 'array', 'atexit', 'audioop', 'binascii', 'builtins', 'cmath', 'errno', 'faulthandler', 'gc', 'itertools', 


'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'parser', 'sys', 'time', 'winreg', 'xxsubtype', 'zipimport', 'zlib')


최상위 수준으로 실행되는 스크립트 = 메인 모듈

__name__ # 내장 전역 변수 # '__main__'


# sub.py

print('beginning of sub.py...')

print('name : {0}'.format(__name__))

print('end of sub.py...')


# main.py

import sub


print('beginning of main.py...')

print('name : {0}'.format(__name__))

print('end of main.py...')


#실행결과

beginning of sub.py...

name : sub

end of sub.py...

beginning of main.py...

name : __main__

end of main.py...


# 위 코드의 포인트는 import sub를 호출하였을 때 sub에 있는 코드가 수행된다는 점


# 만약 sub.py의 코드가 최상위 일 때만 수행하게 하려면 아래와 같이 수정하면 됨

# sub.py

if __name__ == '__main__':

    print('beginning of sub.py...')

    print('name : {0}'.format(__name__))

    print('end of sub.py...')


#실행결과

# python main.py # main.py를 실행할 대는 안나옴

beginning of main.py...

name : __main__

end of main.py...


# python sub.py # sub.py를 실행할 때만 나옴

beginning of sub.py...

name : __main__

end of sub.py...


# 패키지 생성 시

1. 디렉토리 생성

2. 해당 디렉토리에 __init__.py 생성 # 일반적으로는 내용을 비워둠

만약 내용을 넣는 다면 __all__ 변수 내용을 수정함

__all__ 변수는 디렉토리 내에 포함시킬 모듈이름을 나열함 (.py 확장자는 제외하고 나열)


# __init__.py # module1.py, module2.py, module3.py를 포함 시

__all__ = ['module1', 'module2', 'module3']


# 호출할 때는 아래와 같이 호출

from my_package import calculator

print(calculator.plus(10, 5))


from my_package import * # 해당 패키지의 모든 모듈을 호출 시


# sys.path 때 나오는 site-packages는 파이썬의 기본 라이브러리 패키지 외에 추가적인 패키지를 설치하는 디렉토리임

# 임의로 site-packages 디렉토리에 패키지용 디렉토리(my_package2)를 생성하고

# __init__.py와 my_module.py를 아래와 같이 작성 후


# my_module.py

def info():

    print(__name__)


# python shell를 restart 한 뒤

from my_package2 import my_module

my_module.info()


# 아래와 같은 결과가 출력됨 # 모듈의 패키지이름.모듈이름 과 실제 py 파일 위치

my_package2.my_module

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\my_package2\my_module.py


# import 시에 alias 부여 가능

from my_package2 import my_module as mm

mm.info() # my_module를 mm으로 축약하여 사용 가능