楽しい楽しいお勉強日記

IT系の勉強や読書記録を書きます。勉強大好き!(自己暗示)

Python学習サイト PyQをやってみた

プログラミング初心者が公式チュートリアル見ても分かるわけねぇだろ!

 

最近公式チュートリアルだけだと限界を感じてきたので、

オンラインでPythonに特化した学習サイトの「PyQ」をやってみました。

 

PyQ - 本気でプログラミングを学びたい人のPythonオンライン学習サービス

 

目次

 

 

レベルに合わせたコースがたくさんある

めっちゃいっぱいあります。

「Webアプリ・API」「スクレイピング」「数学・アルゴリズム」「機械学習」「データ分析」「統計分析」とかとか。

簡単なHTML CSSや、SQLについてもあります。もちろんPythonに関連した内容です。

 

僕は一番初心者用の「未経験からのPython文法」をやってみました。

↓こんな感じ

f:id:NiLkun:20190807194424p:plain

 

 

↓目安ですがこんな感じに草を生やすこともできます。

f:id:NiLkun:20190807194614p:plain

 

継続しやすかった

学習方法は、最初に写経、次に演習って感じです。

例を写しながら使い方を覚えて演習で確認って感じです。

 

完全に理解出来ていなくてもコードを写しながらサクサク進めるので、達成感を得やすく継続しやすかったです。

 

3日坊主の自分でも楽しくて9日連続ログインしてました。

おかげで2週間で443個のクエストを大体40時間くらいで終わらせることが出来ましたヾ(・ω・o) 

 

 

1周では練習量が足りない

じゃあ1周してプログラミング未経験がスラスラコードをかけるようになるかっていうと無理だと思います。他言語経験者ならワンチャン?

 

僕は1周した後にpaizaのスキルチェックとかyukicoderの初心者問題とかやってみましたが、悩んで悩んでやっと数問解答出来た程度でした。

 

ただクラス等含めて基本的な文法が理解できるようになったので、コードを見てどんな動きをしてるのかは分かるようになってきた気がします。

 

1周した成果としては、ググりながらならのコーディングが出来るようになったって感じでしょうか。

 

 

写経でデキるプログラマー感が味わえて好き

写経がやっぱりいいと思います。

 

もちろん意味や動きを考えながら写経するわけですが、

スラスラ書いてると...こう...「俺もプログラミングしてる!!!うおーーー!!」って感じが味わえて好きです。

 

次は初心所用のコース2周目をやってみようかな、それとも背伸びして違うコースをやってみようかな。^^

 

 

 

 

↓スタバ

f:id:NiLkun:20190807201726p:plain

 

パコチュー 6.1.1. モジュールをスクリプトとして実行する

Python公式チュートリアル、略してパコチュー

 

docs.python.org

 

6.1.1. モジュールをスクリプトとして実行する

前回を思い出せ...!

モジュールは関数とか定義している.pyファイルの事。

そのモジュールを(importも出来るけど)スクリプトで使えるようにするにはどうすればいいのかって話。

それにはファイルの末尾に下の魔法のおまじないを書いてあげればOK!(おい)

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

__name__は実行するモジュール名

"__main__"はコマンドから実行する時の名前

github.com

 

例えばターミナルやコマンドプロンプトでfibo.pyってファイル(モジュール)の関数を使いたいとする。

呼び出すためには下のコマンドを打つ。

python fibo.py <引数>

ここの「fibo.py」って名前が、"__main__"に入るんだね!!!

さっきのおまじないを自分なりに訳すと、

「実行するファイル(モジュール)名と、コマンドから実行した名前が一緒ならスクリプトからでも起動してやるよ!」

って条件をつけてくれるおまじないだったのね!(多分)

 

コード追加例はこんな感じ

f:id:NiLkun:20190716221619p:plain

 

ここら辺前まで読んでも全く意味が分からなかったから、

何となくでも分かってきて嬉しいな。

 

 

 

 

 

 

 ........

関係ないんですけど昨日映画館で実写版のアラジンを見てきました。

実写版リメイクって微妙ってイメージが強かったんだけど、そこはさすがディズニー。

ミュージカルものとウィルスミスが好きな人はおすすめですぞ〜♫

 

パコチューを読んでいる 6.モジュール編 Python公式チュートリアル

 

たわ言

Pythonの公式チュートリアル、略してパコチュー(流行れ)

 

にるです。

前から思ってたんだけど公式ドキュメント横文字多すぎて初学者だと意味分からなくない?訳してあるから仕方ないんだけど。

Rubyみたいに日本人が作った言語なら分かりやすそうな解説いっぱいありそうだな...。

  

6. モジュール

今回はモジュールってやつを読みました!

ここを自分なりに理解したら今までのモヤモヤが晴れた感じしました!

docs.python.org

モジュールってのは関数とか定義してある.pyファイルって事なのね。

(モジュール=ファイルって事でいいのかな)

もっと言うとimportして別ファイルから呼び出せるファイルのことだったのね。

 

defでfibとfib2って関数が定義されてるfibo.pyってファイルがある。

ここでimport fiboってやればfibとfib2を使えるようになると、ふむふむ。

 

fibo.py↓ 関数fibとfib2を定義してる。

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result
>>>
import fibo

 

importでfiboファイルを呼び出す。↓

>>>マークはターミナルやコマンドプロンプトpythonモードに入ったときの証(インタプリタ?)

>>> import fibo

 

↓fibo.fib(1000)は、ファイル名.関数名(引数)。

importしてればこうやって自分で作った違うファイルに入れた関数を呼び出して使う事が出来るよってこと。

>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

fibo.__name__???

__name__っていうpython標準の関数(組み込み関数)かな??

返り値を見るとファイル名を返してるっぽい。

 

 

↓またいちいちファイル名.関数名(引数)ってするのめんどくさければ、変数に代入して使うことも出来るよ

>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 

 

 

 

6.1. 別のインポートのやり方

さっきimport ファイル名で持ってこれるってやったんだけど、

このやり方だと使うときは必ずファイル名.関数名(引数)って具合に関数名も明示しないといけないのね。

初めからこのファイルのこの関数使う!!!って分かってる時は↓で指定して読み込めるみたいよ。

>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

from ファイル名 import 関数名って感じ。↑

 

 

ファイル内の関数とかを全部読み込んどくならこれ↓

from ファイル名 import *←アスタリスク

>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

↑このやり方は可読性が乏しいコードになるからやめた方がいいらしいよ。

(解説読んでたら「モジュールで定義されている名前を全て import する」って表記があって、importするのはひょっとして関数だけじゃないのか?って思ったり...)

 

 

あとは関数名を自分の使いやすいように変えられる方法もあります。↓

from ファイル名 import 関数名 as 好きな名前をどうぞ←下の例だとfibonacci

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

 

おしまい!

 

次回はif __name__ == "__main__"を頑張るぞ!

 

(公式チュートリアルフィボナッチ数列が題材にされてるんだけど見る度にプリズンブレイクを思い出す...。わかる人いる??)

 

 

 

 

 

Python公式チュートリアルを頑張って読んでいる 5.データ構造

色々とPythonの初心者用の本やサイトを見て学ぼうとしても「タプル」とか「リスト」とかの横文字が入ると解説の意味が分からなくなってたぐらい頭弱いんだけど...

最近ようやくコードと解説を見て理解出来るようになってきたのでプログラミングが楽しくなってきました(^_^)

とりあえずは会社の業務を効率化させられたらなぁって目標です。

 

 

以下自分用の備忘録です。(ノートにでも書いとけとか言わないでw)

 

 5.データ構造

docs.python.org

 

list.append(x)

このlistが関数で、

appendがメソッドって言われるやつで、

xが引数。

 

一つの関数に複数のメソッドがある。

listなら他にも

  • list.extend(iterable)
  • list.insert(i, x)
  • list.remove(x)

とか色々ある。

関数に「これやれ!」って指示するのがメソッドかな?

引数がその対象になるみたいなイメージ。

 

 

5.1.1 リストをスタックとして使う

docs.python.org

スタック(last-in, first-out)で使うなら

stack = [3, 4, 5]

stack.append(6)とか

stack.pop()でOK。

 

5.1.2 リストをキューとして使う

docs.python.org

キュー(first-in, first-out)の場合は要素を最初とか途中に入れる場合、

appendやpopはリストの末尾から遡るので遅くなる(?)からcollections.dequeを使うと良いらしい。多分popleftメソッドがあるからだと思う。

 

>>> from collections import deque

>>> queue = deque(["Eric", "John", "Michael"])

>>> queue.append("Terry")           # Terry arrives

>>> queue.append("Graham")          # Graham arrives

>>> queue.popleft()                 # The first to arrive now leaves

'Eric'

>>> queue.popleft()                 # The second to arrive now leaves

'John'

>>> queue                           # Remaining queue in order of arrival

deque(['Michael', 'Terry', 'Graham'])

 

 

5.1.3 リストの内包表記

docs.python.org

リストの書き方って色々あるなぁって話

>>> squares =

>>> for x in range(10):

...     squares.append(x**2)

...

>>> squares

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 

こうも書ける↓ 

squares = list(map(lambda x: x**2, range(10)))

 

こうも書ける↓

squares = [x**2 for x in range(10)]

 

 

xとyが違う値の要素を抜き出す↓

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

 

これと一緒↓

>>>combs =

>>>for x in [1, 2, 3]:

           for y in [3, 1, 4]:

               if x != y:

                   combs.append*1

 

 

 

5.1.4 ネストしたリストの内包表記

docs.python.org

>>> matrix = [

...     [1, 2, 3, 4],

...     [5, 6, 7, 8],

...     [9, 10, 11, 12],

... ]

このmatrixの行と列を入れ替える。↓

>>>[[row[i] for row in matrix] for i in range(4)]

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

 

iは0~3まで繰り返す。

for row in matrixで、最初は[1, 2, 3, 4]を持ってきて、

row[i]だから、最初はrow[0]、つまり[1, 2, 3, 4]の0番目の要素、1を取り出す。

次は[5, 6, 7, 8]の0番めの要素、5を取り出す。次は[9, 10, 11, 12]の0番目の9を取り出す。

iが0の時に取り出した要素が[1, 5, 9]、これをiが3になるまで繰り返す。

 

 

 

5.4 集合型

pythonは集合を使える。和集合とか。set関数を使う。

docs.python.org

 

 

 

 

 

 

 

 

*1:x, y

Python公式チュートリアルを頑張って読んでいる ラムダ・キーワード引数

これです。

docs.python.org

 

言語はPythonが初めてです。

 

すごいひと「プログラミングは公式ドキュメント読めば分かるよ」

僕「わかりました!」

...

僕「メソッド?クラス?分からんやめよ」

僕「リストとかのこういうの(['kiwi', 'apple', 'banana'])入力するの面倒だからやめよ」

公式ドキュメント「1.やる気を高めよう」

僕「」

 

 

めちゃくちゃゆっくりなペースですが読んでます。

分かるひとには何を当たり前な事を...って感じですけど自分用の記録として。

 

 

 

 

4.7.5. ラムダ式

lambdaで名前の無い関数を作れる。

docs.python.org

 

defでmake_incrementorって関数作って、その中にlambdaで関数作ってる↓

nは仮の引数?

>>> def make_incrementor(n):

...     return lambda x: x + n

...

 

make_incrementorをfに代入してる。呼び出す時楽だからかな?↓

>>> f = make_incrementor(42)

>>> f(0)

42

>>> f(1)

43

 

 

最初見たとき何で4,1,3,2の順番なのか5分ぐらい分からなかったw

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]

>>> pairs.sort(key=lambda pair: pair[1])

>>> pairs

[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

これは辞書の二つ目の要素でソート「pair: pair[1]」してるのでアルファベットでソートされてる。

 

辞書の1つ目の要素でソート「pair: pair[0]」すれば数字でソートできる。

>>> pairs = [(1, "one"), (2, "two"), (3, "three"), (4, "four")]

>>> pairs.sort(key=lambda pair: pair[0])

>>> pairs

[('one', 1), ('two', 2), ('three', 3), ('four', 4)]

 

それか辞書の要素の順番を入れ替えるかすれば数字でソート出来る(これは無いか)

>>> pairs = [("one", 1), ("two", 2), ("three", 3), ("four", 4)]

>>> pairs.sort(key=lambda pair: pair[1])

>>> pairs

[('one', 1), ('two', 2), ('three', 3), ('four', 4)]

 

 

4.7.2. キーワード引数

関数には必須引数とオプション引数を指定出来る。

docs.python.org

 

↓のvoltageが必須引数、state,action,typeがオプション引数。

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

    print("-- This parrot wouldn't", action, end=' ')

    print("if you put", voltage, "volts through it.")

    print("-- Lovely plumage, the", type)

    print("-- It's", state, "!")

 

parrot関数を呼び出す時、必須引数(ここだとvoltage)は入れないとだめ。

オプション引数は何も入れなければ、関数で指定されてる値が勝手に入る。

関数を呼び出す際に一緒に入れる引数は、カンマで区切られた順に割り当てられる?

parrot('a million', 'bereft of life', 'jump')なら、

voltage引数にはa millionが、

state引数にはbereft of lifeが、

action引数にはjumpが入る。

type引数は指定してないのでNorwegian Blueが入る。

 

引数を指定する事も出来る。

parrot(action='VOOOOOM', voltage=1000000)

 

これはだめらしい。

✖︎ parrot(voltage=5.0, 'dead')

多分これ↓ならok、引数を指定する場合は、指定してない引数よりも後ろにしなきゃいけないみたい。

◎ parrot('dead', voltage=5.0)

 

 

 

あとこれ。初見で全く意味が分からなくて理解するのに時間かかった。

↓関数作る

def cheeseshop(kind, *arguments, **keywords):

    print("-- Do you have any", kind, "?")

    print("-- I'm sorry, we're all out of", kind)

    for arg in arguments:

        print(arg)

    print("-" * 40)

    for kw in keywords:

        print(kw, ":", keywords[kw])

 

↓関数呼び出す

cheeseshop("Limburger", "It's very runny, sir.",

           "It's really very, VERY runny, sir.",

           shopkeeper="Michael Palin",

           client="John Cleese",

           sketch="Cheese Shop Sketch")

 

↓出力

-- Do you have any Limburger ?

-- I'm sorry, we're all out of Limburger

It's very runny, sir.

It's really very, VERY runny, sir.

----------------------------------------

shopkeeper : Michael Palin

client : John Cleese

sketch : Cheese Shop Sketch

 

 

def cheeseshop(kind, *arguments, **keywords):

↑の*argumentsで引数をカンマで区切ってたくさん指定出来るって意味らしい。

↑の例だと、⑴"It's very runny, sir.","It's really very, ⑵VERY runny, sir."で二つの引数を指定してる。forで回してる。

 

で、どっからが**keywords何だ?カンマでずっと区切ってるじゃん、ずっと*argumentsの範囲やろ。って思ってたけど、a=bみたいになってるやつを辞書として受け取ってるみたい。**keywordsが受け取ってるのはこいつら↓

shopkeeper="Michael Palin",

           client="John Cleese",

           sketch="Cheese Shop Sketch"

 

こちらの解説が分かりやすかった。

note.nkmk.me

 

 

使いこなせるまでまだまだ先は長い...というかいつ使うんだろ...