>  기사  >  백엔드 개발  >  파이썬 시리즈 4

파이썬 시리즈 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)

다음 그림은 전체 함수의 실행 과정을 보여줍니다. 녹색은 함수의 반환 값이 계층별로 반환됨을 나타냅니다. 실제로 재귀는 함수의 실행 흐름을 통해 다시 이 함수에 들어간 후, 조건을 통해 값을 반환한 후, 방금 실행 흐름에 따라 레이어별로 다시 반환을 하여 최종적으로 반환 값을 얻는 원리입니다. 하지만 반복할 때 주의할 점 두 가지:

 1. 그의 조건은 그의 재귀가 특정 조건 내에서 값을 반환할 수 있어야 하며, 그렇지 않으면 컴퓨터 리소스가 고갈될 때까지 계속 반복됩니다(Python에는 개수에 제한이 있습니다). 재귀는 기본적으로)

  2. 반환 값, 내부의 재귀 함수는 일반적으로 특정 반환 값을 제공해야 합니다. 그렇지 않으면 마지막 재귀가 반환될 때 원하는 값을 얻을 수 없습니다.

2. 버블 정렬

1. 버블 정렬 원리

버블 정렬은 간단한 정렬 알고리즘입니다. 그는 정렬할 순서를 반복적으로 살펴보며 한 번에 두 요소를 비교하고 순서가 잘못된 경우 교체합니다.

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

  데이터 교환의 원리

  주변변수를 이용하여 원래 값을 먼저 저장한 후 Point-to-Address 변환을 통해 데이터를 교환합니다. 참고: 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)

3. 1. 데코레이터 정의

  데코레이터란? 간단히 말해서 기능을 더욱 향상시키기 위해 소스 함수 코드를 변경하지 않고 코드를 미묘하게 확장한 것입니다. 데코레이터는 함수, 즉 다른 함수 위에 로드되는 함수입니다. 먼저 몇 가지 개념을 이해해 보겠습니다.

 위에서 아래로, 즉 코드는 먼저 첫 번째 test1을 메모리에 로드한 다음 할당합니다. 두 번째 테스트를 저장할 새 메모리1.

   이것이 첫 번째 test1이 890673481792로 변경된 지점이어야 합니다.

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

执行结果:890673481656
890673481792中国人.

  <2>. 변수로서의 함수

    다음 결과를 보면 함수명이 실제로 변수를 전달할 수 있는 변수임을 알 수 있습니다. functions

함수에 배정 된

함수에 배정 됨 세 가지 함수가 여기에 정의되어 있습니다, test1, test2, test3, 3, 함수를 변수로 사용하면 괄호를 추가 할 수 없습니다. 함수 이름만 있으면 됩니다

(=<function test1 at 0x000000E2D403C7B8>
<function test1 at 0x000000E2D403C7B8>

그 안에 1개가 중첩되어 있고, 1에 2개가 중첩되어 있습니다. 그 결과에서 함수의 실행 흐름도 볼 수 있어야 합니다.

rreee

  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.
你是哪国人?
我是中国人.
你呢?
我是日本人.

 

 

  

 

위 내용은 파이썬 시리즈 4의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.