##はじめに
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の書き方、使い方
def my_func()
"""doc-string
解説
"""
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つ下げる、終了でインデントを戻す。
それから、switch
やcase
はサポートされていない。
# 実際には{}は不要
# 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')
from aaa.bbb import foo
foo('bar')
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行列処理の比較