본문 바로가기
Learning-log/Python

[기본 문법] Python 기본 문법을 익혀보자 !

by why제곱 2024. 7. 14.

Java에 이어 Python 익히기에 도전한다. 사실 개발 처음 배울 때 Python부터 익혔는데 1년동안 사용하지 않고 Java만 미친듯이 했더니 하나도 기억나지 않는다 ^., ^ 

 

그래서 다시 공부해보는 Python 기본 문법!~

 

변수

Java에 비해 훨씬 간단한 Python 변수 선언. type을 지정할 필요없이 아래와 같은 형식으로 선언하면 된다. (type은 알아서 지정됨.)

(변수명) = 값

 

 
a = 10000
b = 'variable'

print(type(a))
print(type(b))

# <class 'int'>
# <class 'str'>
 

 

 

- 문자열을 정수로 변환

num_str = "720"
num = int(num_str)
print(num, type(num))

#720 <class 'int'>

 

- 문자열을 실수로 변환

num_str = "720"
num = float(num_str)
print(num, type(num))

# 720.0 <class 'float'>

 

- 정수를 문자열로 변환

num = 720
num_str = str(num)
print(num_str, type(num_str))

# 720 <class 'str'>

 

 

문자열

맨 앞 글자의 index를 0으로 두고, 오른쪽 방향은 +1, 왼쪽 방향은 -1씩 더해준다고 생각하면 된다. 이 때, 맨 앞글자에서 왼쪽 방향으로 가는 경우는 문자열의 맨 뒷글자로 이동한다고 생각하면 된다. 따라서 맨 뒤 문자열의 index는 (해당 문자열 길이) -1 또는 -1 이라고 할 수 있다.

이 index를 바탕으로 문자열을 부분으로 나누거나 원하는 글자만 가리키거나 잘라내는 인덱싱이나 슬라이싱을 할 수 있다.

 

- 인덱싱

 

letters = 'python'
print(letters[0], letters[2])
 
# p t

 

 

 

- 슬라이싱

license_plate = "24가 2210"
print(license_plate[-4:])

# 2210

 

string = '홀짝홀짝홀짝'
print(string[::2])

# 홀홀홀

 

string = "PYTHON"
print(string[::-1])
 
#NOHTYP

 

 

 

- 문자열 포매팅

문자열 사이에 포캣코드를 대입시켜 결과를 출력하는 방법이다. 아래 포맷코드를 활용한다. 

포맷 코드 설명
%d 정수(Integer)
%f 부동 소수(float)
%c 문자(Character)
%s 문자열(String)
%o 8진수
%x 16진수
%% 문자 %

 

사용 예시는 아래와 같다.

num = 200
print("넣고 싶은 숫자는 %d입니다." %200)
print("넣고 싶은 숫자는 %d입니다." %num)

sale = 50
print("이 물건의 할인율은 %d%%입니다." %sale)

string = 'Hello World'
print("string 변수에 대입된 값은 %s입니다." %string)

# 넣고 싶은 숫자는 200입니다.
# 넣고 싶은 숫자는 200입니다.
# 이 물건의 할인율은 50 %입니다.
# string 변수에 대입된 값은 Hello World입니다.

 

포맷코드를 활용한 문자열 뒤에 대입할 숫자나 문자열, 혹은 그 값이 대입된 변수를 '%(원하는 값)'을 적어주면 된다. 또한, 문자열에 %를 입력하고 싶다면 %%을 입력하면 %하나로 출력된다.

 

문자열 관련 함수들

사용할 문자열 뒤에 .을 붙인 후 해당 함수명을 써서 사용한다.

"문자열".사용함수()

 

- replace() : 치환

phone_number="010-1111-2222"
phone_number = phone_number.replace("-", " ")
print(phone_number)

#010 1111 2222

 

- count()

 

- find(찾을 값, 시작인덱스, 종료 인덱스) 

문자열의 시작~종료 인덱스 사이에서 찾을 값이 처음 나타나는 위치를 반환하며, 문자열 내에 해당 값이 없는 경우 -1을 반환한다. (이때 종료 인덱스는 포함하지 않는다. [시작 인덱스, 종료 인덱스) ) 

 

- index(찾을 값, 시작인덱스, 종료 인덱스) 

find와 마찬가지의 동작을 하지만, 문자열 내에 해당 값이 없는 경우 AttributeError가 발생한다는 차이가 있다.

 

a = 'abc'
print(a.find('c', 1, 3))  #2
print(a.index('c', 1, 3)) #2

print(a.find('c', 0, 2)) #-2
print(a.index('c', 0, 2)) #ValueError: substring not found

 

- 구분자.join(문자열 or 리스트)

문자열 사이에 구분자를 추가한다.

a = ['a', 'b', 'c', 'd', 'e']
print(' '.join(a)) #a b c d e

 

- split(구분자)

문자열을 매개변수인 구분자를 기준으로 나누어준다. 

a = 'abc de'
print(a.split(" ")) #['abc', 'de']

 

- upper()

문자열의 알파벳 소문자를 대문자로 변환하여 반환

- lower()

문자열의 알파벳 대문자를 소문자로 변환하여 반환

a = 'a,b,c,D,E'
print(a.upper()) # A,B,C,D,E
print(a.lower()) # a,b,c,d,e

 

 

- lstrip(제거할 값)

문자열의 왼쪽 끝에서 특정 값을 제거. 매개변수 미입력 시 공백 제거

- rstrip(제거할 값)

문자열의 오른쪽 끝에서 특정 값을 제거. 매개변수 미입력 시 공백 제거

- strip(제거할 값)

문자열의 양쪽 끝에서 특정 값을 제거. 매개변수 미입력 시 공백 제거

 

 

리스트

리스트는 다음과 같이 선언할 수 있다.

 

리스트 명 = [값1, 값2 , ... ]

리스트 명 = [값1, 값2 , ... ]

#빈 리스트
리스트 명 = list()

리스트 안에는 숫자만, 문자열만 혹은 이 둘을 동시에 가질 수도 있다. 리스트 내에 리스트를 이중으로 가질 수도 있다.

 

- 인덱싱 : 문자열과 같은 방식으로 할 수 있으며, 다중 리스트의 경우 여러 번 인덱싱을 하여 원하는 값을 가리킬 수 있다.

- 슬라이싱 : 마찬가지로, 문자열과 동일한 방식으로 할 수 있으며, 반환 값이 리스트로 반환되는 차이만 있다. 

 

- 연산자

'+' : 리스트를 합치는 기능

'*' : (리스트) * (정수) 형태로, * 뒤의 정수만큼 주어진 리스트를 반복하여 새로운 리스트를 만든다. 

 

- 수정

수정하고 싶은 부분을 인덱싱 해서 값을 대입하면 된다.

a = ['a', 'b', 'c', 'd', 'e']
a[1] = 'f'
print(a)

a[1:3] = ['g', 'h'] #['a', 'f', 'c', 'd', 'e']

print(a) #['a', 'g', 'h', 'd', 'e']

 

- 삭제

(1) 해당 자리를 인덱싱 해서 [] 대입

 

(2) del 함수 이용

a = ['a', 'b', 'c', 'd', 'e']
a[1:2] = []
print(a)

#['a', 'c', 'd', 'e']

del a[3]
print(a)
['a', 'c', 'd']

 

- 추가

append 함수를 활용한다.

리스트명.append(추가할 요소)

 

a = ['a', 'b', 'c', 'd', 'e']
a.append('f')
print(a)

#['a', 'b', 'c', 'd', 'e', 'f']

 

- 정렬

 

sort()

리스트 자체를 정렬시켜버리는 함수 (오름차순) 

 

sorted()

새로운 정렬된 리스트를 반환해주는 함수

리스트명.sort() #오름차순

리스트명.sort(reverse=True) #내림차순

sorted_list = sorted(list명, key=lambda, reverse=boolean)

 


a
 = ['c', 'e', 'a' , 'd', 'b']
print(a) #['c', 'e', 'a', 'd', 'b']

a.sort()
print(a) #['a', 'b', 'c', 'd', 'e']
 

 

 

 

* 옵션

reverse : False이면 디폴트로 오름차순 정렬, True로 설정하면 내림차순으로 정렬됨

 
reversed_sorted_list = sorted(a, reverse=True)
print(reversed_sorted_list) #['e', 'd', 'c', 'b', 'a']

a.sort(reverse = True)
print(a) #['e', 'd', 'c', 'b', 'a']

 

key = lambda : key 기준으로 정렬

 

- 나이순(이중 리스트의 1번 index 값)으로 내림차순 정렬

jjangu_family = [['짱구', 5], ['짱아', 1], ['봉미선', 29], ['신영식', 33]]

sorted_jjangu_family = sorted(jjangu_family, reverse=True, key=lambda x : x[1])
print(sorted_jjangu_family)

 

 

 

 

- 이름 순으로 내림차순 정렬 & 이름이 같을 경우 과일 이름 순으로 오름차순 정렬

characters_with_fruits = [['짱구', '사과'],['짱구', '체리'], ['짱아', '복숭아'], ['봉미선', '포도'], ['신영식', '파인애플'], ['철수', '딸기'], ['유리', '바나나'], ['맹구', '자두'], ['훈이', '수박']]

# 정렬 함수
sorted_list = sorted(characters_with_fruits, key=lambda x: (-ord(x[0][0]), x[1]))

# 결과 출력
print(sorted_list)
#[['훈이', '수박'], ['철수', '딸기'], ['짱아', '복숭아'], ['짱구', '사과'], ['짱구', '체리'], ['유리', '바나나'], ['신영식', '파인애플'], ['봉미선', '포도'], ['맹구', '자두']]

 

 

튜플

리스트처럼 여러개의 데이터를 담아두 데에 사용한다. 리스트와는 달리 '대괄호([])'가 아닌 '소괄호(())'를 사용해 선언한다. 또한, 리스트와 달리 튜플은 원소를 변경할 수 없다는 차이가 있다. 

 

- 비어있는 튜플 생성 

blank_tuple = ()
print(blank_tuple)
#()

 

- 튜플 생성 ( 소괄호 생략 가능 )

example_tuple =(1,2,3)
example_tuple2 = 1,2,3

print(example_tuple) #(1,2,3)
print(example_tuple2) #(1,2,3)

 

 

- 하나의 값만 가지는 튜플 생성 : ',' 필수

single_tuple = (1,)
not_tuple = (1)
print(single_tuple, type(single_tuple)) #(1,) <class 'tuple'>
print(not_tuple, type(not_tuple)) #(1,) <class 'tuple'>

 

 

- 이중 튜플

double_tuple = (1, 2, (1,2), (1,2,3))
print(double_tuple) #(1, 2, (1, 2), (1, 2, 3))

 

 

* 튜플의 값을 변경시키려 하면 TypeError가 발생한다.

 

- 인덱싱/슬라이싱 : 위에서 살펴본 문자열, 리스트의 인덱싱, 슬라이싱과 방법이 동일하다. 

- '+' , '*' 연산자 : 리스트의 연산자 사용법과 동일하다.

 

 

 

딕셔너리

키-값을 하나의 쌍으로 대응관계를 가지고 있는 자료형이다. 선언 시 '중괄호({})' 를 사용한다.

dictionary는 key값의 중복이 불가하다. 따라서 기존에 있는 key값을 활용해 값을 추가하면 하나의 값을 제외하고 다른 것들은 무시가 된다. 

또한 dictionary의 key값으로 리스트를 사용할 수 없고, 튜플은 가능하다. 딕셔터리의 key값은 변하지 않는 고유한 값이어야하기 때문이다.

 

- 생성 (value에 문자열, 리스트, 튜플 모두 사용 가능) + key에 문자열도 가능하다.(반드시 정수만 사용해야하는 것 아님)

 
dictionary = {0 : '짱구', 1 : '짱아'}
 

 

- 딕셔너리에 키-값 추가

dictionary = {0 : '짱구', 1 : '짱아'}

dictionary[2] = '철수'
print(dictionary) #{0: '짱구', 1: '짱아', 2: '철수'}

 

- 삭제 : del 활용

dictionary = {0 : '짱구', 1 : '짱아'}

del dictionary[2]
print(dictionary) #{0: '짱구', 1: '짱아'}

 

관련 함수

- keys() : key 리스트 생성

 

- values() : value로 리스트 생성

 

- items() : 원소(키/값 쌍)들의 튜플이 담긴 리스트 생

 

- in : 딕셔너리 내에 key가 존재하는지 조사 

 

dictionary = {0 : '짱구', 1 : '짱아', 2:'철수'}

key_list = dictionary.keys()
value_list = dictionary.values()
item_list = dictionary.items()

print(key_list) #dict_keys([0, 1, 2])
print(value_list) #dict_values(['짱구', '짱아', '철수'])
print(item_list) #dict_items([(0, '짱구'), (1, '짱아'), (2, '철수')])
print(0 in dictionary) #True
print(3 in dictionary) #False

 

 

제어문

주어진 조건이 참(True) 이면 그 다음 동작 명령이 수행된다. 이 때, if문 내의 모든 문장은 들여쓰기를 해줘야한다.( 들여쓰기 안할 시 오류 발생)

if 조건문:
	동작
elif 조건문:
	동작
else:
	동작

 

조건문에 해당하는 True, False는 자료형에 따라 다르게 표시된다. 

자료형 거짓
숫자 0을 제외한 모든 숫자 0
문자열 "abcde" ""
리스트 [1,2,3,4,5] []
튜플 (1,2,3,4,5) ()
딕셔너리 {"a":90} {}

 

- 연산자

비교연산자는 기존 Java와 동일하다. 

 

Boolean을 연결해주는 연산자는 Java에서는 '&&', '||' 을, 부정하는 연산자는 '!'를 사용했다면 파이썬에서는 각각 'and', 'or' 그리고 'not'을 활용한다.

 

- in

in을 활용하면 문자열, 리스트, 튜플과 같은 자료형에 원하는 값이 있는지 True, False의 결과값을 통해 확인할 수 있다.

 

 

반복문

1) while

while 조건문:
    동작1
    동작2
    동작3
#들여쓰기 내의 동작만 while문 내에서 동작

 

 

2) for

for 변수 in (범위 or 리스트 or 튜플 or 문자열)
	동작

 

- break : 반복문을 빠져나오기 위해 활용된다. 

 

- pass : 참과 거짓에 따라 실행할 문장 혹은 동작을 정의할 때 아무런 일도 일어나지 않게 설정하는 것

 

- continue : 주로 반복문에서 많이 사용되며, 조건에 맞지 않으면 반복문의 처음으로 돌아가도록 하는 것

 

- range

range(start, stop) 
	#start이상 stop 미만

range(num) 
	#0이상 num 미만
 
range(start, stop, step)
	#start부터 step씩 더해가며 stop미만까지

 

함수

파이썬에서 함수는 아래와 같은 형식으로 정의하며, 이 때 반환값과 매개변수(입력값)은 필수가 아니다.

def 함수명(매개변수):
	수행문
    수행문
    return 반환값

 

 

- '*' : 입력 인수 하나로 여러개를 표현할 수 있다. 입력값이 여러개가 들어올 때, '*' 기호를 활용하여 여러 인수를 하나의 변수에 넣어 활용할 수 있다. 

 

 

모듈 import 하기

import 모듈

모듈 전체 가져와 모듈.변수 형식으로 모듈 내의 변수 사용

from 모듈 import 이름

모듈 내의 변수를 지정하여 가져와서 사용

from 모듈 import *

모듈 내의 모든 변수 가져와 사용 가능. 단 해당 변수를 첫번째 방법처럼 모듈.변수가 아닌 그냥 변수를 통해 사용 가능해서 해당 변수명을 사용했던 기존 변수가 있다면 그 모듈의 변수로 변경됨.

import 모듈 as 이름

모듈을 가져오면서 이름을 지정하여 사용

 

 

OS 라이브러리

운영체제와 상호작용하는 다양한 기능을 제공하는 라이브러리로, 파일 및 디렉토리 관리, 시스템 명령어 실행, 경로 관련 작업 등의 기능을 파이썬 코드로 처리 가능하다.

import os

#운영체제 이름
print(os.name)  #'posix' 또는 'nx' 출력

#현재 작업 디렉토리
directory = os.getcwd()
print(directory)

#현재 작업 디렉토리 변경 : 프로그램의 작업경로를 다른 위치로 이동
os.chdir('경로')

 

- 파일 및 디렉토리 관리

import os


#디렉토리 생성
os.makedirs('새로운 디렉토리 이름')

#디렉토리 삭제
os.rmdir('삭제할 빈 디렉토리')

#파일 삭제
os.remove('삭제할 파일.확장자')

#파일 및 디렉토리 이름 변경
os.rename('기존 이름.확장자', '변경할 이름.확장자')

 

 

- 파일 및 디렉토리 정보

import os

#파일의 속성(크기, 수정시간 등)
file_info = os.stat('파일명.확장자')
print(file_info.st_size) #파일 크기

#디렉토리 내의 파일 및 서브 디렉토리 리스트
print(os.listdir('.')

 

 

- 실습 : 바탕화면에 있는 파일의 이름을 바꿔보기. 

import os
 
path = 'C:/Users/AAA/Desktop'
lst = os.listdir(path)
print(lst)

os.rename(path+'/푸바오.png', path+'/푸바오사진.png')
lst = os.listdir(path)
print(lst)

 

OS 라이브러리 내 함수들은 여기까지.. 그 외에도 다양한 기능이 많은데 필요할 때 찾아보고 쓰는 것도 충분할 듯 하다. 이런 기능들이 있다는 것만 알아두자.. ! (지금 당장 모든 함수들을 외우는게 파이썬 실력 향상에 도움이 될 것 같진 않다..^^) 

 

NumPy 라이브러리

수학, 과학 연산을 하기 위한 파이썬의 필수적이고 기보넞ㄱ인 패키지이다.

numpy에서는 arrary(행렬이라고 생각하면 됨)라는 단위로 데이터를 관리하고 연산한다. numpy 모듈을 사용하기 위해서는 설치 후에 import를 해야한다. 또한 편리한 사용을 위해 as를 활용해 np라고 이름을 붙여 많이 사용한다고 한다.

 

#numpy 설치
pip install numpy

 

 

- Array

import numpy as np

#Array
a = np.array([1,2])
print(a)

#array 생성 및 초기화

a = np.zeros((3,2)) #0으로 구성된 3x2 행렬
b = np.ones((2,1)) #1로 구성된 2x1 행렬

print(a)
print(b)
#출력 결과
#[[0. 0.]
#  [0. 0.]
#  [0. 0.]]
# [[1.]
#  [1.]]

 

 

- 연산

#array단위 연산
a = np.array([1.,2.,3.])
b = np.array([4.,3.,2.])

print(np.add(a,b))
print(np.multiply(a,b))

#출력결과
# [5. 5. 5.]
# [4. 6. 6.]

 

- 난수 생성

#난수 생성
a = np.random.rand(1, 3)
b = np.random.randn(2,4)

print(a)
print(b)

#출력
# [[0.21536927 0.72916276 0.35831412]]
# [[-0.95012811 -0.15630286  1.71040523  0.40260388]
#  [ 0.4405598  -1.27543091  0.7738229  -0.25464529]]
...

rand 함수는 0에서 1 범위의 균일한 분포를 만들며, randn함수는 표준정규분포를 갖는 숫자를 만든다.

 

- 상수 생성


pi = np.pi
e = np.e
 
print(pi)
print(e)

#출력
# 3.141592653589793
# 2.718281828459045
 

 

 

- arange 함수 : 지정된 범위에서 일정한 간격으로 값을 생성하는 함수

import numpy as np

np.arange([start, ]stop, [step, ]dtype=None)

start : (선택) 시작값, 기본값은 0

end : 끝값

step : (선택) 증가 간격, 기본값 1

dtype : 선택적으로 데이터 유형 지정

 

 
#0.0에서 5.0까지 0.1씩 증가하는 값 화면에 출력하기
for i in np.arange(0, 5, 0.1):
    print(i)

 

 

클래스

클래스란 일종의 설계도로, 하나의 타입을 정의하는 방법이다. 클래스에 관련있는 데이터와 함수들을 한 데 모아 정의할 수 있으며 이 클래스로 만들어진 결과물을 객체라고 한다.

 

클래스 정의

class 클래스명:
    변수 = 값
    def 메서드명(매개변수):
    	함수내용

 

- 예시

class Singer:
	
    album = 10
    fan = 100000
    ability = 10000
    
    def sing(self):
    	return "song"

 

클래스 생성

변수 = 클래스명()

변수.클래스의 함수명()

 

- 예시

jenny = Singer()

jenny.sing()

 

 

self

self란 그 클래스의 객체를 가리킨다. 하나의 클래스로 생성된 각각의 객체는 모두 같은 메서드를 가지기 때문에 객체들을 구별하기 위해 사용한 것이다. 즉, 클래스 내에서 메서드를 정의할 때에는 항상 self라는 인자를 써줘야한다고 생각하면 된다.

- 예시


class Singer:
   
    album = 10
    fan = 100000
    ability = 10000
   
    def sing(self):
        return "song"


    def practice(self):
        self.ability += 10
 

 

상속

어떤 클래스가 다른 클래스의 성질을 물려받는 것을 말한다. 상속을 활용하면 처음부터 모든 클래스를 만들지 않고, 핵심적인 성질을 가진 기존 클래스를 상속받아 처음부터 다 만들지 않고 클래스를 만들게 된다.

 

- 예시

 

기존 클래스

 
class Person:
    eyes = 2
    nose = 1
    mouth = 1
    ears = 2
    arms = 2
    legs = 2

    def eat(self):
        print('식사')

    def sleep(self):
        print('쿨쿨')

    def talk(self):
        print('쫑알쫑알')
 

 

 

기존 클래스를 상속받은 클래스

 
class Student(Person):     # Person 클래스를 상속받음
    def study(self):
        print('화이팅')
 

 

사람과 학생 클래스에 모두 새로운 요소를 추가하고 싶다면, 사람 클래스만 수정하여 학생 클래스까지 반영되도록 할 수 있다. 

 

 

- 참고자료

https://wikidocs.net/64

https://dojang.io/mod/page/view.php?id=2360

https://python101.tistory.com/entry/Python-reduce-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%EB%B2%95

https://hyunhp.tistory.com/308#google_vignette

https://securityspecialist.tistory.com/60

'Learning-log > Python' 카테고리의 다른 글

[Python] FastAPI  (0) 2023.06.28