ホーム     戻る



  小舟が一艘 夏空に
  夢見心地にたゆたいて
  ある7月の昼下がり

 
  不思議の国にまどろみて
 日々のまにまに夢を見る
 逝く夏のように夢を見る

 流れに沿って流されて
 金の光にたゆたいて
 人生、それはただの夢
 (キヤロル) " 恋人の誘いの歌

 20131015改訂中

 第15章   基本的なスクリプト

チュートリアル日本語日本語訳 PDF

 リファレンス日本語http://psyto.s26.xrea.com/python/PQR2.4/PQR2.4.ja.html#Frontstuff

  (1) 球体の体積を求める              ユーザ定義関数

 from math import * 

 >>> def  v(r):
       print('球の面積', 4 * pi * r * r * r / 3)      
公式

 
 >>> v(3)
 
 球の面積 113.097335529  
                     


 def  v(r): return  4 * pi *r *r *r / 3   v関数の名前、r仮引数
  >>> v(3)                    実引数を入れて実行
 
 113.09733552923255
 
     

 (2)リスト内包表記(式)

 >>> clist = []
 >>> for  s  in  'python':
       clist.append(ord(s))

 
 >>> clist
 
 [112, 121, 116, 104, 111, 110]     pythonのコードが示されている

  >>> clist = [ord(s)  for  s in  'python']    #
リストコンプリヘンジョン 
                       内包表記 結果としてリストが返る
  >>> clist                         #’python’繰り返し変数  
                       ord() 関数 戻り値が要素のリスト

 [112, 121, 116, 104, 111, 110]

 >>> sq = [x **2 for  x  in  range(10)]           # x二乗のリストを作る
 >>> sq
 
  [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

 >>> sq  =  [(x, x**2)  for  x  in  range(5)]
 >>> sq

  [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]      #
タブルのリストを作る

 >>> val = 10
 >>> [x  for  x  in range(1, val)  if  val  %  x ==0]
 
 [1, 2, 5]

 >>> l = [ x +y  for x  in (1,2,3for  y  in (100,200,300)]  #forを複数記述

 >>> l

 [101, 201, 301, 102, 202, 302, 103, 203, 303]

 >>> for  x  in (1,2,3):                       #内包表記を使用しないとき
      for  y  in  (100,200,300):
          l.append(x + y)

 >>> l

 [101, 201, 301, 102, 202, 302, 103, 203, 303]

 (3)イテレータ
 

コンテナの次の要素を返すnextメソッドとiterメソッドを実装したコンテナオブジェクト

 >>> i = iter("abc")
>>> next(i)
'a'
>>> next(i)
'b'
>>> next(i)
'c'
>>> next(i)
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    next(i)
StopIteration
>>>

複数の要素をもったデータを順番に取り出す汎用的な方法。
 インデクスを持たないデータにも使う。forループはリストのようなシーケン
 ス添えてつくる。

 1.次の要素を取り出す
 2.要素が終わったかどうか判別する

 サイズの大きなデータを扱う。ループと一緒に使う。
 次の要素を取り出す処理(next()関数)
 要素が終わったかどうかを判断する処理(例外処理)
 処理の対象オブジェクト
 リスト:順番を持つ
 ファイル:文字列改行をもつ
 イテレート可能:iter()

 イテレータ:複数の要素をもったオブジェクト・データを順番に取り出し処
 理する手段
 コレクション:複数の値をもったオブジェクトの集まり
 
        イテレート可能オブジェクト

 iter()関数

 next()関数 次の要素を取り出す関数

 >>> i = iter([1,2,3,4,5])
 >>> next(i)

 1


 >>> next(i)

 2


 >>> next(i)

 3


 >>> next(i)
 4

 >>> next(i)
 5

 >>> next(i)
 Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    next(i)
 StopIteration

 >>> acc={'現金':101,'小口現金':102,'当座預金':103}   辞書定義
 >>> for key in acc:                       辞書のキーでループ
       print(key,)

 
 現金
 当座預金
 小口現金

 
pythonのコレクションはすべてイテレート可能

  p=1
 for i in [1,2,4,8]:
     p *=i
     print(p)

 1
 2
 8
 64

(4)ジェネレータ

一連の要素を返す関数を実装する

 反復可能なオブジェクト

  all() すべて反復可能であれば  True

  any() 反復可能な要素があれば True

  x =[-2,9,7,-4,3]
  print(all(x),any(x),len(x),min(x),max(x),sum(x))
  x.append(0)
  print(all(x),any(x),len(x),min(x),max(x),sum(x))

  True True 5 -4 9 13
  False True 6 -4 9 13

 range()関数

  整数リスト、タブルの作成と for ・・・・ in のループカウンタを

  提供する。

 print(list(range(5)),list(range(9,14)),tuple(range(10,-11,-5)))

 [0, 1, 2, 3, 4] [9, 10, 11, 12, 13] (10, 5, 0, -5, -10)

 rsange()関数

 for t in zip(range(4),range(0,10,2),range(1,10,2)):
    print(t)

 (0, 0, 1)
 (1, 2, 3)
 (2, 4, 5)
 (3, 6, 7)

 for t in zip(range(5),range(0,10,2),range(1,10,2)):
     print(t)

 (0, 0, 1)
 (1, 2, 3)
 (2, 4, 5)
 (3, 6, 7)
 (4, 8, 9)

 for t in zip(range(2),range(0,10,2),range(1,10,2)):
      print(t)

 (0, 0, 1)
 (1, 2, 3)

 print(list(range(0,3)))
 print(list(range(10,13)))
 import itertools
 print(list(itertools.chain(range(0,3),range(10,13))))
 print(list(zip(range(0,3),range(10,13))))
 print(list(zip(range(0,3),range(10,14))))

 [0, 1, 2]
 [10, 11, 12]

 [0, 1, 2, 10, 11, 12]
 [(0, 10), (1, 11), (2, 12)]
 [(0, 10), (1, 11), (2, 12)]
>>>

 ジェネレータ(内部イテレータ)

 内部にyield文がある関数
 ジェネレータ関数を呼び出すとイテレータオブジェクトが返ってくる。

 >>> fib=fibonacci()
>>> next(fib)
1
>>> next(fib)
1
>>> next(fib)
2
>>> [next(fib) for i in range(10)]
[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
>>>

ジェネレータを呼び出すたびに、毎回数列の次の要素を生成する。

 イテレーションの処理を簡単に定義できる。

 >>> nest=[[1,2],[3,4],[5,6]]
 >>> def flat(nest):
        for sub in nest:
        for elm in sub:
            yield elm

   
 >>> for num in flat(nest):
      print(num)

 
 1
 2
 3
 4
 5
 6
 >>> list(flat(nest))
 
 [1, 2, 3, 4, 5, 6]

 反復子iterator
 コンテナオブジェクトの多くはfor文でループできる。for文はコンテナオ 
 ブジェクトにiter()をコールする。

 >>> for elm in [1,2,3]:
      print (elm)

 
 1
 2
 3

 >>> for key in {'one':1,'tow':2}:
      print(key)

 tow
 one

 >>> for char in '123':
     print(char)

 
 1
 2
 3

 

 >>> s ='abc'
 >>> it = iter(s)
 >>> it

 <str_iterator object at 0x0143B070>

 >>> next(it)

 'a'

 >>> next(it)

 'b'

 >>> next(it)
 'c'

 >>> next(it)

 Traceback (most recent call last):
   File "<pyshell#8>", line 1, in <module>
     next(it)
 StopIteration

 ジエネレータ
 
 反復子を作る。データを返す部分でyieldを使う

 def reverse(data):
     for index in range(len(data)-1,-1,-1):
      yield data [index]

 >>> for char in reverse('kawasaki'):
...         print(char)
...    
 i
 k
 a
 s
 a
 w
 a
 k

  
(5)入れ子の関数

 def pc(a,b,c):
    def pc(x,total=a+b+c): return(x*100)/total
    print("percentage are :",pc(a),pc(b),pc(c))

 pc(12.0,13.0,14.0)

 percentage are : 30.7692307692 33.3333333333 35.8974358974

 感覚と既知なるものに背を向けて、洞窟の外へ、遠い記憶の内奥へと赴かなければならない。その困難な遡行の果てに、いつか「突如として、あたかも一つの火が燃え移って別の光明が点じられるようにして」真の知がわれわれの魂のうちに点ることを期しながら

(対話という思想 プラトンの方法序説・内山勝利著。岩波書店)