python 기초 문법

ro_ot ㅣ 2020. 10. 6. 17:27

더보기

Lambda(익명 함수)

try ~ expect, finally(예외처리)

 

 

if,  elif, else (조건문, conditional statements)

조건문이란? 주어진 조건식의 결과에 따라 다른 명령을 수행하도록 프로그램의 흐름을 제어하는 명령문

 

if 문

if 조건:
    참인경우 실행할 명령 1
    참인경우 실행할 명령 2
    참인경우 실행할 명령 3
    ....
다음 명령 
  • if문의 조건이 참인 경우 명령을 실행합니다.
  • if조건문에서 "조건문"이란 참과 거짓을 판단하는 문장을 말합니다.
  • if 조건문 뒤에는 반드시 콜론( ' : ' ) 이 붙어야 합니다.
  • 들여 쓰기가 끝나면 조건문을 종료합니다.
  • 위의 예제에서 조건이 거짓이면 아무런 일도 하지 않습니다.(조건이 거짓일 때는 'not', '!='이라는 연산자를 사용합니다.)

 

a = 10
b = 10
c = 10

if a == 10:
	print('a는 10입니다.')

if a == 9:
	print('9가 아닙니다') # 조건이 거짓이므로 아무런 일도 일어나지 않습니다.

if not b == 9:
	print('b는 9가 아니고', b ,'입니다.')
    
if c != 8:
	print('c는 8가 아니고', c ,'입니다.')

 

if - else 문

파이썬에서는 조건 분기를 표현하기 위해 if-else 문을 사용합니다.

if 조건식:
    조건식의 결과가 참(True)일 때만 실행되는 명령문
else:
    조건식의 결과가 거짓(False)일 때만 실행되는 명령문
  • 조건식의 결과가 참(True)인 경우 if 문 다음의 명령문이 실행되며, else 문 다음의 명령문들은 실행되지 않습니다.
  • 조건식의 결과가 거짓(False)인 경우 else문 다음의 명령문들이 실행됩니다.
  • if 및 else 키워드의 맨 끝에도 콜론 ( ' : ' )을 삽입해야 합니다.
a = 'sweet'

if a == 'sweet':
	print('삼키다')
else:
	print('뱉는다')

 

if - elif - else 문

if 조건식1:
    조건식1의 결과가 참(True)일 때만 실행되는 명령문
elif 조건식2:
    조건식2의 결과가 참(True)일 때만 실행되는 명령문
else:
    조건식1, 2의 결과가 모두 거짓(False)일 때만 실행되는 명령문
  • 여러 개의 조건이 있을 경우 사용합니다.
  • 모든 명령문은 중첩이 가능합니다.
season = "winter"  

if season == "spring":
    print("봄이 왔네요!")

elif season == "summer":
    print("여름에는 더워요~")

elif season == "fall":
    print("가을은 독서의 계절!")

elif season == "winter":
    print("겨울에는 눈이 와요~")

 

while, for (반복문, iteration statements)

어떤 조건을 만족시킬 때까지 특정 행동을 지속적으로 반복해서 수행해야 한다는 의미이다.

프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어해 주는 명령문

 

while 문

while 조건식:
    조건식의 결과가 참(True)인 동안 반복적으로 실행되는 명령문
  • while문에 진입하기 위해서는 조건식의 결과가 참(True)이어야 합니다.
  • 들여 쓰기가 끝나면 반복문을 종료합니다.
  • 조건이 거짓인 경우 아무런 일도 하지 않습니다.
  • 반복문 내에서 'break' 명령을 만나면 현재의 반복문을 탈출합니다.
  • 반복문 내에서 'continue' 명령을 만나면 현재의 반복문의 처음으로 돌아가서 조건을 비교합니다.
i = 1

while i <= 10:
    print('{0}번째 계단을 밟고 올라가고 있습니다.'.format(i) )
    i+=1
print('정상에 올라섰습니다.')

 

break 문

  • while문의 동작에서 가장 중요한 것이 바로 조건식의 결과를 변경하는 명령문입니다.
  • while문은 조건문이 참인 동안 계속해서 반복적으로 명령문을 수행할 것입니다. 이때 강제로 멈추게 하는 것이 'break' 문입니다.

다음은 커피가 떨어졌다면 판매를 중단하고 "판매 중지" 메시지를 사용자에게 보여주는 코드입니다.

coffee = 10
money = 300

while money:
    print("잠시만 기다려주세요, 커피 추출중입니다.")
    coffee = coffee -1
    print("남은 커피양은 {0}개 입니다.".format(coffee))
    if coffee == 0:
        print("커피가 다 떨어져서 판매를 중지합니다.")
        break

위에 코드를 보면 coffee == 0: 의 조건이 참이 되므로 if문 다음 문장이 실행되고 'break'문이 호출되어 'while'문을 빠져나갑니다.

 

continue문

  • while문 안의 문장을 수행하다 조건이 거짓(False)일 때 while문을 빠져나가지 않고 맨 처음(조건문)으로 돌아가는 것입니다.
  • 해당 키워드 바로 다음 명령문부터 해당 반복문의 마지막 명령문 까지를 모두 건너뛰고 바로 다음 반복을 실행하는 것입니다.

다음은 1 ~ 10까지의 숫자 중 짝수만 출력하는 코드입니다.

a = 0

while a < 10:
    a = a+1
    if (a%2) == 1:
        continue
    print(a)

위 코드에서 보면 a가 1 만큼씩 증가하다 if(조건문)이 참이 되는 경우 'continue' 문장을 수행하도록 합니다.

즉, if문을 건너뛰고 while문의 처음으로(조건문 : a < 10 ) 돌아가게 하는 명령어입니다.

 

for문

for 변수 in 문자열(or 튜플 or 리스트):
    반복적으로 실행하고자 하는 명령문
  • 문자열이나 튜플, 리스트의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 실행하고자 하는 명령문 등이 수행됩니다.
  • in 키워드가 가리키는 첫 번째 요소를 꺼내 변수에 대입하고, 이런 대입된 변수는 for문 내부의 명령문에서 사용됩니다.
  • for문 내부의 모든 명령문을 수행하고 나면 다시 해당 요소로 돌아가 다음 요소가 있는지를 검사하고 존재한다면 변수에 대입하고 루프를 실행하며, 존재하지 않는다면 for문은 종료됩니다.
string = "python"
tu = ('1,2,3')
li = ["가","나","다","라"]

for c in string:
    print(c)

for t in tu:
    print(t)

for l in li:
    print(l)

위에 코드를 실행해보면 하나씩 출력되는 것을 확인할 수 있습니다.

 

range( ) 함수

  • 전달된 인수에 따라 연속된 정수들을 반환하는 함수입니다.
  • range 괄호 ( ' ( ) ' ) 안에 인자를 주면 그 범위 안의 정수들을 만들어 줍니다.
  • 시작 정수와 step는 생략이 가능합니다.
  • 인수가 하나만 전달될 경우 0부터 (마지막 정수-1)까지 1씩 증가하는 연속된 정수들을 반환합니다.
1. range(마지막정수)
2. range(시작정수, 마지막정수)
3. range(시작정수, 마지막정수, step)
for i in range(5):
	print(i)
    
for i in range(0,5):
	print(i)
    
for i in range(0,5,2):
	print(i)

enumerate( ) 함수

  • 반복문 사용 시 몇 번째 반복문인지 확인이 필요할 때 사용합니다.
  • 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환합니다.
t = [1,3,5,7,43,23]
for p in enumerate(t):
    print(p)
  • tuple형태 반환을 이용하여 아래처럼 활용할 수 있습니다.
t = [1,3,5,7,43,23]
for i, v in enumerate(t):
    print('index : {}, value : {}'.format(i, v))

 

Try, Except, else, Finally문(예외 처리, Exception)

프로그램을 만들다 보면 많은 오류를 만나게 되는데 이러한 오류를 무시하고 싶을 때 Try, except를 사용해서 예외 적으로 오류를 처리할 수 있게 해줍니다.

 

다음은 오류 처리를 위한 try, except문의 기본 구조입니다.

try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...

 

  • try 블록 수행 중 오류가 발생하면 except 블록이 수행되지만 오류가 발생하지 않는다면 except 블록은 수행되지 않습니다.
  • except 중 발생오류 및 오류 메시지 변수는 생략이 가능합니다.
  •  

다음은 try, except, else, finally를 사용한 코드입니다

  • 첫번째 루프 : 에러가 발생하지 않으므로 else절과 finally절이 실행되었습니다.
  • 두번째 루프 : 에러가 발생했으므로 except절과 finally절이 실행되었습니다.
for i in ["11","number"]:
    try:
        int(i)
    except ValueError as m:
        print(m)
    else:
        print("No Error!")
    finally:
        print("Finally Code")
    print("\n")

 

  • try : 정상적으로 실행할 프로그램 코드 작성
  • except : 'try'에서 실행한 코드에 예외가 발생했을 경우 실행하
  • else : 예외처리할 오류가 없을 때 실행되는 코드
  • finally : 오류 발생여부 상관 없이 마지막에 실행되는 코드
  • raise : 오류를 일부러 발생시키기

※오류 회피

  • 단순히 오류를 회피하고 다음 실행코드로 넘어가고 싶을 때는 pass를 활용하면 됩니다.
try:
    int("number")
except ValueError:
    pass

 

 

함수(function)

  • 프로그래밍을 하다 보면 같은 내용을 반복해서 작성할 때가 종종 있습니다. 이때 필요한 것이 함수입니다.
  • 자신이 만든 프로그램을 함수 화하면 프로그램의 가독성이 좋아지고, 오류가 발생한 부분도 쉽게 파악할 수 있습니다.
  • 하나의 특정 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합을 함수(function)라고 부릅니다.
  • 함수를 만들 때는 def 예약어를 사용하며, 내용은 들여쓰기합니다.(들여쓰기가 종료되면 함수 정의가 종료됩니다.)
  • 사용자에 임의로 변수명을 만들 수 있습니다.
  • 매개 변수에 초기값 지정이 가능합니다.
def 함수명 (매개변수1, ...):
	실행할 코드1
    실행할 코드2

함수명은 함수를 호출할 때 사용하기 위한 이름이며, 매개변수(parameter)는 함수 호출 시 전달 되는 인수의 값을 함수 내부에서 사용 가능하도록 저장할 변수의 이름입니다.

 

아래 코드와 같은 방식으로 함수를 작성 및 호출합니다.

def hello(): # 함수의 선언
    print("- 함수 시작 -")
    print("안녕하세요!")
    print("- 함수 끝 -")

hello() # 함수의 호출

def sum(a,b):
	print(a + b)
    
sum(1, 2)
sum(3, 4)
더보기

리턴 값(return)

  • 리턴값이란 함수가 어떠한 기능을 수행하고 결과를 호출한 곳으로 돌려주는 값을 말합니다.
  • 함수의 결과값은 하나입니다.
  • return 명령어를 만나면 함수가 종료 됩니다.
  • 값을 되돌려 줄때 return 명령어를 사용합니다.

매개변수(parameter)와 인수(arguments) 비교

  • 매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미합니다.
def add(a, b): # a, b는 매개변수
	return a+b
    
print(add(3,4)) # 3, 4는 인수

 

람다 함수(익명함수)

  • 람다함수를 통해 이름이 없는 함수를 만들 수 있습니다.
  • 람다함수의 장점은 코드의 간결함과 메모리의 절약이라고 할 수 있습니다.

다음은 람다 함수의 기본 구조 입니다.

lambda 인자1, 인자2, ... : 표현식
  • 람다함수는 보통 한 줄로 정의 됩니다.
  • 람다함수는 결과부분된 부분을 return키워드 없이 자동으로 return 해줍니다.

익명함수라는 이름처럼 lambda 함수는 함수의 이름을 지정하지 않습니다.

# 인자로 받은 숫자에 +1을 해주는 함수
(lambda x : x+1)(3)  # 4

위 코드는 함수에 이름이 없고, 저장된 변수가 없기 때문에 다시 사용할 수는 없습니다.

다만, 람다함수도 객체이기 때문에 정의와 동시에 변수에 담을 수 있습니다.

func = lambda x : x + 1
func(4)		# 5

 

 

 

 

클래스(Class)

  • 프로그램의 청사진이라고 볼 수 있습니다.
  • 틀 또는 공장과 같은 성격을 가지고 있습니다.
  • 함수와 변수를 모아놓은 것으로 변수는 '멤버 변수', 함수는 '메서드'라고 칭합니다.
  • 클래스명은 CapWords 방식으로 명명합니다.
더보기

Capwords 방식 : 단어를 대문자로 시작

 

클래스를 생성하는 방법은 아래와 같습니다.

  class 클래스 이름:
    변수1
    변수2
    .....필요한만큼 변수 제공...
    
    def 메소드1(인수):
      ...메소드 처리...
    def 메소드2(인수):
      ...메소드 처리...
   
      ... 필요한만큼 메소드 제공...

다음은 2대의 계산기의 기능을 구현한 일반적인 코드입니다.

result1 = 0
result2 = 0

def add1(num):
    global result1
    result1 += num
    return result1

def add2(num):
    global result2
    result2 += num
    return result2

print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))

 

계산기처럼 결괏값을 유지하기 위해 result 전역 변수를 사용하였고, 함수를 각각 따로 만들어야 합니다.

이처럼 구현이 가능하지만 계산기가 더 많아지면 구현하기 어려워질 것입니다.

 

클래스를 사용한다면 아래 코드와 같이 쉽게 해결이 가능합니다.

class Calculator:
	def __init__(self):
    self.result = 0
    
    def add(self, num):
    self.result += num
    return self.result
    
cal1 = Calculator()
cal2 = Calculator()

print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
  • Calculator 클래스로 만든 별개의 계산기 cal1, cal2(파이썬에서는 이것을 객체라고 부릅니다)가 각각의 역할을 수행합니다.
  • 다른 계산기의 결괏값과 상관없이 독립적인 값을 유지합니다.

 

클래스와 객체

 

과자 틀 및 과자

위 그림을 비유하여 클래스와 객체를 설명하면 다음과 같습니다.

  • 과자 틀 → 클래스 (class)
  • 과자 틀에 의해서 만들어진 과자 → 객체 (object)

클래스(Class)란 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면이고(과자 틀), 객체(object)란 클래스로 만든 피조물(과자 틀을 사용해 만든 과자)을 뜻합니다.

 

클래스로 만든 객체는 각각의 객체마다 고유한 성격을 가집니다.

더보기

객체와 인스턴스의 차이

클래스로 만든 객체를 인스턴스라 합니다.

만약, a = Cookie( )가 있다고 가정한다면 다음과 같습니다.

  • a 는 객체
  • a 객체는 Cookie의 인스턴스

즉, 인스턴스는 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용합니다.

 

클래스 멤버

  • 클래스는 테이터를 표현하는 속성(attribute)과 행위를 표현하는 메서드(method)를 포함하는 논리적인 컨테이너입니다.
  • 세부적으로 메서드(method), 프로퍼티(property), 클래스 변수(class variable), 인스턴스 변수(instance variable), 초기자(initializer), 소멸자(destructor) 등 다양한 종류의 멤버들로 구분할 수 있습니다.

메서드

  • 클래스의 행위를 표현하는 것으로 클래스 내의 함수로 볼 수 있습니다.
  • 파이썬에서 메서드는 다음과 같이 볼 수 있습니다.
    1. 인스턴스 메서드(instance method) - 인스턴스 변수에 액세스 할 수 있도록 메서드의 첫 번째 파라미터에 항상 객체 자신을 의미하는 "self"라는 파라미터를 가집니다.
    2. 클래스 메서드(class method)
    3. 정적 메서드(static method)
class Rectangle:
    count = 0  # 클래스 변수
 
    # 초기자(initializer)
    def __init__(self, width, height):
        # self.* : 인스턴스변수
        self.width = width
        self.height = height
        Rectangle.count += 1
 
    # 메서드
    def calcArea(self):
        area = self.width * self.height
        return area

 

클래스 변수

  • 메서드 밖에 존재하는 변수를 클래스 변수 합니다.
  • 클래스를 사용하는 모두에게 공용으로 사용되는 변수입니다.

 

인스턴스 변수

  • 하나의 클래스로부터 여러 객체 인스턴스를 생성해서 사용할 수 있습니다.
  • 각 객체 인스턴스마다 별도로 존재합니다.
  • 클래스 정의에서 메서드 안에 사용되면서 "self. 변수명"처럼 사용되는 변수를 인스턴스 변수(instance variable)라 합니다.

 

Initializer(초기자)

  • 클래스로부터 새 객체를 생성할 때마다 실행되는 특별한 메서드로 __init__()이라는 메서드가 있습니다.
  • 클래스로부터 객체를 만들 때, 인스턴스 변수를 초기화하거나 객체의 초기 상태를 만들기 위한 문장들을 실행하는 곳입니다.

아래의 예제를 보면 width와 height라는 입력 파라미터들을 각각 self.width와 self.height라는 인스턴스 변수에 할당하여 객체 내에서 계속 사용할 수 있도록 준비하고 있습니다.

def __init__(self, width, height):
    self.width = width
    self.height = height
 
    # private 변수 __area
    self.__area = width * height
 
# private 메서드
def __internalRun(self):
    pass

 

 

정적 메서드

  • 인스턴스 메서드가 객체의 인스턴스 필드를 self를 통해 접근할 수 있는 반면, 정적 메서드는 이러한 self 파라미터를 갖지 않고 인스턴스 변수에 접근할 수 없습니다.
  • 객체 필드와 독립적이지만 로직상 클래스 내에 포함되는 메서드에 사용됩니다.
  • 메서드 앞에 @staticmethod라는 Decorator를 표시하여 해당 메서드가 정적 메서드임을 표시합니다.

 

클래스 메서드

  • 메서드 앞에 @classmethod라는 Decorator를 표시하여 해당 메서드가 클래스 메서드임을 표시합니다.
  • 객체 인스턴스를 의미하는 self 대신 cls라는 클래스를 의미하는 파라미터를 전달받습니다.
  • 전달받은 cls파라미터를 통해 클래스 변수 등을 액세스 할 수 있습니다.

정적 메서드와 클래스 메서드

  • 일반적으로 인스턴스 데이터를 액세스 할 필요가 없는 경우 사용합니다.
  • 클래스 변수를 액세스 할 필요가 있을 때 클래스 메서드를 사용합니다.
  • 클래스 변수를 액세스 할 필요가 없을 때 정적 메서드를 사용합니다.
class Rectangle:
    count = 0  # 클래스 변수
 
    def __init__(self, width, height):
        self.width = width
        self.height = height
        Rectangle.count += 1
 
    # 인스턴스 메서드
    def calcArea(self):
        area = self.width * self.height
        return area
 
    # 정적 메서드
    @staticmethod
    def isSquare(rectWidth, rectHeight):
        return rectWidth == rectHeight   
 
    # 클래스 메서드
    @classmethod
    def printCount(cls):
        print(cls.count)   
 
 
# 테스트
square = Rectangle.isSquare(5, 5)        
print(square)   # True        
 
rect1 = Rectangle(5, 5)
rect2 = Rectangle(2, 5)
rect1.printCount()  # 2 

 

클래스 상속

  • 클래스를 상속받기 위해서는 파생 클래스(자식 클래스)에서 클래스명 뒤에 베이스 클래스(부모 클래스) 이름을 괄호와 함께 넣어 주면 됩니다.
class Animal:
    def __init__(self, name):
        self.name = name
    def move(self):
        print("move")
    def speak(self):
        pass
 
class Dog (Animal):
    def speak(self):
        print("bark")
 
class Duck (Animal):
    def speak(self):
        print("quack")

 

  • 파생 클래스는 베이스 클래스의 멤버들을 호출하거나 사용할 수 있으며, 물론 파생 클래스 자신의 멤버들을 사용할 수 있다.
dog = Dog("doggy") # 부모클래스의 생성자
n = dog.name # 부모클래스의 인스턴스변수
dog.move()   # 부모클래스의 메서드
dog.speak()  # 파생클래스의 멤버

 

 


자료형

1. 리스트 자료형(List)

  • 여러 요소들을 갖는 집합으로 새로운 요소를 추가하거나 갱신, 삭제하는 일이 가능합니다.
  • 리스트 자료형은 아래와 같은 구조를 가지게 됩니다.
리스트명 = [요소1, 요소2, 요소3, ...]

이와 같은 구조를 통해 아래와 같은 리스트들을 만들 수 있습니다.

a = []
b = [1, 2, 3]
c = ['Life', 'is', 'too', 'short']
d = [1, 2, 'Life', 'is']
e = [1, 2, ['Life', 'is']]

리스트는 a처럼 아무것도 포함하지 않아 비어 있는 리스트 ( '[ ]' )일 수 도 있고 숫자나 문자열등을 요솟값으로 가질 수 도 있습니다.

즉, 리스트 안에는 어떠한 자료형도 포함할 수 있습니다.

 

2. 튜플 자료형(Tuple)

튜플(tuple)은 몇 가지 점을 제외하곤 리스트와 거의 비슷합니다.

  • 리스트는 [ ]으로 둘러싸지만 튜플은 ( )를 사용합니다..
  • 리스트는 그 값의 생성, 삭제, 수정이 가능하지만 튜플은 그 값을 바꿀 수 없습니다.
  • 튜플은 t2처람 하나의 요소만 가질 때는 요소 뒤에 콤마( ' , ' )를 붙여야 합니다.
t1 = ()
t2 = (1,)
t3 = (1, 2, 3)
t4 = 1, 2, 3
t5 = ('a', 'b', ('ab', 'cd'))

 

3. 딕셔너리 자료형(Dictionary)

  • Key와 Value를 한 쌍으로 갖는 자료형입니다.
  • Key로 신속하게 Value를 찾아내는 해시테이블 구조를 갖습니다.
  • 딕셔너리 자료형은 아애와 같은 구조를 가지게 됩니다.
{Key1:Value1, Key2:Value2, Key3:Value3, ...}
  • Key와 Value의 쌍 여러 개가 { }로 둘러싸여 있습니다.
  • 각각의 요소는 Key : Value 형태로 이루어져 있고 쉼표(,)로 구분되어 있습니다.
dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

※ Key에는 변하지 않는 값을 사용하고, Value에는 변하는 값과 변하지 않는 값 모두 사용할 수 있습니다.

 

4. 집합 자료형(Set)

  • 중복이 없는 요소들로 구성된 자료형입니다.
  • 내부적으로 요소들을 순서대로 저장하지 않기 때문에, 순서에 의존하는 기능 사용이 불가능합니다.
  • 아래 코드 처럼 중복된 값은 한번만 가지고 있게 됩니다.
# set 정의
myset = { 1, 1, 3, 5, 5 }
print(myset)    # 출력: {1, 3, 5}
 
# 리스트를 set으로 변환
mylist = ["A", "A", "B", "B", "B"]
s = set(mylist)
print(s)        # 출력: {'A', 'B'}

※ 비어 있는 집합 자료형은 s = set( )로 만들 수 있습니다.

'python' 카테고리의 다른 글

자주 사용하는 keyword  (0) 2020.10.06
Python 기초  (0) 2020.10.05
OOP(객체 지향 프로그래밍)  (0) 2020.10.05
Python 변수  (0) 2020.09.29
python 가상환경(pyenv)  (0) 2020.06.12