퐈니썬's LIfe - 잘 실패하자 RSS 태그 관리 글쓰기 방명록
Programming (11)
2022-03-11 17:01:26
728x90
반응형

Introduction

파이썬을 처음 접했을 때, 무슨 뜻인지 몰라 헤매던 적이 있던 내용을 차근차근 정리하고자 합니다. 

파이썬 라이브러리 코드를 보다가 함수의 인자에 작성된 내용을 보고 당황했던 적 있습니다. 

# a function
func(*args, **kwargs)

어떤 의미인지 차근차근 알아가보겠습니다. 

 

 

*args, 위치인자

아래와 같은 함수가 있다고 해봅시다. 

def sum_val(a, b):
	return a+b

이 함수는 a, b  두 가지 인자를 입력으로 받아 합을 내는 함수입니다.

하지만, 이 함수를 사용하는 사용자는 두 변수 이상을 입력하여 합을 도출하고 싶습니다.

 

이 함수는 적절하지 못하기 때문에 아래와 같은 함수를 만들어 볼 수 있습니다. 

def sum_val_list(value_list):
	answer = 0
    for val in value_list:
    	answer += val
    return answer

 

위 함수는 입력에 여러 가지 변수를 넣어 합을 도출할 수 있으나, 입력 인자가 반드시 "리스트 형" 이여야 합니다. 즉, 이 함수를 사용하는 사용자는 "리스트"를 구성하여 입력해주어야 합니다. 

 

이런 경우 *args를 사용하여 해결할 수 있습니다. 

def sum_val_args(*args):
	answer = 0
    #*args를 통해 받은 인자를 리스트형으로 받아 냅니다. 
    for val in args:    
    	answer += val
    return answer

 

*args는 함수 내에서 args로 리스트형을 받아내기 때문에 위치 인자를 저장합니다. 리스트로 하나하나 받아내기 때문에 위치인자를 받기 위해 사용되는 것이죠.

 

*args 적용 전에는 사용자가 아래와 같이 사용해야 했습니다. 

sum_val_list([1,2,4])

*args를 적용한 함수는 아래와 같이 사용이 가능합니다. 

sum_val_args(1,2,4)

 

위치 인자와 키워드 인자???

function(1, 2, a=3, b=4)

위와 같은 함수가 있을 때, 1과 2는 위치 인자이며 a, b는 키워드 인자로 값을 받는 함수입니다. 
이때, 반드시 위치 인자와 키워드인자는 위치인자 다음에 키워드 인자가 와야 합니다.

 

 

**kwargs 키워드 인자

이번엔 **kwargs를 이해하기 위해서는 또 다른 예시의 함수를 정의해보겠습니다. 

def print_keyword(name, university):
	print("name: ", name)
	print("university: ", university)

위 함수는 name, university라는 변수를 받아 출력합니다. 하지만, 사용자가 새로운 파라미터를 추가하고 싶다면, 이 함수를 바꾸어야 할 것입니다. 굉장히 번거로운 일이 될 것입니다. 

 

그래서 "딕셔너리 형"을 이용해서 아래와 같은 함수를 만들 수 있을 것입니다.

def print_keyword_dict(dictionary):
	for key in dictionary:
    	print(key + ": " + dictionary[key])

위 함수는 dictionary를 받아서, key를 통해 해당 값을 출력할 수 있기 때문에 dictionary에 새로운 파라미터를 추가하여 출력할 수 있습니다. 하지만, "딕셔너리 형"을 구성해야 한다는 불편한 점이 있습니다.

 

이런 경우 **kwargs를 사용하여 해결할 수 있습니다. 

def print_keyword_kwargs(**kwargs):
	for key in kwargs:
    	print(key + ": " + kwargs[key])

**kwargs는 함수 내에서 kwargs로 딕셔너리 형을 받아내기 때문에 키워드 인자를 저장합니다.

 

 

# **kwargs 적용 전 함수
print_keyword_dict({"name":"jaehwan", "university":"seoul", "studentID":"123155"})

# **kwargs 적용 후 함수
print_keyword_kwargs(name="jaehwan", university="seoul", studentID="123155")

 

훨씬 깔끔하고, 사용하기 편한 함수가 된 거 같습니다. 

 

 

 

요약

  • 함수에 위치 인자를 받고 싶을 때! -> *args 사용! 리스트형으로 받아내기 때문에 위치(순서)대로 받아 처리!
  • 함수에 키워드 인자를 받고 싶을 때! -> **kwargs 사용! 딕셔너리형으로 받아내기 때문에 키워드에 따라 값을 받아 처리!

 

https://www.geeksforgeeks.org/args-kwargs-python/

 

*args and **kwargs in Python - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

728x90
반응형

'Programming > Python' 카테고리의 다른 글

파이썬 f-string  (0) 2021.12.31
파이썬 모듈이란? 패키지란?  (0) 2021.07.01
파이썬 PEP8 스타일 가이드 정리  (0) 2021.07.01
파이썬 클래스 상속  (0) 2021.06.28
numpy flip을 활용한 DICOM 이미지 반전 대칭  (0) 2021.06.25
2022-01-18 00:22:44
728x90
반응형

 

<Introduction>

CSS을 HTML에 적용하는 3가지 방법에 대해 정리하였습니다. 이번에는 CSS가 실제로 어떻게 작동하는지 알아보도록 하겠습니다. 

2022.01.17 - [Programming/HTML] - [HTML] CSS 적용 방식

 

[HTML] CSS 적용 방식

HTML과 연동하여 스타일을 정의하는 CSS에 대해 알아보고, 어떻게 적용하는지에 대해 작성하고자 합니다. CSS는 사용자에게 HTML, XML 같은 문서를 표시하는 방법을 지정하는 언어입니다. HTML, XML 같

panython.tistory.com

 

 

<HTML/CSS 작동 과정>

우리가 보고 있는 HTML은 "브라우저" 가 HTML 문서를 로드하여 표시하게 됩니다. 이때, 문서의 콘텐츠와 해당 스타일 정보를 결합해서 표시해야합니다. 나열된 단계에 따라, 브라우저가 HTML, CSS를 로드하여 사용자에게 표시되는 과정을 단순화한 단계입니다.

 

주요 전달하고 싶은 내용은 "DOM(Document Object Model)"이라는 컴퓨터 메모리의 문서를 거친다는 점입니다!

 

 

&amp;lt;출처&amp;gt;&amp;nbsp;https://developer.mozilla.org/ko/docs/Learn/CSS/First_steps/How_CSS_works

 

  1. 브라우저가 html 문서를 서버에서 받아서 로드를 합니다. 
  2. html 문서를 parsing 하여 DOM 으로 변환합니다. 
  3. 포함된 이미지 및 비디오와 같은 html 문서에 연결된 대부분의 리소스와 연결된 CSS를 가지고 옵니다.
  4. 브라우저는 가져온 CSS 구문을 분석하고, 규칙에 따라 정렬하여 "Render tree" 합니다.(tree 구성함)
  5. Render tree는 규칙이 적용된 후 표시되어야 하는 구조에 맞게 배치됩니다.
  6. 시각적인 으로 페이지에 표시가 됩니다. (Painting 단계라고 합니다)

 

 

<DOM (Document Object Model) 이란>

문서 객체 모델(The Document Object Model, DOM) 은 HTML, XML 문서의 프로그래밍 interface 입니다.

DOM은 문서의 구조화된 표현(structured representation)을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하여 개발자가 문서 구조, 스타일, 내용 등을 변경할 수 있게 돕습니다. DOM 은 웹 페이지의 객체 지향 표현이며, 자바스크립트와 같은 스크립팅 언어를 이용해 DOM 을 수정할 수 있습니다. 

 

<DOM의 실제 표현>

다음의 html 코드를 DOM으로 어떻게 표현되는지, Render tree를 알아보겠습니다. 

<p>
  Let's use:
  <span>Cascading</span>
  <span>Style</span>
  <span>Sheets</span>
</p>

DOM이 해석하기에는, <p>  태그는 부모에 해당되고 자식에 해당되는 텍스트 태그가 3개의 <span> 태그로 구성되어 있습니다. 이를 DOM에서는 아래와 같이 구성하게 됩니다. 

P
├─ "Let's use:"
├─ SPAN
|  └─ "Cascading"
├─ SPAN
|  └─ "Style"
└─ SPAN
   └─ "Sheets"

 

브라우저는 HTML 문서를 받고 나서 DOM 을 작성한 다음 그로 부터 CSS 구문을 분석합니다. 

CSS에서 사용하는 선택자를 기준으로 빠르게 정렬이 가능하며 위의 예시에서 span이란 선택자에 정의된 속상값에 의해 HTML에 적용되어 시각적으로 표현이됩니다. 

 

 

<Reference>

https://developer.mozilla.org/ko/docs/Learn/CSS/First_steps/What_is_CSS

 

CSS 란 무엇인가? - Web 개발 학습하기 | MDN

CSS (Cascading Style Sheets) 를 사용하면 멋진 웹 페이지를 만들 수 있지만, 어떻게 작동합니까? 이 기사에서는 간단한 구문 예제를 통해 CSS가 무엇인지 설명하고 언어에 대한 몇 가지 주요 용어를 다

developer.mozilla.org

https://www.w3schools.com/css/css_comments.asp

 

CSS Comments

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

 

728x90
반응형

'Programming > HTML' 카테고리의 다른 글

[HTML] CSS 적용 방식  (0) 2022.01.17
[HTML] HTML 주요 tag 모음  (0) 2022.01.12
2022-01-17 13:43:29
728x90
반응형

<Introduction>

HTML과 연동하여 스타일을 정의하는 CSS에 대해 알아보고, 어떻게 적용하는지에 대해 작성하고자 합니다.

 

 

<CSS (Cascading Style Sheets) 란?>

CSS는 사용자에게 HTML, XML 같은 문서를 표시하는 방법을 지정하는 언어입니다. 

HTML, XML 같은 문서 언어로 뼈대를 만들며 CSS는 이 문서의 확장을 맡고 있다고 할 수 있습니다. 

표시하는 방법을 지정한 언어이기에, 내용의 글꼴, 배경색, 이미지의 너비와 높이, 위치 등을 표현 할 수 있습니다. 

 

 

<CSS code>

CSS를 적용하는 방법에는 Inline Style Sheet, Internal Style Sheet, Linking Style Sheet 총 3가지가 있습니다. 

 

 

<CSS code - Inline Style Sheet>

HTML 태그의 "style 속성"에 CSS 코드를 넣는 방법입니다. 

<p style="color: blue">Hello.</p>

출력 결과 

위 코드는 <p> 태그에 style 속성을 추가하여 표현한 예시입니다.

 

 

<CSS code - Internal Style Sheet>

Internal Style Sheet은 HTML 문서 안에 <style>과 </style> 안에 CSS 코드를 넣습니다. 

 

<!DOCTYPE html>
<html>
<head>

<style>
h2 {
  color: red; /* Set text color to red */
}
</style>

</head>

<body>

<h2>My Heading</h2>

</body>
</html>

출력 결과

 

<h2> 태그에 대한 스타일코드를 <style> 태그 내부에 CSS를 작성합니다. 

 

 

<CSS code - Linking Style Sheet>

별도의 CSS 파일을 만들고 HTML 문서에 <link> 태그를 통해 연결하는 방법입니다. 예를 들어 모든 h1 요소의 글자를 빨간색으로 하고 싶다면, 다음의 내용으로 style.css 파일을 만듭니다. (CSS 파일의 확장자는 css입니다.)

h1 {
	color: green;
}

그리고, 적용하고자 하는 HTML 문서에 다음의 코드를 추가합니다. 

<link rel="stylesheet" href="style.css">

 

보통 <link> 태그는 HTML 작성 요령의 <head> 태그 아래에 둡니다. 

 

출력 결과

이 방법의 장점은 여러 HTML 문서에 사용할 수 있다는 것입니다. style.css를 적용시키고 싶은 HTML문서에 <link> 태그로 연결만 해주면 됩니다. 수정 및 관리도 쉽기 때문에 보통의 프레임워크에서 많이 취하는 방식입니다. 

 

 

<Reference>

https://developer.mozilla.org/ko/docs/Learn/CSS/First_steps/What_is_CSS

 

CSS 란 무엇인가? - Web 개발 학습하기 | MDN

CSS (Cascading Style Sheets) 를 사용하면 멋진 웹 페이지를 만들 수 있지만, 어떻게 작동합니까? 이 기사에서는 간단한 구문 예제를 통해 CSS가 무엇인지 설명하고 언어에 대한 몇 가지 주요 용어를 다

developer.mozilla.org

https://www.w3schools.com/css/css_comments.asp

 

CSS Comments

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

728x90
반응형

'Programming > HTML' 카테고리의 다른 글

[HTML] CSS 작동 원리  (0) 2022.01.18
[HTML] HTML 주요 tag 모음  (0) 2022.01.12
2022-01-12 23:49:56
728x90
반응형

<Introduction>

HTML에 대해 알기 위해 기본적이면서 중요한 tag를 알아보고자 합니다. 

 

<전 세계 사이트의 HTML 주요 element type(tag)>

새로운 것을 배울 때, 기본이나 많이 사용하는 걸 우선적으로 알아보고자 합니다.

HTML로 구성되어 있는 전 세계 웹사이트를 대상으로 사용된 tag의 수를 통계로 확인하였습니다. 

즉, 해당 tag만 알더라도 HTML로 구성된 웹사이트를 구성하는데 문제가 없다는 의미가 아닐까요??

 

해당 자료를 보면 평균 32개 정도를 사용하고, 32개 정도의 tag만 잘 공부하더라도 기본적인 HTML 언어를 읽거나 분석하는 것이 가능하고, 나아가 직접 코딩할 때도 전혀 문제가 없는 것 같습니다!

HTML에 대한 자세한 통계는 아래 링크 남겨두겠습니다!! (재미있어요!)

 

<HTML 주요 element type(tag)>

주된 32개의 tag에 대한 사용 빈도는 아래와 같습니다.

그래서, 32개의 tag에 대해서 정리하고자 합니다. 

 

 

<html> : HTML 문서의 루트 요소(root element)로, 웹페이지의 시작과 끝을 정의합니다. 

 

<head> : head는 해당 html 문서의 전반적인 내용을 담고 있는 태그입니다. title, link, meta 등의 tag 포함

 

<body> : 해당 문서의 콘텐츠 영역, 즉 브라우저에 실제로 표시되는 내용들을 정의합니다. 

 

<title>  : <head> tag 하위 tag로 문서의 제목을 정의합니다. 웹브라우저의 탭에 표시됩니다. 

 

<meta> : 해당 문서에 대한 정보를 정의합니다. ex) <meta charset="utf-8"> = 문자 인코딩 방식은 "utf-8"로 지정

 

<div>    : HTML 문서에서 특정 영역이나 구획을 block 단위로 정의합니다. 목적에 따라 묶는 의미입니다.

 

<span> : HTML 문서에서 인라인 요소(inline-element)들을 하나로 묶을 때 사용합니다.

 

        span vs div 차이

  • 더보기
    두 tag 모두 어떤 목적에 따라 내용을 묶기 위한 tag입니다.  다만, div의 경우 block 단위로 묶이기에 줄 바꿈이 되지만 span의 경우는 인라인 요소를 묶기 때문에 줄 바꿈이 적용되지 않습니다. 

<a>   : 다른 콘텐츠와 연결되는 하이퍼링크(hyperlink)를 정의합니다. ex) <a href="링크"> 내용 </a>

 

<script>: 실행 가능한 자바스크립트 코드 삽입을 위한 태그입니다. 

 

<link> : 외부 파일을 연결할 때 사용합니다. ex) <link href='외부 CSS 파일 경로" rel="stylesheet" type="static/css">

 

<img> : 이미지 삽입을 위한 태그입니다. ex) <img src="이미지 경로">, 이때 이미지 경로는 주소도 가능!

 

<p>     : paragraph의 줄임말로 단락을 만드는 태그입니다. 

 

<li>     : HTML 리스트(list)에 포함되는 아이템(item)을 정의합니다.

 

<ul>    : unordered list의 줄임말로, 순서가 없는 HTML 리스트(list)를 정의합니다.

 

<ol>    : ordered list의 줄임말로, 순서가 있는 HTML 리스트(list)를 정의합니다. 

 

<style> : 해당 HTML 문서의 스타일 정보를 정의합니다. <head> tag 하위에 정의됩니다. 

 

<br>    : 줄 바꿈 기능을 의미합니다. 닫는 태그가 없는 게 특징입니다. 

 

<h1~6>: HTML 문서에서 제목(headings)을 정의합니다. 

 

<input> : 사용자로부터 입력을 받을 수 있는 입력 필드(input filed)를 정의합니다.

 

<form> : 사용자로부터 입력을 받을 수 있는 HTML 입력 폼(form)을 정의합니다.

 

<nav> : 같은 사이트 안의 페이지나 다른 사이트의 페이지로 연결하는 링크를 정의하며, 위치 영향을 받지 않습니다. 

 

<footer> : 웹 사이트의 제작자 정보나 연락처 정보를 정의합니다. 

 

<header> : 문서나 특정 섹션의 헤더(header)를 정의하며, 한 번만 작성되는 <head>와 달리 필요한 만큼 사용 가능합니다.

 

<button>  : form 요소 중 하나로, 페이지에 버튼을 정의합니다. submit, reset, button의 속성을 지닙니다. 

 

<strong>  : 해당 콘텐츠의 중요성이나 심각함, 긴급함 등을 강조합니다. 굵게 표시됨!

 

<li>          : 글꼴의 모양을 기울임으로 표기합니다. 

728x90
반응형

'Programming > HTML' 카테고리의 다른 글

[HTML] CSS 작동 원리  (0) 2022.01.18
[HTML] CSS 적용 방식  (0) 2022.01.17
2021-12-31 10:28:56
728x90
반응형

 

문자열 및 변수의 값을 출력할 때, 깔끔하게 출력하거나 내가 원하는 자리수 까지 표현하는 등의 출력 포맷을 갖추는 것이 중요한 경우가 많습니다. 

 

f-string 포매팅

기존에 출력 포맷에 관련된 %포매팅과 str.format 방법이 있지만, 파이썬 3.6 이후에 나온 내장 기능이라고 보시면 됩니다. 

f-string는 f와 {}만 알면 됩니다. 문자열 맨 앞에 f를 붙여주고, 중괄호 안에 직접 변수 이름이나 출력하고 싶은것을 입력하면 됩니다. 


f'문자열 {변수} 문자열'


사용법

 

f-string 문장 정렬

f-string 공백 채우기

 

f-string 소수점 자리 표현하기

728x90
반응형
2021-12-15 08:22:34
728x90
반응형

01. 우선순위 큐(Priority Queue)는 무엇?

일반적인 큐(Queue)의 "선입선출" 구조와 달리 우선순위 큐는 들어간 순서와 상관없이 어떤 기준으로 우선순위가 높은 데이터가 먼저 나오는 구조를 가지는 것을 말합니다!

 

우선순위 큐 구조는 힙!!(heap)이라는 자료구조를 가지고 구현이 가능합니다!

 

02. 힙(heap)은 무엇?

힙은 최솟값이나 최댓값을 빠르게 찾아내기 위해 고안된 완전 이진트리를 기본으로 한 자료구조입니다!!

-> 힙은 완전 이진트리이다??

    -> 완전 이진트리는 간단하게 한 노드(점, 데이터 등등)에서 최대 두 개의 자식 노드(점, 데이터)를 연결하며 왼쪽에서 부터 채워나가는 형태의 알고리즘입니다!! (그림 참조)

아! 힙은 결국에 최소, 최댓값을 구하기 위한 것이고, 최소 값을 구하는 힙 구조를 "최소 힙", 최대 값을 구하는 힙 구조를 "최대 힙"이라고 부릅니다!

 

03. 최소 힙, 최대 힙

최소 힙이든, 최대 힙이든 원리는 동일합니다!!

최소 힙을 예를 들어서 최소 힙은 가장 작은!! 값을 우선순위로 구하는 것입니다. 그래서 추가된 노드는 부모 노드와 비교하면서 자기가 더 작다? 그러면 부모 노드와 자식 노드의 자리가 바뀝니다. 이렇게 자식 노드가 추가될 때마다 부모 노드랑 비교하여 완전 이진트리 (정삼각형 모양)의 최상단에 가장 작은 값이 구해지는 것이죠!!

 

최대 힙은?? 똑같습니다. 단 추가된 자식 노드가 부모 노드와 비교해서? 자식 노드가 크다면 부모 노드와 자리를 바꿔 나가겠죠, 최상단에는? 가장 큰 값이 구해지는 것이죠!!

 

백준 문제 풀어보시면서, 같이 공부해요!!

지적은 항상 배움의 시작입니다. 얼마든지 해주시면 감사합니다!!

728x90
반응형
2021-12-14 10:58:26
728x90
반응형

급하게 수정 코드를 팀 공유 된 github 계정으로 commit을 해야할 일이 생겨, 평소에 작업하던 컴퓨터가 아닌 개인 컴퓨터에서 commit을 진행하였다. 

하.. 그런데,, global 계정이 나의 개인 github 계정인지 모르고 commit에 push까지 원격에 해버리는 실수를 범했다....  

난감했다. 일단 급하게 한다고 확인하지 않은 나의 습관에 반성을 합니다..

 

그래도 다행히 방법을 찾아보니 원격 저장소의 상태를 특정 push 시점으로 변경하는 방법이 있었다! 감사합니다!! 그 내용을 기록하고 공유하고자 합니다.

 

많은 부족한 점이 있으니, 피드백은 언제든지 환영입니다. 

 

 

01. 문제의 상황

문제의 상황을 간단히 정리하자면, 아래와 같다. 

1. 원격 저장소에 코드 변경 내용을 push (생각도없이....)

2. 원격 저장소의 push 계정이 개인 계정임을 확인 (가능했던건, git token을 기존 author의 token으로 입력해서 가능했던 것 같다..?)

3. 잘못됨을 확인하고,, git 원격 저장소의 push 취소하기 

 

02. Github 원격 push 취소하기

딱 3단계를 거치면된다. 

 

1. 잘못된 commit 이력 찾기

git log --oneline

최근까지 commit해던 모든 이력을 확인이 가능하다!

1932901 commit 내용
50c45c2 commit 내용
3c9f431 commit 내용
1fce73a commit 내용
468f1c5 commit 내용
b6b8e5d commit 내용
302490a commit 내용
73dcacd commit 내용
7bf52f8 commit 내용
f2625bc commit 내용
...

위에서 부터 가장 최신에 커밋한 내용이다. 본인이 잘 안다면 언제 잘못한지를 찾아서 해당 commit ID를 확인한다.

 

2. 돌아가고 싶은 시점의 commit 선택하여 이후의 commit 삭제하기 (돌아가라 시간아)

git reset --hard "해당 commit ID"

"--hard" 옵션은 돌아가고 싶은 시점의 commit 이후에 모두 지우는 옵션이다.

반면에 과거 특정 이력만 지우고 싶다면 "--soft" 옵션을 사용하면 된다.

본론으로 돌아와, 이렇게되면 돌아가고 싶은 시점으로 돌아오고 이후에 commit은 지워진다. 그 시점으로 돌아왔다고 보면 되겠다. 

 

3. github 원격 저장소에 반영하기

 git push origin master(자기 브랜치이름)

이러면 완전히 그 시점으로 돌아오게 됩니다. 만약 안될 경우 "-f" 옵션을 사용하면 될 수도 있습니다..

하지만 "-f" 옵션의 사용은 항상 유의하시길..

 

여튼 살았습니다.. 저처럼 바보같은 행동하지 마시길.. 반성하자.. 

 

728x90
반응형
2021-07-01 12:30:24
728x90
반응형

00. 서문

모듈과 패키지의 차이, 함수, 클래스등과의 관계를 어렴풋이 알고는 있었지만, 명확하게 정리한적이 없었습니다. 이번 포스트를 통해 정리 하고자합니다.

[참고 블로그]

[코딩유치원] 파이썬 기초 문법 10편_함수, 모듈, 패키지 개념 총정리

 

[코딩유치원] 파이썬 기초 문법 10편_함수, 모듈, 패키지 개념 총정리

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. [코딩유치원 기초문법 강의] 2021.03.09 - [파이썬 기초/기초 문법] - [코딩유치원] 파이썬 기초 문법 1편_프로그래밍과 코딩

coding-kindergarten.tistory.com

01. 모듈? 패키지?

01.1. 모듈 (Module)

각종 변수, 함수, 클래스를 담고 있는 python 파일(.py) 입니다.

어떤 기능을 만들고자 할때, 작성을 하게되고, 이를 모듈이라 통칭합니다.

저는 개인적으로 "xx_utils.py"와 같이 네이밍하여, 패키지에 포함되는 보조 모듈들을 만들곤합니다.

01.2. 패키지 (Package)

여러 모듈(Module)을 묶은 폴더입니다.

이때, 패키지의 폴더 안에는 모듈도 있을 수 있고, 패키지 폴더안에 서브 패키지 폴더가 있을 수도 있습니다. 개발자의 목적에 따라 구성이 달라지겠지만, 기본적인 개념은 모듈들의 집합입니다.

 

❗"init.py" 란?

"init.py"는 패키지임을 명시하기 위한 모듈이라고 보시면 됩니다. 물론 python 3.3 이상 버전

에서는 작성할 필요가 없지만, 호환성 및 기본적인 룰에 따라 개인적으로 작성하고 있습니다.

02. 모둘, 패키지, 라이브러리 관계

 

728x90
반응형
2021-07-01 10:17:46
728x90
반응형

00. 서문

프로그래밍을 할 때, 특히 협업을 통한 코드 공유가 있을때는 좋은 코드와 나쁜 코드라는 것이 있다고 생각합니다. 코드의 구조가 파악하기 쉽다면 협업을 할 때에도 효율적으로 업무를 진행 할 수 있습니다.

코드 작성하는 스타일에 "정답은 없지만", 잘못된 작성법은 있다고 생각합니다. 즉, 코드 구조를 파악하기가 어려운 코딩 스타일이 겠죠.

이를 막기 위해서는 여러가지 파이썬 코드 작성 가이드가 있습니다.

이 중 가장 대표격인 PEP8을 정리해보겠습니다.

 

PEP 8

  • 파이썬 개선 제안서, 파이썬 코드를 어떻게 구상할 지 알려주는 스타일 가이드
  • 다른 사람과 원활하게 협업하려면 공통된 스타일 공유가 필요
  • 일관성 있는 스타일은 나중에 수정하기도 쉽다.

01. 들여 쓰기

  • 들여쓰기 공백은 스페이스 4칸으로 사용합니다.
  • 연속적 라인에 대하여 구분되도록 정렬
#Correct
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

#Wrong

def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

01.2. tap or space?

  • "스페이스" 사용을 권장합니다.
  • 스페이스와 탭의 혼용을 지양합니다.

01.3. 최대 라인 글자 수

  • 한 라인 (줄) 코드에 대하여 79자 이내로 작성할 것을 권장합니다.

01.4. 연산자 위치

  • 가독성을 위하여, 연속적인 라인에서 연산자는 문장 시작부에 작성 할것을 권장합니다.
#Correct
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

#Wrong
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

01.5. 빈 줄 생성

  • 2줄: top-level function (최상위 함수), 클래스 작성 후에 권장합니다.
  • 1줄: 클래스의 메소드간의 간격에 권장합니다.

01.6. 함수 임포팅

  • 한줄에 하나의 함수를 호출하기를 권장합니다.

02. 불필요한 공백 줄이기

  • 리스트, 인덱스, 함수호출, 키워드 인수할등 등에는 스페이스를 사용하지 않도록합니다.
  • "," 과 ";" 의 구분자들 뒤에 한번의 스페이스 사용을 권장드립니다. (앞에 사용 x)
  • 소괄호, 중괄호, 대괄호 사이에 추가 공백을 사용하지 않도록합니다.
#Correct
spam(ham[1], {eggs: 2})
foo = (0,)
if x == 4: print x, y; x, y = y, x

#Wrong
spam( ham[ 1 ], { eggs: 2 } )
bar = (0, )
if x == 4 : print x , y ; x , y = y , x

03. 주석

03.1. 주석 블록

  • 일반적으로 뒤에 오는 코드 일부나 전체에 대한 내용을 작성합니다.

03.2. 인라인 주석

  • 인라인 주석의 경우 불필요한 경우 사용을 지양합니다.
  • 코드가 명백하지 않을 경우만 사용합니다.
x = x + 1                 # Increment x

04. 네이밍

  • 기본적으로 혼란을 주는 문자사용을 지양합니다. (ex 대문자 I와 소문자 L)

04.1. 패키지, 모듈 네이밍

  • 모듈이름은 간결하고 소문자 사용을 권장합니다.
  • 가독성을 위해 "_" (underscores) 사용을 권장합니다.
  • ex) main.py, main_function.py

04.2. 클래스 네이밍

  • 클래스는 Capitalized 형식(첫자만 대문자)을 권장합니다.
  • 예외처리 또한 클래스와 동일하므로 동일하게 네이밍 하도록 합니다.
  • ex) MainClass

04.3. 상수, 변수 , 함수, 메서드 네이밍

  • 함수, 변수 (클래스 속성포함), 메소드는 소문자, "_" (underscores) 사용을 권장합니다.
    • 보호(protected) 인스턴스 속성: 맨앞에 '_'를 붙여줍니다.
    • 비공개(private) 인스턴스 속성: 맨앞에 '__' 를 붙여줍니다.
    • 스페셜 인스턴스 속성: 앞뒤에 '__' 를 붙여줍니다.
  • 모듈에서 정의되는 상수는 대문자를 사용합니다.

 

https://www.python.org/dev/peps/pep-0008/

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

 

728x90
반응형

'Programming > Python' 카테고리의 다른 글

파이썬 *arg 와 **kwargs 이해 하기  (0) 2022.03.11
파이썬 f-string  (0) 2021.12.31
파이썬 모듈이란? 패키지란?  (0) 2021.07.01
파이썬 클래스 상속  (0) 2021.06.28
numpy flip을 활용한 DICOM 이미지 반전 대칭  (0) 2021.06.25
2021-06-28 11:10:56
728x90
반응형

01. 파이썬 클래스 (Class)란?

클래스는 어떤 것이고 왜 필요할까?

01.1. 클래스의 개요

  • 클래스는 객체의 구조와 행동을 정의한다.
  • 객체의 클래스는 초기화를 통해 제어한다.
  • 클래스는 복잡한 문제를 다루기 쉽게 한다.

 

💡메모

객체란, 어떠한 속성의 값, 행동을 가지는 데이터를 일컫습니다. 파이썬에서 숫자, 문자, 함수 등등 모든 데이터들은 여러 속성과 행동을 가지고 있고 각각이 객체라 볼 수 있습니다.

예시)

세탁기라는 객체는 "빨래를 한다", "빨래 정지한다", "가로 100cm" 등의 속성과 행동으로 표현할 수 있습니다. 이렇든 정의된 데이터가 속성과 행동을 가진다면 객체라고 말할 수 있겠네요!

 

클래스는 위와 같은 특성을 가지는데요, 왜 그러한지에 대해 차근차근 보겠습니다.

 

02. 클래스는 복잡한 문제를 다루기 쉽게 한다?

아래의 예시를 통해 이를 확인 할 수 있습니다.

클래스를 통해 복잡하게 반복해야하는 행동을 쉽게 정의하여 해결 할 수 있습니다.

 

곱셈 계산 기능을 가지는 계산 프로그램 multiply가 있습니다.

이 계산 프로그램은 현재 까지 입력된 모든 숫자들의 곱을 구해야합니다.

예시)

result = 1

def multiply(num):
    global result
    result *= num
    return result

print(multiply(3))
print(multiply(4))
print(multiply(6))

[out]
3
12
72

 

그런데, 어떠한 상황에서 multiply의 기능을 하는 계산 프로그램이 두개가 필요하다고 생각해봅시다.

예를들어, 1 x 4 x 10 라는 연산과 20 x 4 라는 연산을 한번에 진행해야 할 때, 이러한 상황을 고려해보면 위 와같은 multiply 프로그램을 multiply_1, multiply_2와 같이 두개를 만들어야 합니다.

 

예시)

result_1 = 1
result_2 = 1

def multiply_1(num):
    global result_1
    result_1 *= num
    return result_1

def multiply_2(num):
    global result_2
    result_2 *= num
    return result_2

print(multiply_1(1))
print(multiply_1(4))
print(multiply_1(10))

print(multiply_2(20))
print(multiply_2(4))

[out]
1
4
40
20
80

 

좋습니다. 2개까지는 충분히 만들 수 있을거 같습니다. 하지만, 5개, 20개 혹은 그이상이 필요할 때는 어떻게 해야할까요, 하나하나 직접 구현 하는 것은 굉장히 복잡하고, 비효율적입니다.

여기서! 클래스는 이러한 상황을 매우 간단하게 해결합니다!

 

예시)

#Multiply 클래스 생성
class Multiply:
    def __init__(self):
        self.result = 1
    
    def multiply(self, num):
        self.result *= num
        return self.result

# 클래스를 통한 계산기 1 
multiply_1 = Multiply()
print("계산기 1 결과")
print(multiply_1.multiply(2))
print(multiply_1.multiply(5))

# 클래스를 통한 계산기 2
multiply_2 = Multiply()
print("계산기 2 결과")
print(multiply_2.multiply(10))
print(multiply_2.multiply(9))

 

위와 같이 Multiply라는 클래스를 생성하여, multiply_1, multiply_2의 인스턴스를 형성하여 사용할 수 있습니다!

많이 비유되는 거처럼, 클래스는 마치 틀, 공장과 같은 역할을 해서 자신의 형태 결과물인 인스턴스를 만들어냅니다!

 

3. 객체의 클래스는 초기화를 통해 제어?

클래스를 생성하고 생성된 클래스를 인스턴스로 형성하여 반복적으로 기능을 할 수 있는 것이 클래스의 특징인데요, 여기서 항상 들어가는 "__init__()" 이라는 함수가 있습니다.

이는 생성자라하며, 인스턴스가 생성될때 항상 실행되는 것입니다.

즉, 위의 Multiply라는 클래스를 통해, Multiply_1, Multiply_2 라는 두개의 인스턴스가 생성되었는데요, 생성할때마다 __init__() 함수가 실행되면서 모두 self.result = 1이라는 문장을 실행합니다.

 

즉, result라는 변수를 인스턴스 형성때마다 초기화가 됩니다. 이러한 장점은 많은 변수를 추가할 필요없게 합니다.

 

💡메모

클래스에는 생성자와 소멸자라는 개념이 있습니다.

생성자는 위에서 설명한 "__init__()"에 해당되며, 이 생성자를 통해서 객체가 생성될때 어떤 변수의 값을 세팅하는 등 여러가지 작업을 할 수 있습니다.

반면에, "__del__()" 라는 소멸자는 리소스 해제등의 종료 작업을 하기위해 사용됩니다.

 

#Multiply 클래스 생성
class Multiply:
    def __init__(self):
        self.result = 1
    
    def multiply(self, num):
        self.result *= num
        return self.result

#클래스가 인스턴스로 형성될 때마다 __init__() 함수는 실행된다. 
#즉 result 인스턴스 형성 마다 개별적으로 초기화

4. 클래스는 객체의 구조와 행동을 정의?

이 특징은 위를 잘 읽으셨다면 충분히 이해 하실 겁니다.

즉, 어떠한 객체에 대해 복잡한 구조를 만들 필요 없이 클래스를 통해서 객체에 대한 행동과 속성을 구조화 시켜 간단하게 해결 할 수 있습니다!!

 

 

728x90
반응형