Python 소개

서론

Google Python 온라인 가이드에 오신 것을 환영합니다. 내부적으로 제공되는 Python 입문 과정을 기반으로 합니다. 설정 페이지에서 언급했듯이 이 자료에서는 Python 3을 다룹니다.

컴패니언 MOOC 과정을 찾고 있다면 Udacity 및 Coursera의 과정 (프로그래밍 입문[초보자] 또는 Python 입문)을 수강하세요. 마지막으로, 동영상을 시청하지 않고 자율형 온라인 학습을 원하는 경우 이 게시물 하단에 나와 있는 학습을 시도해 보세요. 각 동영상은 학습 콘텐츠와 함께 연습할 수 있는 Python 대화형 인터프리터를 제공합니다. 우리가 말하는 이 "통역사"는 무엇입니까? 다음 섹션에서 알려드립니다.

언어 소개

Python은 동적인 해석된 (바이트 코드 컴파일) 언어입니다. 소스 코드에는 변수, 매개변수, 함수 또는 메서드의 유형 선언이 없습니다. 이렇게 하면 코드가 짧고 유연해지며 소스 코드의 컴파일 시간 유형 확인을 잃게 됩니다. Python은 런타임에 모든 값의 유형을 추적하고 실행할 때 의미가 없는 코드에 플래그를 지정합니다.

Python 코드의 작동 방식을 확인하는 좋은 방법은 Python 인터프리터를 실행하고 코드를 바로 입력하는 것입니다. 'listint를 추가하면 어떻게 되나요?'와 같은 질문이 생기면 Python 인터프리터에 입력하기만 하면 어떤 일이 발생하는지 빠르고 가장 효과적으로 확인할 수 있습니다. (실제로 어떤 일이 일어나는지 아래에서 확인해 보세요!)

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

python을 입력한 후 python이 출력되는 두 줄과 >>> 프롬프트 전에 사용 중인 Python의 버전과 빌드 위치를 알려줍니다. 가장 먼저 'Python 3'이 출력되는 경우 다음 예를 사용할 수 있습니다.

위에서 볼 수 있듯이 변수와 연산자를 사용하여 쉽게 실험할 수 있습니다. 또한 코드가 값이 할당되지 않은 변수를 읽으려고 하면 인터프리터가 런타임 오류를 발생시키거나 Python 용어로 '올립니다'. C++ 및 자바와 마찬가지로 Python은 대소문자를 구분하므로 'a'와 'A'는 서로 다른 변수입니다. 행의 끝은 문의 끝을 표시하므로 C++ 및 Java와 달리 Python은 각 문의 끝에 세미콜론을 필요로 하지 않습니다. 주석은 '#'으로 시작하여 행 끝까지 확장됩니다.

Python 소스 코드

Python 소스 파일은 '.py' 확장자를 사용하며 '모듈'이라고 부릅니다. Python 모듈 hello.py을 사용하는 경우 가장 쉬운 실행 방법은 Python 인터프리터를 호출하여 hello.py의 코드를 실행하고 명령줄 인수 'Alice'를 전달하는 셸 명령어 'python hello.py Alice'를 사용하는 것입니다. 명령줄에서 Python을 실행할 때 사용할 수 있는 다양한 옵션은 공식 문서 페이지를 참조하세요.

다음은 매우 간단한 hello.py 프로그램입니다. 코드 블록은 중괄호가 아닌 들여쓰기를 사용하여 엄격하게 구분되므로 이 내용은 나중에 자세히 다룹니다.

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

이 프로그램을 명령줄에서 실행하는 방법은 다음과 같습니다.

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

가져오기, 명령줄 인수, len()

Python 파일에서 가장 바깥쪽 문, 즉 '모듈'은 일회성 설정을 수행합니다. 이러한 문은 모듈을 처음 가져올 때 위에서 아래로 실행되어 변수와 함수를 설정합니다. Python 모듈은 위 python3 hello.py Bob와 같이 직접 실행하거나 다른 모듈에서 가져와서 사용할 수 있습니다. Python 파일을 직접 실행하면 특수 변수 '__name__'이 '__main__'으로 설정됩니다. 따라서, 위에 표시된 상용구 if __name__ ==...를 사용하여 모듈이 직접 실행될 때는 main() 함수를 호출하도록 하는 것이 일반적이지만 다른 모듈에서 모듈을 가져올 때는 호출하지 않습니다.

표준 Python 프로그램에서 목록 sys.argv에는 표준 방식으로 명령줄 인수가 포함되어 있으며 sys.argv[0] 은 프로그램 자체이고 sys.argv[1] 은 첫 번째 인수입니다. argc 또는 인수의 수를 알고 있다면 문자열 길이를 요청할 때 위의 대화형 인터프리터 코드에서 한 것처럼 Python에 len(sys.argv)를 사용하여 이 값을 요청하면 됩니다. 일반적으로 len()는 문자열의 길이, 목록과 튜플의 요소 수 (배열과 같은 또 다른 데이터 구조), 사전에 있는 키-값 쌍의 수를 알려줄 수 있습니다.

사용자 정의 함수

Python에서 함수는 다음과 같이 정의됩니다.

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

함수 또는 if 문을 구성하는 행이 모두 동일한 들여쓰기 수준을 사용하여 어떻게 그룹화되는지도 살펴보세요. 또한 + 연산자를 사용하여 문자열을 반복하는 2가지 방법도 제시했습니다. 이 연산자는 Python의 '반복' 연산자이므로 * 도 작동합니다. 다시 말해, '-' * 10는 화면에 '줄'을 만드는 깔끔한 방법인 '----------'를 제공합니다. 코드 주석에서 * 가 +보다 더 빠르게 작동한다는 힌트를 주었습니다. *는 결과 객체의 크기를 한 번 계산하지만 +를 사용하면 +가 호출될 때마다 계산되기 때문입니다. +와 * 는 숫자와 문자열 (및 기타 데이터 유형)에 대해 서로 다른 의미를 갖기 때문에 '오버로드된' 연산자라고 합니다.

def 키워드는 괄호 안에 매개변수를 입력하고 코드를 들여쓰기하여 함수를 정의합니다. 함수의 첫 번째 줄은 함수의 기능을 설명하는 문서 문자열 ('docstring')이 될 수 있습니다. docstring은 위의 예와 같이 한 줄 또는 여러 줄의 설명일 수 있습니다. (예, 이는 Python에만 있는 기능인 '삼중따옴표'입니다.) 함수에 정의된 변수는 해당 함수에 로컬이므로 위 함수의 '결과'는 다른 함수의 '결과' 변수와 별개입니다. return 문은 인수를 받을 수 있습니다. 인수의 경우 해당 인수는 호출자에게 반환되는 값입니다.

다음은 위의 repeat() 함수를 호출하여 반환되는 내용을 출력하는 코드입니다.

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

런타임 시 함수는 호출되기 전에 'def' 실행으로 정의되어야 합니다. main() 함수를 파일 아래쪽에 두고 그 위에서 호출하는 함수를 정의하는 것이 일반적입니다.

들여쓰기

한 가지 특이한 Python 기능은 코드 조각의 공백 들여쓰기가 의미에 영향을 미친다는 것입니다. 함수를 구성하는 구문의 논리적 블록은 모두 동일한 들여쓰기를 사용해야 하며 상위 함수의 들여쓰기 또는 'if' 등에 따라 설정됩니다. 그룹의 줄 중 하나에 다른 들여쓰기 간격이 있으면 구문 오류로 신고됩니다.

Python이 공백을 사용하는 것은 처음에는 약간 이상하게 느껴지지만 논리적이고 매우 빠르게 익숙해졌습니다. TAB은 들여쓰기 스키마를 매우 복잡하게 하므로 사용하지 않습니다. 또한 TAB은 플랫폼에 따라 다른 것을 의미할 수 있습니다. Python 코드용 Tab 대신 공백을 삽입하도록 편집기를 설정합니다.

초보자가 하는 일반적인 질문은 "공백 몇 개를 들여쓰기해야 하나요?"입니다. 공식 Python 스타일 가이드 (PEP 8)에 따라 공백 4개로 들여쓰기해야 합니다. 재미있는 사실: Google의 내부 스타일 가이드라인에 따라 들여쓰기 간격은 2칸입니다.

런타임에 코드 확인됨

Python은 컴파일 시 검사를 거의 하지 않으며 해당 줄이 실행될 때까지 거의 모든 유형과 이름 등의 검사를 연기합니다. 위의 main()이 다음과 같이 repeat()를 호출한다고 가정해 보겠습니다.

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

if 문에는 repeat() 함수가 실수로 repeeeet()로 입력되는 명백한 오류가 있습니다. Python에서 재미있는 점은 이 코드는 런타임 시 이름이 'Guido'가 아닌 한 잘 컴파일되고 실행됩니다. 실행에서 실제로 repeeeet()를 실행하려고 하는 경우에만 이러한 함수가 없음을 알게 되고 오류가 발생합니다. 이 스니펫에는 두 번째 오류도 있습니다. 'Guido'와 비교되기 전에는 이름에 값이 할당되지 않았습니다. 할당되지 않은 변수를 평가하려고 하면 Python에서 'NameError'가 발생합니다. Python 프로그램을 처음 실행할 때 표시되는 첫 번째 오류 중 일부가 단순한 오타나 초기화되지 않은 변수임을 보여주는 몇 가지 예시입니다. 이는 Java와 같이 더 상세한 유형 시스템을 사용하는 언어가 컴파일 시간에 이러한 오류를 포착할 수 있는 한 가지 영역입니다 (물론 이러한 모든 유형 정보를 유지해야 하며 장단점이 있습니다).

Python 3에는 유형 힌트가 도입되었습니다. 유형 힌트를 사용하면 함수의 각 인수에 대한 유형과 함수에서 반환하는 객체의 유형을 나타낼 수 있습니다. 예를 들어 주석 처리된 함수 def is_positive(n: int) -> bool:에서 인수 nint이고 반환 값은 bool입니다. 이러한 유형의 의미는 나중에 살펴보겠습니다. 그러나 유형 힌트는 전적으로 선택사항입니다. 유형 힌트를 채택하는 코드가 점점 더 많아지는 것을 확인할 수 있습니다. 이러한 힌트를 사용하면 cider-v 및 VS.code와 같은 일부 편집기에서 함수가 올바른 인수 유형으로 호출되었는지 확인하기 위해 검사를 실행할 수 있기 때문입니다. 개발자가 코드를 수정할 때 인수를 제안하고 검증할 수도 있습니다. 이 튜토리얼에서는 유형 힌트를 다루지 않지만 이러한 힌트를 듣거나 실제로 본 적이 있다면 알고 있어야 합니다.

변수 이름

Python 변수에는 소스 코드에 철자로 적힌 유형이 없으므로 변수에 의미 있는 이름을 지정하여 무슨 일이 일어나고 있는지 기억하는 것이 좋습니다. 따라서 이름이 하나이면 "name"을 사용하고 이름 목록이면 "names"를 사용하고 튜플 목록이면 "튜플"을 사용합니다. 기본적인 Python 오류는 대부분 각 변수에 어떤 유형의 값이 있는지 잊어버려서 발생합니다. 따라서 정확하게 파악하고자 하는 모든 변수 이름을 사용하세요.

실제 이름 지정에 있어 일부 언어는 '두 개 이상의 단어'로 구성된 변수 이름에 밑줄(underscored_parts)을 선호하지만, 다른 언어에서는 camelCasing을 선호합니다. 일반적으로 Python은 밑줄 메서드를 선호하지만 개발자가 이미 이 스타일을 사용하는 기존 Python 코드에 결합하는 경우 camelCasing을 따르도록 안내합니다. 가독성이 중요합니다. 자세한 내용은 PEP 8의 이름 지정 규칙 섹션을 참고하세요.

짐작할 수 있듯이 'if' 및 'when'과 같은 키워드는 변수 이름으로 사용할 수 없습니다. 이 경우 구문 오류가 발생합니다. 그러나 기본 제공을 변수 이름으로 사용하지 않도록 주의하세요. 예를 들어 'str', 'list', 'print'는 좋은 이름처럼 보일 수 있지만 이러한 시스템 변수는 재정의하게 됩니다. 기본 제공은 키워드가 아니므로 신규 Python 개발자가 실수로 사용할 수 있습니다.

모듈 및 네임스페이스에 대해 자세히 알아보기

'def foo()'가 포함된 'binky.py' 모듈이 있다고 가정해 보겠습니다. 이 foo 함수의 정규화된 이름은 'binky.foo'입니다. 이러한 방식으로 다양한 Python 모듈에서 함수와 변수의 이름을 원하는 대로 지정할 수 있으며 변수 이름이 충돌하지 않습니다. module1.foo는 module2.foo와 다릅니다. Python 용어로 보면 binky, module1, module2에는 각각 고유한 '네임스페이스'가 있으며, 이는 변수 이름-객체 바인딩이라고 추측할 수 있습니다.

예를 들어 argv 목록 및 exit() 함수와 같은 일부 표준 시스템 기능을 포함하는 표준 'sys' 모듈이 있습니다. 그런 다음 'import sys' 문을 사용하여 sys 모듈의 정의에 액세스하고 정규화된 이름(예: sys.exit())로 사용할 수 있습니다. (예, 'sys'에도 네임스페이스가 있습니다.)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

'from sys import argv, exit'와 같은 다른 가져오기 양식이 있습니다. 이렇게 하면 짧은 이름으로 argv 및 exit()를 사용할 수 있습니다. 그러나 함수나 속성의 출처를 훨씬 쉽게 확인할 수 있는 정규화된 이름이 있는 원래 형식을 사용하는 것이 좋습니다.

Python 인터프리터의 표준 설치와 함께 번들로 제공되는 모듈과 패키지가 많이 있으므로 이를 사용하기 위해 별도의 작업을 수행할 필요가 없습니다. 이러한 라이브러리를 총칭하여 'Python 표준 라이브러리'라고 합니다. 일반적으로 사용되는 모듈/패키지는 다음과 같습니다.

  • sys — exit(), argv, stdin, stdout, ...에 액세스
  • re — 정규 표현식
  • os — 운영체제 인터페이스, 파일 시스템

http://docs.python.org/library에서 모든 표준 라이브러리 모듈 및 패키지에 대한 문서를 찾을 수 있습니다.

온라인 도움말, help()dir()

Python에 대한 도움을 얻는 방법에는 여러 가지가 있습니다.

  • 'python' 또는 'python string'과 같이 'python'이라는 단어로 시작하는 Google 검색을 수행합니다. 첫 번째 조회가 답인 경우가 많습니다. 이 기법은 어떤 이유로든 다른 언어보다 Python에서 더 잘 작동하는 것으로 보입니다.
  • 공식 Python 문서 사이트(docs.python.org)에 고품질 문서가 있습니다. 그럼에도 불구하고 Google에서 몇 개의 단어를 검색하면 더 빠른 경우가 많습니다.
  • Python이나 프로그래밍이 처음인 사용자를 위해 특별히 설계된 공식 Tutor 메일링 리스트도 있습니다.
  • StackOverflowQuora에서 많은 질문과 답변을 찾을 수 있습니다.
  • help() 및 dir() 함수를 사용합니다 (아래 참조).

Python 인터프리터 내에서 help() 함수는 다양한 모듈, 함수, 메서드에 대한 문서 문자열을 가져옵니다. 이러한 doc 문자열은 Java의 javadoc과 유사합니다. dir() 함수는 객체의 속성이 무엇인지 알려줍니다. 다음은 인터프리터에서 help() 및 dir()을 호출하는 몇 가지 방법입니다.

  • help(len): 기본 제공 len() 함수의 도움말 문자열입니다. 'len()'이 아닌 'len'입니다. 이는 함수의 호출이며 원하지 않습니다.
  • help(sys): sys 모듈의 도움말 문자열 (먼저 import sys를 실행해야 함)
  • dir(sys): dir()help()와 같지만 정의된 기호 또는 '속성'의 빠른 목록을 제공합니다.
  • help(sys.exit): sys 모듈의 exit() 함수에 관한 도움말 문자열
  • help('xyz'.split): 문자열 객체의 split() 메서드의 도움말 문자열입니다. 이 객체 자체 또는 객체의 및 관련 속성을 사용하여 help()를 호출할 수 있습니다. 예를 들어 help('xyz'.split)를 호출하는 것은 help(str.split)를 호출하는 것과 동일합니다.
  • help(list)list 객체의 도움말 문자열
  • dir(list) — 메서드를 포함하여 list 객체 속성을 표시합니다.
  • help(list.append): list 객체의 append() 메서드 도움말 문자열