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++ 및 Java와 마찬가지로 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 또는 인수 수를 알고 있다면 위의 대화형 인터프리터 코드에서 문자열 길이를 요청할 때와 마찬가지로 len(sys.argv)를 사용하여 Python에서 이 값을 요청하면 됩니다. 일반적으로 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 문을 구성하는 줄이 모두 동일한 들여쓰기 수준을 사용하여 그룹화되는 방식에 주목하세요. 또한 사용자에게 친숙한 + 연산자를 사용하여 문자열을 반복하는 두 가지 방법을 제시했습니다. 하지만 * 는 Python의 '반복' 연산자이기 때문에 작동합니다. 즉, '-' * 10는 화면에 '줄'을 만드는 깔끔한 방법인 '----------'를 제공합니다. 코드 주석에서 *가 +보다 빠르게 작동한다고 암시했습니다. 그 이유는 *가 결과 객체의 크기를 한 번만 계산하는 반면 +는 +가 호출될 때마다 계산이 실행되기 때문입니다. +와 * 는 모두 숫자와 문자열 (및 기타 데이터 유형)에 서로 다른 것을 의미하므로 '오버로드' 연산자라고 합니다.

def 키워드는 괄호 안에 매개변수가 있고 코드가 들여쓰기된 함수를 정의합니다. 함수의 첫 번째 줄은 함수가 하는 작업을 설명하는 문서 문자열('문서 문자열')일 수 있습니다. 문자열 문서는 위의 예와 같이 단일 줄이거나 여러 줄의 설명일 수 있습니다. 예, Python 고유의 기능인 '삼중 따옴표'입니다. 함수에 정의된 변수는 해당 함수에 로컬이므로 위 함수의 'result'는 다른 함수의 'result' 변수와 별개입니다. 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()를 실행하려고 할 때만 이러한 함수가 없음을 감지하고 오류를 발생시킵니다. 이 스니펫에는 두 번째 오류도 있습니다. name이 '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' 및 'while'과 같은 키워드는 변수 이름으로 사용할 수 없으며, 사용할 경우 구문 오류가 발생합니다. 그러나 기본 제공 언어를 변수 이름으로 사용하지 않도록 주의하세요. 예를 들어 '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 list' 또는 'python string lowercase')로 Google 검색을 실행합니다. 첫 번째 검색 결과가 답변인 경우가 많습니다. 이 기법은 어떤 이유로든 다른 언어보다 Python에 더 잘 작동하는 것 같습니다.
  • 공식 Python 문서 사이트인 docs.python.org에는 양질의 문서가 있습니다. 하지만 단어 몇 개를 Google 검색하는 것이 더 빠른 경우가 많습니다.
  • Python 또는 프로그래밍을 처음 접하는 사용자를 위해 특별히 설계된 공식 튜터 메일링 리스트도 있습니다.
  • StackOverflowQuora에서 다양한 질문과 답변을 찾을 수 있습니다.
  • help() 및 dir() 함수를 사용합니다 (아래 참조).

Python 인터프리터 내에서 help() 함수가 다양한 모듈, 함수, 메서드에 대한 문서 문자열을 가져옵니다. 이러한 문서 문자열은 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() 메서드에 대한 도움말 문자열