初心者プログラマのひとり勉強部屋

若葉マークのプログラマー☺️

【python入門】pythonチュートリアルで詰まった点(nonlocal変数とglobal変数・スコープ)

こんにちは。
今回はpython3エンジニア基礎試験で詰まった点について記載します。
(nonlocal変数とglobal変数)




名前空間とスコープ
python3チュートリアルの「クラス」の分野です。

docs.python.org


チュートリアルに以下のような例文があります。

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)


結果

After local assignment: test spam・・・疑問①
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam・・・疑問②
In global scope: global spam



疑問①
do_local()の後の結果が"local spam"ではなく"test spam"

疑問②
do_global()の後の結果が"global spam"ではなく"nonlocal spam"


答えは、スコープにあるようです。
◾️スコープ
プログラムの有効範囲を示すもの
pythonのスコープはインデントで決まる


つまり、今回のチュートリアルのスコープはこうなっているようです。

f:id:mocomo012:20210121223438p:plain
スコープ


疑問①
do_local()の後の結果が"local spam"ではなく"test spam"

検証結果
ローカル変数はlocalスコープ1内でのみ有効
試しにlocalスコープ1内でprintしてみた

def scope_test():
    def do_local():
        spam = "local spam"
        print("localスコープ1内のspam:",spam)  #追加

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)


結果

localscope1内のspam: local spam  #ローカルスコープ内ならlocal 変数を参照
After local assignment: test spam  #別のローカルスコープになるため同じインデント(スコープ)の"test spam"を参照
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam




疑問②

do_global()の後の結果が"global spam"ではなく"nonlocal spam"

検証結果
nonlocal変数はインデントが同じ階層の別のローカルスコープ(local1,local2,local3,local)の中で、global変数より優先される
global変数はglobalスコープで適用される
試しにglobal変数を定義した関数を最初に呼び出し、そのあとにnonlocalを定義した関数を呼び出してみた

def scope_test():
        
    def do_local(): 
        spam = "local spam"
        
    def do_global():  #nonlocalより先に定義
        global spam
        spam = "global spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    spam = "test spam"

    do_global()  #nonlocalより先に呼び出し
    print("After global assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_local()  #local変数を最後に呼び出し
    print("After local assignment:", spam)
    
scope_test()
print("In global scope:", spam)


結果

After global assignment: test spam  #global変数を定義しているがlocalスコープの変数が優先された
After nonlocal assignment: nonlocal spam
After local assignment: nonlocal spam
In global scope: global spam  #globalスコープではglobal変数が適用される



(参考)

ちなみに、do_local()の中でdo_nonlocal()を定義すると、nonlocalの一つ外側のスコープであるdo_localのスコープ内ではnonlocalが優先され、2つ外側のスコープだとtest_spamになりました。
nonlocalは1つ外側のスコープまでなんですね。

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        spam = "local spam1"  #ローカル変数を定義
        def do_nonlocal1():  #内側にnonlocalを定義
            nonlocal spam
            spam = "nonlocal1 spam"
        do_nonlocal1()
        print ("nonlocalの1つ外側のスコープ",spam)

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)


結果

After local assignment: test spam
nonlocalの1つ外側のスコープ nonlocal1 spam
After nonlocal assignment: test spam #nonlocalの2つ外側のスコープ
After global assignment: test spam
In global scope: global spam


スコープについてはこちらのサイト様が参考になりました。

blog.codecamp.jp

またこちらのサイト様は色々検証されていて参考になります🙏

snowtree-injune.com

【python入門】Python3エンジニア認定基礎試験に合格したので勉強時間と教材など

こんにちは。

今回はpython3エンジニア基礎認定試験に合格しましたので勉強時間など記載しようと思います。

まず最初に私はpython初心者どころかrailsのスクール出です。 pythonは独学で趣味として勉強しています。 あくまで趣味の範囲として目標持って勉強したかったため受験しました☺️

そして、結果的に1度不合格でしたが1週間後に無事合格しました。
トータルの勉強時間は2週間で22時間ほどです。
今回は、勉強時間と、勉強法と不合格の反省・感想を記載します。


1.python3基礎認定試験の概要

2.勉強法と教材

3.結果・勉強時間・反省・感想


1.python3基礎認定試験の概要

受験料:11,000円(税込)
出題数:40問
時間:1時間
合格ライン:700/1000(28問正解で合格ライン)


受験方法や概要が記載されています。

www.pythonic-exam.com →今なら教材がもらえるキャンペーンやってます!



2.勉強法と教材

1度落ちて2度目の合格です。
初心者なのに1週間しか勉強せず完全になめていました…!
■参考サイト様

まず勉強するにあたって下記サイト様を参考にさせていただきました。
qiita.com →勉強方法を参考にさせていただきました。

ccie-go.com →出題範囲別の勉強法が大変参考になりました。どこに力を入れれば良いか分かります。


そして私が手につけたのは以下の3つです。(ちなみに全部無料です)

 ◾️Python チュートリアル(web版)
docs.python.org
 オライリー・ジャパンPythonチュートリアル 第3版」が主教材として設定されています。
 ここから各章の出題数も公開されています。
 ただ、web版のチュートリアルとほぼ同内容のようだったので、教材を購入することなくweb版で勉強しました(教材費浮いた!)
 内容はわかりづらく初心者には難しいため、わからない点はwebで調べながら&実際に対話モードで入力しながらです。


 ◾️webテスト
exam.diveintocode.jp →比較的簡単な方のテスト
間違った点を調べて勉強し、
最初475/1000→最終925/1000まであげました。

study.prime-strategy.co.jp →比較的難しい方のテスト
最初60点→最終70点です。
こちらは実際の試験より少し難しく時間もかかる気がしますが、問題文と選択肢を徹底的に調べました。


3. 結果・勉強時間・反省・感想
◾️結果
受験1回目:675/1000 不合格 (あと一問です。。)

受験2回目:850/1000 合格

◾️勉強時間
計 2週間で約21.5時間

1回目:毎日1〜2時間の勉強で1週間
 平日→webチュートリアル1章づつ(1-2時間/日) 計7.5h
 週末→webテスト2つ(3-4時間/日) 計7h

2回目:毎日1-2時間の勉強で1週間
 平日→webチュートリアル再復習(1時間/日) 計5h
 休日→webテスト復習(3時間) 計3h


◾️反省
チュートリアルを完全理解することが重要です。
1回目はwebチュートリアルを流し読みしてwebテストに力を入れていたため、基礎の基礎でつまづきました。
なんとなくでなくwebチュートリアルを読み込んでわからない点は調べる・自分で打って確認することかなと思います。
2回目はwebチュートリアルをしっかり読み込んでわからない点を徹底的に調べたため、基礎から理解することができました。 その代わり出題数が少ないクラスと入出力はほぼ流し読みのため、点数取れていません。。ちゃんと理解したいと思います。


◾️感想
とにかく内容と実用性に比べて受験料が高いと思います。。
内容は簡単なものは本当に簡単です。
自分は実務未経験・他言語(ruby)のスクール出のため2週間で計20時間ほど勉強時間を使いましたが、
他の方の記事にも記載されていますがpython経験者であれば10時間もなくとも合格するのではないでしょうか。
逆にプログラミング未経験者の場合は、他のpythonの入門本から勉強してコードの流れくらいは分かるようにした方が良さそうです。

私の場合は、
・スクールでプログラムのコードの流れを把握できていた
・独学で文法などpythonの理解をしていた(写経を少し修正できるほどのレベルでお恥ずかしいですが)
ということが前提の勉強時間でした。

今回は、python3エンジニア認定基礎試験の体験記でした☺️
これから受験する方は1回合格されることを祈っております。受験料が。。
同じような試験でPython 3 エンジニア認定データ分析試験がありますが、
今回は完全に趣味で受験しただけなので次はG検定の方を視野に入れています。

【追記】
データ分析試験も合格しました。

mocomo012.hatenablog.com

【python入門】「ゼロから作るディープラーニング」を読み始めました

こんにちは。

機械学習からディープラーニングの基礎をしようと、
TensorFlowのチュートリアルに挑戦していたところ、初めてのニューラルネットワークニューラルネットワークのレイヤーが分からずつまづきました。

www.tensorflow.org


チュートリアルではコードが全部載っていて、その通りに書けば動きますが、「この内容なに?」となった時に理論が分からなければ止まってしまいます(私の頭が)、、
他サイト様でもニューラルネットワークの図による説明はたくさんありますが、何度見ても
「畳み込み層ってなに?」「プーリング層ってなに?」「実際になにしてるの?」となります。。

そのため理論の勉強に「ゼロから作るディープラーニング」オライリー)を読書中です。
オライリーは英語の日本語訳が多く、冗長になるため避けていましたが、こちらの本は日本の方が書いた本だからか分かりやすくて感動しております。

まず機械学習ディープラーニングの違いとは何でしょうか。


機械学習
大量のデータから特徴を学習させ、その学習結果から未知のデータに対して予測することです。
(例えば私が最初にトライしていたopenCVでの顔認識は画像認識の一つで、大量の人の顔の画像データから”目”や”鼻”や”口”を画像の明暗で認識させて学習させ、新しい写真を表示させた時に学習結果(画像の明暗)から顔を認識しています。)
【python入門】画像認識盛り込んでみた - mocomoの勉強部屋


このように大量のデータ(文や画像)から特徴を集めたモデルを作成しテストデータに当てはめます。


ディープラーニング
機械学習の一つで、人間の脳のニューラルネットワークの仕組みを模倣してコンピュータで再現したものです。
ニューラルネットワークを3層以上重ねた機械学習ディープラーニングです。
機械学習では、大量のデータから学ぶ特徴を自分で設定しますが、ディープラーニングは自動で設定します。それによって精度が高くなります。

・・・と言われます。
ここでよく分からん。どうやって特徴を設定してるの?どうやって精度高めているの?となります。


第2章パーセプトロンを読み終えたところで、この何を言っていたのか分からない「層(レイヤー)」についてなるほど!と思いました。つまり論理回路を考えれば良いのですね。

詳細は本の内容ですので割愛しますが、数学に明るくない私でも分かりやすい内容で助かっております。
読み終えて理解したらまた読後の感想を記録しようと思います☺️

【python入門】マルコフ連鎖の簡単な文章作成

こんにちは。

今回はPythonMecab形態素解析・markovifyのマルコフ連鎖で簡単な自動作文をしようと奮闘中です。
とりあえずwikiから最近の語句で自動作文してみました。


◾️環境
・Jupyter notebook
MeCabをpipインストール済み
・markovifyをpipインストール済み


1.インストールしたライブラリ
2.マルコフ連鎖とは
3.形態素解析やってみた
4.マルコフ連鎖やってみた
wikiから自動作文した結果



1.インストールしたライブラリ
◾️MeCab
形態素解析のライブラリです。
taku910.github.io
($ pip install mecab-python3 でmecab-python3をインストールしています。)


◾️markovify
マルコフ連鎖のライブラリです。
github.com




2.マルコフ連鎖とは
マルコフ連鎖は、未来の挙動が現在の値だけで決定され、過去の挙動と無関係である(マルコフ性)。各時刻において起こる状態変化(遷移または推移)に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。特に重要な確率過程として、様々な分野に応用される。
wikipediaより)
マルコフ連鎖 - Wikipedia

簡単に言うと、「私 は ネコ で ある」と「私 は イヌ で は ない」という文章から「私 は ネコ で は ない」など、形態素解析した結果からランダムに次に繋がる語ができるというイメージでしょうか。



3.形態素解析やってみた

f:id:mocomo012:20201115023710p:plain
MeCab形態素解析

うんうん。。
スペースで区切られているのがMeCab形態素解析した1単語です。


4.マルコフ連鎖やってみた

元の文はこちら

f:id:mocomo012:20201115024200p:plain
元の文章

ではやってみましょう。
(コードはmarkovifyのgithubのコードと先ほどのMeCabのコードの組み合わせです。)

f:id:mocomo012:20201115023810p:plain
マルコフ連鎖(5文)

同じ文が何度も、、
これは英語だと.(カンマ)で区切られているが日本語だと。句読点などを認識しないことによるらしいです。
また()や[]など特定の文字列を解析することでもmarkovifyが動かないようです。
Cannot combine Text models if they contain ()"'[] in the string · Issue #84 · jsvine/markovify · GitHub

そのためMeCab形態素解析後 → markovifyでマルコフ連鎖で文を作成する前に、
それらの文字があれば削除し「。」の後に半角スペースを入れたり解析文を整えてあげないといけないようです。

しかし自分でごりごりコードを書くにはまだ至っていないので、こちらの方のコードを参考にさせていただき正規表現や排除文字のところを少し変更して再チャレンジしました。
qiita.com


◾️結果

f:id:mocomo012:20201115135125p:plain
作成された文章

「明日 は 早く 起き て ラジオ 体操 を し まし た が 、なかなか うまく いか ず 悲しい です 。」

あんまり変わっていなくて私が悲しいです。。

形態素解析はうまくいっているので、MeCabで作成された文章からマルコフ連鎖で自動作文するときにうまくいっていないようです。
wikiから「コロナ感染症」「鬼滅の刃」「ルパンの娘」の文章を繋げて元の文章を作成しても、マルコフ連鎖の結果がほぼ同じ内容(形態素解析したのに文単位で文章を作成してしまう)になり、ダメでした。


もう少し解析してみます☺️



【追記】
元の文章を増やすと良かったみたいです。それなりに変な文章が生成されました。
wikiの「コロナ感染症」「鬼滅の刃」「ルパンの娘」「エヴァンゲリオン」「野球」「サブスプリクション」の”概要”だけ抜き取りました。文字数だと3924文字ほどです。)


◾️結果
”放送 時 の 視聴 率 は 低かっ た 上 に 、放送 終了 後 に は 、ヒト に 感染 する コロナ ウイルス HCoV 229 E 、HCoVOC 43 、HCoVNL 63 、HCoVHKU 1 による 感染 症 を 指す こと が ほとんど で ある 。”

”大 災害 「 セカンド インパクト 」 が 起き た 世界 2015 年 8 月 26 日 まで フジテレビ 系 木曜 劇場 で テレビ ドラマ 化 さ れ て いる 456 。”

”略称 は 鬼 滅 の 刃 きめ つ の チーム が 守備 側 と 攻撃 側 に 分かれ 、守備 側 の 打者 が バット で 打ち 、設置 さ れ た 。”


思えば形態素解析して同じ単語がなければ次の単語をマルコフ連鎖できなかったですね。
うまくいって良かったです☺️

【Excel】vlookup関数の使い方と他関数との組み合わせ

こんにちは。今回は検索に用いるvlookup関数について解説します。

vlookup関数とは

vlookup関数は検索値から同行の別セルの情報を表示させます。多数の商品名から金額を表示させるときなどに使えます。



vlookup関数の使い方

以下のように果物一覧から購入先を表示させます。

vlookup関数

①検索値
検索したい文字列(または数字)を入力します。セルを参照してもOK。
(ただし必ず検索値が左端の列になるようにしましょう。)

②範囲
検索範囲を設定します。表全体を参照したらいいです。(参照範囲は画像のように青枠を指定してできます。)

③列番号
表の左端の列から何列目の値を表示させるか指定します。今回は購入先を表示させたいので2列目(2)です。

④検索方法
TRUE(近似一致)かFALSE(完全一致)を選択します。通常はFALSEを選択します。
TRUE:近似値(検索値未満の最大値)の結果を表示します。
  ただし、表は昇順でソートをかけておかないと正しく表示されません。
  また、数字限定で文字列はソートをかけても正しく表示されません。
FALSE:完全に一致した検索値を表示します。一致した検索値がない場合はN/Aが表示されます。

※注意点
・検索値の最初の値を表示します。
("めろん"の購入先はフルーツ市場とエクセル商店の2つありますが、検索結果は最初にでてきたフルーツ市場になります。)

・以下のように表全体に検索結果を表示する場合は、絶対参照を使用すると楽です。

絶対参照



他関数との組み合わせ(if関数・isna関数)


組み合わせて使用することが多い関数を紹介します。


◾️値が合っているかどうか確認する
→ vlookup + if関数

「りんご」の「個数」が「1000」のとき、〇、それ以外のとき、×を表示する

vlookup + if 関数


◾️vlookupで#N/Aエラーの時、「×」と表示する
→vlookup + isna関数 + if関数

isna関数とは、#N/Aエラーの有無を表示する関数です。
vlookup関数では検索結果がない場合は#N/Aエラーがでます。
結果に#N/A エラーを表示したくない場合にisna関数を使用できます。

表にない、「いちご」というワードでvlookup関数で検索した時、検索結果がないので「#N/A」エラーが返ります。これを、検索結果がない場合、if【ISNA(vlookupの結果)が真か偽か】で評価しましょう。
①ISNA(テストの対象):結果が真(#N/Aエラー)か偽(#N/Aエラーではない)
②ISNAの結果が真(TRUE)の時、つまり「#N/A」エラーの時、「×」を表示
という流れです。

if + isna + vlookup関数