tanish-kr's learning log

Learning output log

Python

Pythonの基本

インデント

Pythonではインデントでブロックを表す。ブロックの開始、終了はインデントレベルで決まる。

コメント

#から始まり、改行されるまで。

# コメント
print("Hello") # output

ドックストリング(Docstring)

""" 3重ダブルクォートを使用して記載する。 ドックストリングに記述したテキストは関数やクラスオブジェクトの__doc__に保存される

def hello():
    """Output hello"""
    print("Hellow world")

hello.__doc__

オンラインヘルプ

help()というビルドイン関数を使うとオンラインヘルプが表示できる

help(hello)

または、下記のコマンドで、manコマンドのようにオンラインヘルプを表示してくれる

$ pydoc sys

-wオプションでhtmlファイルを生成する

$ pydoc -w sys

Docstring formats

Sphinx(reST)

Pypyで標準で使用されている。reStructuredText(reST)という記法で記述する。

ざっくりと下記のようなイメージ

def sample_method(self, param1)
    """
    :param param1 str: Description of param1
    :return: Description of what is return
    :raises MyError: Description of my error
    """

詳しくは、Sphinx日本ユーザ会を見てもらうほうがいい

Sphinx-Users.jp

Google style

Google コーディング規約でSphinxで以下のような書き方をするらしい

"""
This is an example of Google style.

Args:
    param1: This is the first param.
    param2: This is a second param.

Returns:
    This is a description of what is returned.

Raises:
    KeyError: Raises an exception.
"""

https://google.github.io/styleguide/pyguide.html?showone=Comments#Comments

Epydoc(Epytext)

javadoc風な感じで書ける

"""
This is a javadoc style.

@param param1: this is a first param
@param param2: this is a second param
@return: this is a description of what is returned
@raise keyError: raises an exception
"""

Epydoc

変数

  • 未定義の変数を参照しようとすると、NameErrorが発生
  • グローバル変数は存在しない。globalキーワードを使うと、グローバルスコープになるが、覚える必要なし!
  • 定数は存在しない。意図的に定数として変数を使用する場合は、大文字の変数名にしておいた方がよい。
  • nonlocalでローカルスコープでない一番近くの変数を利用できる

予約語

予約語自体は少ないが、避けておきたい組み込みの名称は、避けたほうが無難

http://qiita.com/cm3/items/6a856c44dd92632aa54f

ユーザ定義関数

公式より抜粋

属性 意味
__doc__ 関数のドキュメンテーション文字列
__name__ 関数の名前
__module__ 関数が定義されているモジュールの名前

詳細は下記参照

公式

__main__

__main__はトップレベルのコードが実行されるスコープの名前。 モジュールが標準入力から読み込まれたとき、スクリプトから実行されたとき、あるいはインタラクティブプロンプトのとき、__name__には__main__が設定される

モジュールは、自身の__name__をチェックすることでメインスコープで実行されているかを確認できる。

if __name__ == "__main__":
    main()

パッケージについては、__main__.pyモジュールを用意することで同じ効果を得られる