Edited at

python ジャンプスタート


はじめに

C,C++,perl,php,java,javascriptとかいじっていたけど、pythonはやっつけで起動するだけでした。numpyとかもいじったけど、文法とかしらないのはさすがにまずい。というわけで、かけあしのメモです。他の言語からの類推がつきにくいものを中心にまとめました。

初心者とかベテラン向け、しっかり学びたい人には、もっとよい記事があるでしょう。


pythonのお作法

まずは、コメントとmain関数の書き方がわからないとどうにもなりません。


コメントとインデント

nkmk(@nkmk_me twitter)さん Pythonのコメント、コメントアウトの書き方


  • inline comment 文中の#以降。 # PEP8*では 直前に2つ以上、後ろに1つだけ空白を入れる

  • block comment 先頭が#。 # PEP8では #のあとに1つ空白

 *PEP8 Python Enhanthment Proposal. PEP8にはstyle guideが書かれている

 


コメント

a = 10  # inline comment

# ------------------------
# block comment
# ------------------------
print(a)

 

コメントではないが、トリプルクオート(""")で囲むことで文字列オブジェクトとすることもある。

なお、ブロックコメントでは先頭からコメントを書くことができるが、トリプルクオートの場合は、インデントを揃えておかないとエラーになる。

また、関数定義の先頭の文字列オブジェクトは、docstringとして扱われる。docstringは関数の説明文やテストコードとして扱われる。

nkmk(@nkmk_me twitter)さん Pythonでdocstringにテストコードを記述するdoctestの書き方、使い方


docstring

def my_func()

"""doc-string
解説
"""



main文のお作法


mainの呼び出し

def main()

...

if __name__ == "__main__":
main()


hirokiky@PyQさん Python お悩み解決Pythonのif __name__ == "__main__" とは何ですか?への回答 によると、「このファイルがpython ファイル名.pyのように実行されているかを判定するif文」とのこと。

つまり、importされた時にはif文以下を実行しないようにするために有用。

理屈はこんな感じ


  • ___name___はPythonの特殊変数のひとつ。

  • Pythonファイルのモジュール名が文字列で入っている

  • import helloされた時は、'hello'が入る。

  • python hello.pyされた時は,'__main__'が入る


制御構文のお作法

ブロックの開始は:、ブロック内はインデントを1つ下げる、終了でインデントを戻す。

それから、switchcaseはサポートされていない。


制御構文

# 実際には{}は不要

# if
if {条件} :
{処理文}
elif {条件} :
{処理文}
else:
{処理文}
# for
for {変数} in {配列} :
{処理文}


関数の定義と呼び出し

おおかた予想どおりですが、カンマで区切ることで複数の戻り値を返すことができます


関数の定義と呼び出し

def 関数名(引数1,引数2,...):

...
return = 戻り値1,戻り値2

val1,val2 = 関数名(引数1,引数2)



print文のお作法

文字列のformat()メソッドでフォーマットするようです。printfの%なんとか{}でかく感じ。便利でしょうが、覚え直すのはつらいなぁ。


フォーマット出力

a=10

b='abc'
print('a={} b={}'.format(a,b))
print(f'a={a} b={b})

nkmk(@nkmk_me twitter)さん Pythonのf文字列(フォーマット済み文字列リテラル)の使い方


名前空間

関数や変数の名前空間をしっかりわかっていないと、おもわぬ同名のオブジェクトを書き換えてしまったり、結果がどこかにいってしまったりと予想外の副作用に悩まされること必定。スコープはどうなっているのでしょう。

JavaScriptやJavaみたいにオブジェクトがごろごろ転がっていて、ガベージコレクタで掃除するのがあたりまえのような処理系では特に注意しないと。Pythonがそれに該当するかどうかはまだわかりませんが。

また、クロージャで非同期処理をするとき、その結果がどこに入るのかなど注意が必要。


スコープ

@IT かわさきしんじ さんPythonにおける名前空間とスコープを理解する上でのポイントを押さえよう


  • ローカルスコープ

  • ローカルスコープを囲むスコープ(enclosing scope)

  • (モジュールレベルの)グローバルスコープ

  • 組み込み名前空間を表すスコープ

ローカルスコープは、現在のコードを含む最小範囲のブロック。

モジュール(1つのファイル)のトップレベルで定義された名前

なお、グローバルスコープの変数に値を代入するにはglobal 宣言する必要がある。

同様にenclosing scpoeの変数に値を代入するにはnonlocal 宣言が必要。


クロージャ

ある関数が、関数を返す場合。返される関数をクロージャ、クロージャを作る関数をエンクロージャ。クロージャの関数のスコープはクロージャのローカルスコープ、エンクロージャのローカルスコープ、モジュールのスコープ、ビルトインスコープの4つ。

ここで、エンクロージャのローカル変数の値は、クロージャ定義時にキャプチャーされて固定される。


モジュールとパッケージ

機能を分割し、再利用するにはモジュール化、ライブラリ化が必要ですよね。

@IT かわさきしんじ さん[Python入門]モジュールの使い方

モジュールとは、関連性のある「プログラム部品」を1つのファイルにまとめたもの。

モジュールのプログラム部品を使う前に、import文を用いて使うモジュールをPythonに伝える必要がある。


モジュールの関数呼び出し

import モジュール名

モジュール名.関数名()


呼び出しはモジュール名.関数名で


基本パターン

import aaa

aaa.bbb.foo('bar')


省略パターン1

from aaa.bbb import foo

foo('bar')


省略パターン2

from aaa import bbb

bbb.foo('bar')


別名パターン

import aaa.bbb as baz

baz.foo('bar')

パッケージは?


資源アクセスなど


ファイルアクセス

with open('ファイル名','r|w') as ファイル記述子:構文を使うと、close処理や例外処理などの後始末をしてくれる。(C++のauto pointer, smart pointerのようなものかな)

参考 れーき (id:reiki4040)さん 年中アイスwith構文とは何なのか


まとめ

おいおい追加します。だれかの助けになるでしょうか。


リンク

第1回 Setup PYNQ-Z1

第2回 はじめてのJupyter

第3回 pythonとPYNQ PL資源へのアクセス

第4回 PYNQ OVERLAY

番外編 python ジャンプスタート

関連メモ C,perl,PHP. JavaScript,Scilab,VHDL,pythonの比較

配列と文字列処理の比較

関数とオブジェクトの書き方メモ

Scilab,NumPy,R行列処理の比較