본문 바로가기

파이썬 공부

9.블록(Block) / 비트코인 블록(?)

내용 추가 (3.11.2020)

출처: https://i.ytimg.com/vi/whRlTZ1sSns/maxresdefault.jpg

사진 한 장에 정리가 너무 잘되었다.


블록이란?

1. 함께 실행되는 하나의 코드 덩어리

2. 들여 쓰기로 블록 구분

3. 들여 쓰기가 어긋나면 오류 발생

4. 블록 안에 다른 블록이 들어갈 수 있다.

5. 내부의 블록은 외부의 블록에 종속적이다.

6. 파이썬 코드 전체를 하나의 블록이라 볼 수 있다.


if를 쓸때 사용했던 콜론 기호와 들여쓰기에 대해 알아보자.

block.py로 파일을 하나 생성하자.

if True:
	print('블럭에 속한 코드입니다.')

결과는?

결과.

파이썬 코드에서 ':' 다음에 들여쓴 코드는 블럭 이라고 부른다.

같은 실행 흐름에서 순서대로 실행되는 코드 덩어리라고 할 수 있다.

우리가 실행해본 코드는 하나의 if 조건에 따라서 실행 여부가 결정되는 코드 덩어리라고 볼 수 있다.

앞으로 우리가 파이썬 코드를 짤때에는 더 많은 블럭들을 보게 될 것이다.


그럼 블럭의 문법적인 특징과 블럭이 실행에는 어떤 의미를 가지는지 알아보도록 하자.


블럭의 문법적인 특징과 실행에서 의미

블럭은 반드시 콜론 문자(:) 뒤에서 들여쓰기(4칸)와 함께 나타난다.

들여 쓰기는 실제로 몇칸을 띄우던지 자유이지만, 4칸을 띄는것을 권장하고 있다.

파이썬 코드를 지원하는 편집기는 Tab키를 누르면 자동으로 들여쓰는것이 일반적.


블럭은 여러줄로 쓸 수 있다.

여러줄로 쓸 경우 모든 줄의 들여쓰기가 일치해야한다. 

만약 들여쓰기가 어긋날 경우 들여쓰기 오류(Indentation Error)가 발생하게 된다.

정상인 경우
비정상의 경우

비정상의 경우 들여쓰기 오류가 나타난 것을 알 수 있다.

덜 들여써도, 더 들여써도 오류가 난다는 점을 알자!


https://tinyurl.com/r2h6srj
 

[Python] 들여쓰기 오류 (Indentation Error)

(Update) 아직도 파이썬에 완전히 익숙해지지 못했다. 계속 사소한 부분에서 오류를 내고 그 오류...

blog.naver.com

출처: https://tinyurl.com/r2h6srj

네이버 블로그에 있던 사진이다. 블로그 필자 보기에 문제 없는 코드지만, 들여쓰기 오류가 일어났다고 한다.

더보기

들여쓰기를 할 때 탭(tab)과 스페이스(space)를 섞어서 사용한 것.

같은 간격의 들여쓰기를 유지한다고 하더라도 그 중에 탭 키로 들여쓴 간격과 스페이스 바 키로 들여쓴 간격이 코드 안에서 섞여 있을 경우 위와 같은 에러 메시지를 출력한다.

그러니까 들여쓰기를 할 때 처음에 탭 간격을 이용했으면 들여쓰기를 하는 부분 끝까지 탭을 이용해야하고, 처음에 스페이스 간격을 이용했으면 끝까지 스페이스 간격만 이용해야한다는 이야기다

[출처] [Python] 들여쓰기 오류 (Indentation Error)|작성자 산들아이

나는 아직 겪어본적은 없지만, 참조해서 나쁠 것은 없다.

https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces
 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

번역한거다.

링크 내용을 구글로 변역한것이다. 탭과 공백 중 하나만 쓰는 것이 좋은듯 하다.

나는 파이썬 3에서 탭만 쓴다.


블럭을 끝마치고 싶다면, 블럭이 시작할때 들여쓴 만큼 내어써줘야 한다.

한번이라도 내어쓴 블럭은 끝난 블럭이다.


블럭 안에는 다른 블럭이 들어갈 수 있다!

코드를 참조해보자.

들여쓰기 된 상태에서 들어간 블럭은 원래 블럭 안에 포함 된 것이다.

동작 원리는 블럭 안과 밖이 다 똑같다.

액자식 구성(?) 블럭 안의 블럭

바깥 if와 마찬가지로 조건이 맞으면 실행되고 맞지 않으면 실행이 안된다.

안쪽 if중 '블록False'는 실행이 안되고 뒤의 '블록True'는 실행되는 것을 확인할 수 있다.

 

주의할점, 바깥 블럭의 코드는 첫줄을 프린트하고 끝나는 것이 아닌,

처음으로 들여쓰기가 끝나는 지점 print('블록end')에서 끝나는 것이다.

물론 안쪽 블럭 2개를 포함하고 있다.

코드를 실행하고 나면, 블럭의 끝코드바깥에 있는 블럭 끝 코드는 나란히 출력된다.

하지만, 논리적으로는 서로 다른 위치에 들어있다.

 

만약 첫 시작을 if True 가 아닌, False로 하면 어떨까?

False로 바꾼 경우

결과는 보다시피, 안쪽 블럭의 내용이 모두 무시되었다.

대신 바깥 코드만 실행되었다.

 

좀더 생각해보자.

코드가 조금 더 길어졌다.

이번엔 블럭이 하나 더 붙었다.

위의 True로 시작하는 블럭, 아래 False로 시작하는 블럭.

결과만 말하자면, 아래 False로 시작하는 블럭은 안의 내용이 모두 무시되었다.

대신 True로 시작하는 조건이 맞는 코드는 출력이 되어서, 조건에 맞는 내용만 전체적으로 출력 되었다.

(False는 출력되지 않았다.)


궁금한점은, 왜 False로 시작하면 안쪽 코드의 True 코드는 조건이 맞는데도 실행이 왜 안되는 건가?

 

조건이 맞지 않는 전체 블럭은 실행이 되지 않기 때문이다. 따라서 그 아래 딸려있는 코드는 자연히 실행되지 않는다.


또 궁금한점, True, False를 사용하고 if를 사용했는데 조건이 없고 if만 있는데도 실행되는 이유는 무엇일까?

 

if 문법은 true일 경우에만 실행된다. 위 코드의 경우에는 true로 값을 강제 지정하였기때문에 실행이 가능한 것이다.

즉 위 경우 중, if False로 선언하고 print문을 사용시 False로 값이 강제 지정되기 때문에 코드가 역시 실행되지 않는 것.


알아야할 점은, 코드의 맨 바깥 처음 블럭 만들때, 그 안의 블럭을 만들때의 문법 차이는 없다는 것이다. (동일)

 

코드 참조.

if True:
    print('블럭에 속한 코드입니다.start')

    if False:
        print('블록false')
            
    if True: 
        print('블록true')
        
        if True:
            print('안쪽 블록 1차')
            
            if True:
                print('안쪽 블록 2차')
                
                if False:
                    print('안쪽 블록 3차 조건 불충족')
    
    print('블록end')
    
if False:
    print('블럭에 속한 코드입니다.start')

    if False:
        print('블록false')
            
    if True: 
        print('블족록true')
print('end Block')

결과 사진.

감이 잡힌다. 앞서말했듯, 블럭안의 블럭이던, 그 블럭 안의 블럭이던 바깥 블럭과의 문법 차이는 없는듯 하다.

 

파이썬에서는 똑같은 문법을 이용해, 블럭 안의 블럭을 여러개 만들 수 있다.

좀 다르게 생각하면, 파이썬 코드 파일 전체가 제일 바깥 블럭, 하나의 큰 블럭이라고도 생각할 수 있겠다.


블럭에 대해 배웠다.

블럭은 함께 실행되는 하나의 코드 덩어리이다.

 

if조건에서는 조건에 따라 블럭 전체가 실행될수도 전체가 실행 안될 수도 있다.

블럭 안에는 다른 블럭이 들어갈 수도 있다.

안의 블럭은 밖의 블럭에 종속적이고, 밖의 블럭이 실행되어야만 실행될 수 있다.

 

블럭 안에 블럭이 있어도 문법과 모습은 바뀌지 않는다.

들여쓰기만 달라질 뿐이다.


번외. 비트코인에서 블럭(?)

출처: https://tinyurl.com/vfsbabk

1. 마름모 2. 원속의 마름모 3. 마름모속의 원속의 마름모 ---->?

출처: https://tinyurl.com/vfsbabk

파이썬의 블록과 비슷한건가 싶다.

왜냐면 비트코인의 블럭이 N, N+1, N+2 ---->? 이기 때문이다.

 

더보기

첫번째 블록(N)과 그 다음 블록 (N+1), 그리로 그 다음(N+2) 모두 

"이전 블록의 데이터를 다음블록에 영향을 준다 혹은 연관관계가 있다"라는 점과

그 영향이나 연관관계를 주는 그 무언가가 "Hash" 구나 표시해 주고 있다.

 

"블록의 구조 (Structure)"의 핵심이 "바로 앞과 뒤과 연관이 있다"

라고 설명하고 있다. 출처는 아래 링크.

https://tinyurl.com/vfsbabk
 

[전자화폐 이해하기(36)] 이것만은 알고가자(3)-"블록의 구조 (Structure)" — Steemit

이것만은 알고가자(3)-"블록의 구조 (Structure)" 안녕하세요 @skt1 입니다. 오늘은 서른 여섯 번째 이야기로, 블록체인 그 차제의 이해를 위한 이야기 (Chapter 6)의 그 세번째 이야기인… by skt1

steemit.com

뭔가 비슷한데ㅡ 나만 느끼는건가?

원리가 같은건지 모르겠네.

'파이썬 공부' 카테고리의 다른 글

8. 조건식(기초)  (0) 2019.08.28
7.if문(기초)  (0) 2019.08.22
6.shell 및 터미널 사용법(기초)  (0) 2019.08.16
5.파이썬 REPL 기초 (pwnable fd 풀이 포함)  (0) 2019.08.13
4.파이썬 숫자와 문자열(기초)  (0) 2019.08.12