Python-3.関数とコードの多重化

9910 ワード

一、関数の定義と使用
  • は予約ワードdef定義関数、lambdaは匿名関数
  • を定義する.
  • オプションパラメータ(初期値付与)、可変パラメータ(*b)、名称伝達
  • リザーブreturnは、任意の複数の結果
  • を返すことができる.
  • リザーブglobalは、グローバル変数の使用を宣言し、いくつかの暗黙的なルール
  • を宣言する.
    1.1関数の理解と定義
    関数はコードの表示です
  • 関数は、特定の機能を有する再利用可能な文群
  • である.
  • 関数は機能の抽象であり、一般的な関数は特定の機能
  • を表す.
  • の2つの役割:プログラミングの難易度とコード多重化を低減する
  • def () :
        
        return 
    
  • 関数定義の場合、指定パラメータはプレースホルダ
  • である.
  • 関数定義後、呼び出されなければ
  • は実行されない.
  • 関数定義の場合、パラメータは入力、関数体は処理、結果は出力(IPO)
  • である.
    1.2関数の使用及び呼び出しプロセス
    呼び出しは関数コードを実行する方法です
  • 呼び出し時に実際のパラメータ
  • を与える.
  • 実際のパラメータ置換定義のパラメータ
  • 関数呼び出し後の戻り値
  • を得る.
    関数の呼び出しプロセス
    1.3関数のパラメータ伝達
    パラメータ数
    関数にはパラメータがありますが、なくてもいいですが、カッコを保持する必要があります.
    def () :
        
        return 
        
    def fact() :
        print("     ")    
        
    

    オプションのパラメータ転送
  • 関数の定義時に、いくつかのパラメータにデフォルト値を指定することができ、オプションパラメータ
  • を構成する.
    def (, ) :
        
        return 
    
  • 関数定義時に可変数パラメータを設計することができ、パラメータ総数
  • を確定しない.
    def (, *b ) :
        
        return 
    

    パラメータ伝達の2つの方法
    関数が呼び出されると、パラメータは位置または名前で渡すことができます.
    def fact(n, m=1) :
        s = 1
        for i in range(1, n+1):
        s *= i
        return s//m
    

    1.4関数の戻り値
  • 関数は、0以上の結果を返すことができます.
  • returnリザーブワードは、戻り値
  • を伝達するために使用される.
  • 関数は、戻り値があってもよいし、なくてもよいし、returnがあってもよいし、
  • がなくてもよい.
  • returnは、0個の戻り値を伝達するもよいし、任意の複数の戻り値
  • を伝達してもよい.
  • 関数呼び出しの場合、パラメータは位置または名前で
  • を渡すことができる.
    1.5ローカル変数とグローバル変数
  • 基本データ型は、重複するかどうかにかかわらず、ローカル変数はグローバル変数とは異なる
  • である.
  • は、globalリザーブワードによって関数内部でグローバル変数
  • を宣言することができる.
  • はデータ型を組み合わせ、ローカル変数が実際に作成されていない場合はグローバル変数
  • である.
    1.6lambda関数lambda関数は、結果として関数名を返します.
  • lambda関数は匿名関数であり、名前のない関数
  • である.
  • lambdaを使用してワード定義を保持し、関数名は結果
  • を返す.
  • lambda関数は、単純で1行で表すことができる関数
  • を定義するために使用される.
    = lambda :
    次のように等価です.
    def () :
    
       
    
       return 
    
    >>> f = lambda x, y : x + y
    >>> f(10, 15)
    25
    >>> f = lambda : "lambda  "
    >>> print(f())
    lambda  
    

    Lambda関数の慎重な使用
  • lambda関数は、主にいくつかの特定の関数または方法のパラメータ
  • として使用される.
  • lambda関数にはいくつかの固定的な使用方法があり、
  • を徐々に把握することをお勧めします.
  • 一般的な場合、def定義の一般的な関数
  • を使用することを推奨します.
    二、例:七段デジタルチューブの描画
    基本的な考え方:
  • ステップ1:単一の数値に対応するデジタルチューブを描画する
  • 七段デジタルチューブは7つの基本線からなる
  • 七段デジタルチューブは、固定順序
  • を有することができる.
  • 異なる数字は異なる線
  • を表示する.
    import turtle
    def drawLine(draw):     #       
        turtle.pendown() if draw else turtle.penup()
        turtle.fd(40)
        turtle.right(90)
    def drawDigit(digit):   #           
        drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
        drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
        drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
        drawLine(True) if digit in [0,2,6,8] else drawLine(False)
        turtle.left(90)
        drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
        drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
        drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
        turtle.left(180)
        turtle.penup()  #           
        turtle.fd(20)   #           
    
  • ステップ2:一連の数字を取得し、対応するデジタルチューブ
    import turtle
    def drawLine(draw):     #       
        …( )
    def drawDigit(digit):   #           
        …( )
    def drawDate(date):     #        
        for i in date:
            drawDigit(eval(i))  #  eval()         
    def main():
        turtle.setup(800, 350, 200, 200)
        turtle.penup()
        turtle.fd(-300)
        turtle.pensize(5)
        drawDate('20181010')
        turtle.hideturtle()
        turtle.done()
    main()
    
  • を描画する.
  • ステップ3:現在のシステム時間を取得し、対応するデジタルチューブを描画
  • 七段デジタルチューブ間の線間隔
  • を増加する.
    import turtle
    def drawGap():      #       
        turtle.penup()
        turtle.fd(5)
    def drawLine(draw):     #       
        drawGap()
        turtle.pendown() if draw else turtle.penup()
        turtle.fd(40)
        drawGap()
        turtle.right(90)
    def drawDigit(digit):   #           
        drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
        drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
        drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
        drawLine(True) if digit in [0,2,6,8] else drawLine(False)
        …( )
    
  • timeライブラリを使用してシステムの現在時刻
  • を取得する.
  • 増年月日表記
  • 年月日の色が異なる
  • import turtle, time
    …( )
    def drawDate(date): #data   ,    '%Y-%m=%d+'
        turtle.pencolor("red")
        for i in date:
            if i == '-':
                turtle.write(' ',font=("Arial", 18, "normal"))
                turtle.pencolor("green")
                turtle.fd(40)
            elif i == '=':
                turtle.write(' ',font=("Arial", 18, "normal"))
                turtle.pencolor("blue")
                turtle.fd(40)
            elif i == '+':
                turtle.write(' ',font=("Arial", 18, "normal"))
            else:
                drawDigit(eval(i))
    def main():
        turtle.setup(800, 350, 200, 200)
        turtle.penup()
        turtle.fd(-300)
        turtle.pensize(5)
        drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
        turtle.hideturtle()
        turtle.done()
    main()
    

    完全なコード:
    #SevenDigitsDraw.py
    import turtle, time
    def drawGap():  #       
        turtle.penup()
        turtle.fd(5)
    def drawLine(draw):     #       
        drawGap()
        turtle.pendown() if draw else turtle.penup()
        turtle.fd(40)
        drawGap()
        turtle.right(90)
    def drawDigit(d):   #           
        drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
        drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
        drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
        drawLine(True) if d in [0,2,6,8] else drawLine(False)
        turtle.left(90)
        drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
        drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
        drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
        turtle.left(180)
        turtle.penup()
        turtle.fd(20)
    def drawDate(date):
        turtle.pencolor("red")
        for i in date:
            if i == '-':
                turtle.write(' ',font=("Arial", 18, "normal"))
                turtle.pencolor("green")
                turtle.fd(40)
            elif i == '=':
                turtle.write(' ',font=("Arial", 18, "normal"))
                turtle.pencolor("blue")
                turtle.fd(40)
            elif i == '+':
                turtle.write(' ',font=("Arial", 18, "normal"))
            else:
                drawDigit(eval(i))
    def main():
        turtle.setup(800, 350, 200, 200)
        turtle.penup()
        turtle.fd(-350)
        turtle.pensize(5)
    #    drawDate('2018-10=10+')
        drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
        turtle.hideturtle()
        turtle.done()
    main()
    

    理解方法の考え方
  • モジュール化思考:モジュールインタフェースを確定し、パッケージ機能
  • 規則化思考:抽象過程は規則であり、コンピュータは自動的に
  • を実行する.
  • 簡略化:大機能を小機能の組み合わせに変え、分けて治める
  • 三、コード多重と関数再帰
    3.1コード多重化とモジュール化設計
  • コード多重化
    コードをリソースとして抽象化する
  • コードリソース化:プログラムコードは、計算を表す「リソース」です.
  • コード抽象化:関数などの方法を使用してコードにより高いレベルの定義を与える.
  • コード多重化:同じコードを必要に応じて繰り返し使用できます.

  • 関数とオブジェクトはコード多重化の2つの主要な形式です.
  • 関数:コード名をコードレベルで初歩的な抽象化した.
  • オブジェクト:属性とメソッド\.>と.\()、 の で を します.
  • オブジェクトの レベルは より い.

  • モジュール
    けて める
  • は、 またはオブジェクトパッケージによってプログラムをモジュールおよびモジュール の に する.
  • は、 プログラム、サブプログラム、およびサブプログラム の を に む.
  • : 、 、 の .

  • みっちゃくけつごう けつごう
  • :2つの の には が く、 して できない.
  • :2つの の が なく、 して することができる.
  • モジュール の な 、モジュール の やかな .


  • 3.2 の
    3.2.1
    で を び す .
    2つの な :
  • チェーン: プロセスには チェーンがあります.
  • ベース: を としない1つ のベースが する.

  • 3.2.2 の び し

  • +
  • は であり、
  • を するために が である.
  • では、 パラメータを で する
  • ベースとチェーンは、それぞれ コード
  • を する.
  • び しプロセス
    を するたびに、メモリに しいスペースが き、 をコピーします.

  • 3.2.3

  • sを して
    >>> s[::-1]
    
    def rvs(s):
        if s == "" :
            return s
        else :
            return rvs(s[1:])+s[0]
    
  • フィボナッチ
    F(n) = F(n-1) + F(n-2)
    def f(n):
        if n == 1 or n == 2 :
            return 1
        else :
            return f(n-1) + f(n-2)
    
  • ハノータ
    count = 0
    def hanoi(n, src, dst, mid):
        global count
        if n == 1 :
            print("{}:{}->{}".format(1,src,dst))
            count += 1
        else :
            hanoi(n-1, src, mid, dst)
            print("{}:{}->{}".format(n,src,dst))
            count += 1
            hanoi(n-1, mid, dst, src)
    
  • 、 :コッハ の
    Pythonでコハ を く
  • コハ の
  • #KochDrawV1.py
    import turtle
    def koch(size, n):
        if n == 0:
            turtle.fd(size)
        else:
            for angle in [0, 60, -120, 60]:
                turtle.left(angle)
                koch(size/3, n-1)
    def main():
        turtle.setup(600,600)
        turtle.penup()
        turtle.goto(-200, 100)
        turtle.pendown()
        turtle.pensize(2)
        level = 3 # 3     ,  
        koch(400, level)
        turtle.right(120)
        koch(400, level)
        turtle.right(120)
        koch(400, level) 
        turtle.hideturtle()
    main()
    

  • フラクタルジオメトリの を する
  • コハ の および
  • を する
  • コハ を くベースフレームの を
  • フラクタル
  • コントール 、シェルビンスキー 、ゲートスポンジ...
  • 、 、コッハ ...
  • の い ...