ホームページ >バックエンド開発 >Python チュートリアル >Pythonシリーズ4
再帰アルゴリズム分析
バブルソート分析
デコレータ分析
再帰とも呼ばれる再帰とは、数学やコンピュータサイエンスにおいて、関数の定義に関数自体を使用する方法を指します。再帰という用語は、自己相似的な方法で物事を繰り返すプロセスを表すためにも使用されます。
F0 = 0F1 = 1
defth == 5= a1 += defth + 1== recursion(1, 0, 1(ret)
次の図は、層ごとのネストを表しています。緑色は、関数の戻り値がレイヤーごとに返されることを表します。実は再帰とは、関数の実行フローで再度この関数に入り、条件で値を返した後、先ほどの実行フローに従って階層ごとに再度戻り、最終的に戻り値を取得するという原理です。ただし、再帰するとき 2 つの注意点:
1. 彼の条件は、彼の再帰が特定の条件内の値を返すことができるようなものでなければなりません、そうでない場合は、コンピューターのリソースが枯渇するまで再帰が続きます (Python には、再帰の数に制限があります)デフォルトでは再帰)
2. 戻り値、内部の再帰関数は通常、特定の戻り値を与える必要があります。そうしないと、最後の再帰が返されたときに目的の値が得られません。
バブルソートは単純な並べ替えアルゴリズムです。彼は並べ替えるシーケンスを繰り返し調べ、一度に 2 つの要素を比較し、順序が間違っている場合はそれらを交換します。
冒泡排序算法的运作如下: 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
まず周辺変数を使って元の値を保存し、その後、ポイント・アドレス変換によってデータを交換します。注: temp が a を指し、次に a が b を指す場合、temp の点自体は変わりません。次の図に示すように、a は b を指しますが、temp は依然として a のアドレスを指すため、変化しません。 66
a = 66b = 88temp = a a = b b = temp
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)
これは最初のtest1が890673481792に変更された箇所のはずです。
def test1():print('日本人.')print(id(test1))def test1():print('中国人.')print(id(test1)) test1() 执行结果:890673481656 890673481792中国人.
以下の結果から、関数名は実際には変数を渡すために使用できる変数であることがわかります。
ここでは 3 つの関数、test1、test2、test3、3 が定義されています。関数が変数として使用される場合は括弧を追加できません。関数名だけで構いません
(=<function test1 at 0x000000E2D403C7B8>
<function test1 at 0x000000E2D403C7B8>
1 がネストされており、2 が 1 にネストされています。その結果から、関数の実行フローも確認できる必要があります。
<1>. 装饰器也是一个函数
<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.)
由上面的执行流可以看出来,其实装饰器把之前的函数当做参数传递进去,然后创建了另一个函数用来在原来的函数之前或者之后加上所需要的功能。
(=((
为了装饰器的高可用,一般都会采用下面的方式,也就是无论所用的函数是多少个参数,这个装饰器都可以使用
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)
# -*- 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 サイトの他の関連記事を参照してください。