10/9 キッシュっておいしい,そこらへんでは買えないけど
セミナー・行動モデル概論みたいなものの予習を完了.集計分析とか非集計分析とか.
Pythonの関数では,因数に名前を付けておくことができ,それを使用して指定することができる(順番が定義段階と違っていてもOK).
def calctime(dist, speed):
t = dist / speed
t = round(t,1)
return t
print(calctime(speed=100, dist=500))
↓
C:\Users\bin\Anaconda3\python.exe C:/Users/bin/PycharmProjects/practice/practice3.py
5.0
Process finished with exit code 0
引数に*argsのように*をつけておくと,変数argsにタプルとして代入されるので,for構文などを使って処理できる.因数の数を変えられる(可変長の引数).辞書型にしたいなら**のようにふたつつける.
関数内の変数をグローバル化したいときにはgrobal …と記述すればよい.
関数もオブジェクト→関数の値だけでなく,関数そのものの代入もできる(丸かっこをつけずに=で代入)
リストのすべての要素に対して適用:map(function, iterable, ...) iterableはリストやタプルなど,複数の値を持てるデータ型のこと
特定の要素だけを取り出す:filter(function, iterable) 結果がTrueのものだけを返す.なので,ここでいう関数は論理式のようなもの.
無名関数lambda:関数を定義しなくても関数のようにふるまう
どういうことかというと,
nums = [1, 2, 3, 11, 12, 13, 21, 22, 23]
list(filter(x % 2 ==0 , nums))
↓
C:\Users\bin\Anaconda3\python.exe C:/Users/bin/PycharmProjects/practice/practice3.py
Traceback (most recent call last):
File "C:/Users/bin/PycharmProjects/practice/practice3.py", line 2, in <module>
list(filter(x % 2 ==0 , nums))
NameError: name 'x' is not defined
Process finished with exit code 1
このように,関数として定義されていないと論理式が使えない(xがなんなのかが定義できていない).
ここでlambdaを使うと
nums = [1, 2, 3, 11, 12, 13, 21, 22, 23]
print(list(filter(lambda x: (x % 2) ==0 , nums)))
↓
C:\Users\bin\Anaconda3\python.exe C:/Users/bin/PycharmProjects/practice/practice3.py
[2, 12, 22]
Process finished with exit code 0
とできる.わざわざ外で定義しなくても使えるということ.
辞書型データにanimal_dict.items()のようにitems()メソッドを実行すると,タプルに変換する.
なので,辞書型データにsorted関数を使いたいときはitems()メソッドで変換する.
復習:for構文の繰り返し(iの中身)にはrange関数やリストが使える.
…反復可能な値:「イテレータを生成できるオブジェクト」:イテレータとは値を順番に取り出せる仕組みを持つオブジェクトのこと
Pythonではこれを自分でつくれる(ジェネレータを使う).
yield文:値を返す.関数内の状態をすべて保存し,再度その関数が呼ばれると,先ほど返した値の次(直後)から処理を継続実行する.
def gen1to3():
yield 1;
yield 2;
yield 3;
it = gen1to3();
for i in it:
print(i)
↓
C:\Users\bin\Anaconda3\python.exe C:/Users/bin/PycharmProjects/practice/practice3.py
1
2
3
Process finished with exit code 0
def genprime(maxnum):
num = 2
while num <= maxnum:
isprime = True #変数かどうかを管理
for i in range(2, num):
if (num % i) == 0:
isprime = False
break
if isprime == True:
yield num
num += 1
it = genprime(50)
for v in it:
print(v, end = ",")
↓
C:\Users\bin\Anaconda3\python.exe C:/Users/bin/PycharmProjects/practice/practice3.py
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,
Process finished with exit code 0
注意する点:「いままでの素数全部で割ってみる」操作はfor文で書いていて,かつ列挙しているものと現在考えている数でふたつの数を扱っている.それに加えて関数としてmaxnumを引数にしていて,これはどの範囲まで素数を出すかというもの.