python ジャンプスタート

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

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

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

### コメントとインデント
nkmk(@nkmk_me twitter)さん [Pythonのコメント、コメントアウトの書き方](https://note.nkmk.me/python-comment/)

- inline comment  文中の#以降。  # PEP8*では 直前に２つ以上、後ろに１つだけ空白を入れる
- block comment 先頭が#。  # PEP8では #のあとに１つ空白

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


```python:コメント
a = 10  # inline comment
# ------------------------
#         block comment
# ------------------------
print(a)
```

コメントではないが、トリプルクオート(""")で囲むことで文字列オブジェクトとすることもある。
なお、ブロックコメントでは先頭からコメントを書くことができるが、トリプルクオートの場合は、インデントを揃えておかないとエラーになる。
また、関数定義の先頭の文字列オブジェクトは、docstringとして扱われる。docstringは関数の説明文やテストコードとして扱われる。
nkmk(@nkmk_me twitter)さん [Pythonでdocstringにテストコードを記述するdoctestの書き方、使い方](https://note.nkmk.me/python-doctest-example/)


```python:docstring
def my_func()
	"""doc-string
	解説
	"""
```


### main文のお作法

```python:mainの呼び出し
def main()
	...

if __name__ == "__main__":
	main()
```

hirokiky@PyQさん Python お悩み解決[Pythonの```if __name__ == "__main__"``` とは何ですか？への回答](https://blog.pyq.jp/entry/Python_kaiketsu_180207) によると、「このファイルが```python ファイル名.py```のように実行されているかを判定するif文」とのこと。

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

理屈はこんな感じ

-  ```___name___```はPythonの特殊変数のひとつ。
- Pythonファイルのモジュール名が文字列で入っている
- import helloされた時は、`'hello'`が入る。
- python hello.pyされた時は,`'__main__'`が入る

###制御構文のお作法
ブロックの開始は`:`、ブロック内はインデントを１つ下げる、終了でインデントを戻す。
それから、`switch`や`case`はサポートされていない。

```python:制御構文
# 実際には{}は不要
# if
if {条件} :
    {処理文}
elif {条件} :
    {処理文}
else:
    {処理文}
# for
for {変数} in {配列} :
    {処理文}
```
### 関数の定義と呼び出し
おおかた予想どおりですが、カンマで区切ることで複数の戻り値を返すことができます

```python:関数の定義と呼び出し
def 関数名(引数1,引数2,...):
    ...
    return = 戻り値１,戻り値2

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

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

```python:フォーマット出力
a=10
b='abc'
print('a={} b={}'.format(a,b))
print(f'a={a} b={b})
```

nkmk(@nkmk_me twitter)さん [Pythonのf文字列（フォーマット済み文字列リテラル）の使い方](https://note.nkmk.me/python-f-strings/)


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

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

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

###スコープ

@IT かわさきしんじ　さん[Pythonにおける名前空間とスコープを理解する上でのポイントを押さえよう](https://www.atmarkit.co.jp/ait/articles/1612/09/news030.html)

- ローカルスコープ
- ローカルスコープを囲むスコープ（enclosing scope）
- （モジュールレベルの）グローバルスコープ
- 組み込み名前空間を表すスコープ

ローカルスコープは、現在のコードを含む最小範囲のブロック。
モジュール（１つのファイル）のトップレベルで定義された名前

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

###クロージャ
ある関数が、関数を返す場合。返される関数をクロージャ、クロージャを作る関数をエンクロージャ。クロージャの関数のスコープはクロージャのローカルスコープ、エンクロージャのローカルスコープ、モジュールのスコープ、ビルトインスコープの４つ。
ここで、エンクロージャのローカル変数の値は、クロージャ定義時にキャプチャーされて固定される。

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

@IT かわさきしんじ　さん[［Python入門］モジュールの使い方](https://www.atmarkit.co.jp/ait/articles/1907/02/news009.html)
モジュールとは、関連性のある「プログラム部品」を１つのファイルにまとめたもの。
モジュールのプログラム部品を使う前に、import文を用いて使うモジュールをPythonに伝える必要がある。

```python:モジュールの関数呼び出し
import モジュール名

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

```python:基本パターン
import aaa
aaa.bbb.foo('bar')
```

```python:省略パターン1
from aaa.bbb import foo
foo('bar')
```

```python:省略パターン2
from aaa import bbb
bbb.foo('bar')
```

```python:別名パターン
import aaa.bbb as baz
baz.foo('bar')
```

パッケージは？

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

参考 れーき (id:reiki4040)さん 年中アイス[with構文とは何なのか](https://reiki4040.hatenablog.com/entry/20130331/1364723288)


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

##リンク
第１回 [Setup PYNQ-Z1](https://qiita.com/0x20FE/items/9b5e8e7a51ac0d9eabbc)
第２回 [はじめてのJupyter](https://qiita.com/0x20FE/items/7fa2fa59c930c571f197)
第３回 [pythonとPYNQ PL資源へのアクセス](2019-08-15_FPGA_PYNQ_Python_zynq_2fbcf08ba9d29b2452be.md)
第４回 [PYNQ OVERLAY](2019-08-15_FPGA_PYNQ_Python_zynq_36755b7e5b60cfbfec87.md)
番外編　[python ジャンプスタート](https://qiita.com/0x20FE/items/6f8b6d893b9c5c197c5b)



関連メモ　C,perl,PHP. JavaScript,Scilab,VHDL,pythonの比較
[配列と文字列処理の比較](https://qiita.com/0x20FE/items/b6ea768692297b721951)
[関数とオブジェクトの書き方メモ](https://qiita.com/0x20FE/items/02e2a6d8380851272a2c)
[Scilab,NumPy,R行列処理の比較](https://qiita.com/0x20FE/items/75622186ba8a0c6086ce)