ホームページ  >  記事  >  バックエンド開発  >  Pythonシリーズ4

Pythonシリーズ4

巴扎黑
巴扎黑オリジナル
2017-06-23 16:29:471540ブラウズ

目次

  • 再帰アルゴリズム分析

  • バブルソート分析

  • デコレータ分析

1. 再帰

1. の定義recursion

再帰とも呼ばれる再帰とは、数学やコンピュータサイエンスにおいて、関数の定義に関数自体を使用する方法を指します。再帰という用語は、自己相似的な方法で物事を繰り返すプロセスを表すためにも使用されます。

F0 = 0F1 = 1

2. 再帰の原理

(1). 例:

 defth == 5= a1 += defth + 1== recursion(1, 0, 1(ret)

次の図は、層ごとのネストを表しています。緑色は、関数の戻り値がレイヤーごとに返されることを表します。実は再帰とは、関数の実行フローで再度この関数に入り、条件で値を返した後、先ほどの実行フローに従って階層ごとに再度戻り、最終的に戻り値を取得するという原理です。ただし、再帰するとき 2 つの注意点:

1. 彼の条件は、彼の再帰が特定の条件内の値を返すことができるようなものでなければなりません、そうでない場合は、コンピューターのリソースが枯渇するまで再帰が続きます (Python には、再帰の数に制限があります)デフォルトでは再帰)

2. 戻り値、内部の再帰関数は通常、特定の戻り値を与える必要があります。そうしないと、最後の再帰が返されたときに目的の値が得られません。

2. バブルソート

1. バブルソートの原理

バブルソートは単純な並べ替えアルゴリズムです。彼は並べ替えるシーケンスを繰り返し調べ、一度に 2 つの要素を比較し、順序が間違っている場合はそれらを交換します。

冒泡排序算法的运作如下:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

データ交換の原理

まず周辺変数を使って元の値を保存し、その後、ポイント・アドレス変換によってデータを交換します。注: temp が a を指し、次に a が b を指す場合、temp の点自体は変わりません。次の図に示すように、a は b を指しますが、temp は依然として a のアドレスを指すため、変化しません。 66

a = 66b = 88temp = a 
a = b 
b = temp

バブルソートの原理

2. バブルソートの例

 1 # -*- coding:utf-8 -*- 2 # zhou 3 # 2017/6/17 4 list = [0, 88, 99, 33, 22, 11, 1] 5 for j in range(1, len(list)): 6     for i in range(len(list) - j): 7         # 如果第一个数据大, 则交换数据, 否则, 不做改变 8         if list[i] > list[i + 1]: 9             temp = list[i]10             list[i] = list[i + 1]11             list[i + 1] = temp12 print(list)

1. デコレータ定義

デコレーターって何ですか?簡単に言うと、ソース関数コードを変更せずにコードを微妙に拡張して機能をさらに強化したものです。デコレーターは関数であり、他の関数の上にロードされる関数です。まずいくつかの概念を理解しましょう: 上から下へ、つまり、コードは最初に最初の test1 をメモリにロードし、次に割り当てます。 2 番目の test1 を保存するための新しいメモリ。

これは最初のtest1が890673481792に変更された箇所のはずです。

def test1():print('日本人.')print(id(test1))def test1():print('中国人.')print(id(test1))
test1()

执行结果:890673481656
890673481792中国人.

<2>. 変数としての関数

以下の結果から、関数名は実際には変数を渡すために使用できる変数であることがわかります。

関数に埋め込まれています

関数に埋め込まれています

ここでは 3 つの関数、test1、test2、test3、3 が定義されています。関数が変数として使用される場合は括弧を追加できません。関数名だけで構いません

(=<function test1 at 0x000000E2D403C7B8>
<function test1 at 0x000000E2D403C7B8>
1 がネストされており、2 が 1 にネストされています。その結果から、関数の実行フローも確認できる必要があります。

りー

  2. 装饰器原理

    (1). 装饰器的写法和使用

      <1>. 装饰器也是一个函数

      <2>. 使用装饰器的格式: 在一个函数前面加上:@装饰器的名字

    (2). 装饰器的原理

      <1>. 把test1函数当做一个变量传入outer中

          func = test1

      <2>. 把装饰器嵌套的一个函数inner赋值给test1

          test1 = inner

      <3>. 当执行test1函数的时候,就等于执行了inner函数,因此在最后的那个test1()命令其实执行的就是inner,因此先输出(你是哪国人)

      <4>. 按照执行流执行到func函数的时候,其实执行的就是原来的test1函数,因此接着输出(我是中国人),并把它的返回值返回给了ret

      <5>. 当原来的test1函数执行完了之后,继续执行inner里面的命令,因此输出了(Oh,hh, I love China.)

    (3). 装饰器的总结

      由上面的执行流可以看出来,其实装饰器把之前的函数当做参数传递进去,然后创建了另一个函数用来在原来的函数之前或者之后加上所需要的功能。

(=((

 

  3. 带参数的装饰器

    为了装饰器的高可用,一般都会采用下面的方式,也就是无论所用的函数是多少个参数,这个装饰器都可以使用

    Python内部会自动的分配他的参数。

# -*- coding:utf-8 -*-# zhou# 2017/6/17def outer(func):def inner(a, *args, **kwargs):print('你是哪国人?')
        ret = func(a, *args, **kwargs)print('Oh, hh, I love China.')return inner

@outerdef test1(a, *args, **kwargs):print('我是中国人.')

test1(1)

  3.  装饰器的嵌套

   <1>. 第一层装饰器的简化(outer装饰器)

    

    

    <2>. 第二层装饰器简化(outer0装饰器)

    

    <3>. 装饰器嵌套攻击额,我们可以发现一层装饰器其实就是把原函数嵌套进另一个函数中间,因此我们只需要一层一层的剥开嵌套就可以了。

# -*- coding:utf-8 -*-# zhou# 2017/6/17def outer0(func):def inner():print('Hello, Kitty.')
        ret = func()print('我是日本人.')return innerdef outer(func):def inner():print('你是哪国人?')
        ret = func()print('你呢?')return inner
@outer0
@outerdef test1():print('我是中国人.')

test1()

结果Hello, Kitty.
你是哪国人?
我是中国人.
你呢?
我是日本人.

 

 

  

 

以上がPythonシリーズ4の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。