1、基本语法

  语法:

    def func_name (arguments)  定义

      statements

      return x,y

    x,y=func_name(para)   调用

  作用域:

    

    可以给内置的函数赋值,赋值之前是函数,赋值之后是变量。查找的时候先看是否自定义过,没有的话,再找是否是内置的。

    

    将出错的print注释掉

    

    

    global x,定义了x为全局变量,一旦更改,所有的都更改了。——注意的是这里的global x是在函数里边定义的,照样可以修改,牵一发动全身。

    

    如果执行的程序不是__main__则不会执行下边的语句。去掉not,来用作测试的时候使用的。上边图片应该不用“not”的,以此来用测试所编写的函数。

    基本语法——参数

      arguments

      def f1(a,b=2,c=3):

        print a,b,c

      

      *arg和**kargs——跟无限多参数

      def f2(s,*args,**kargs):#args是不命名的参数,用元组表示,kargs是命名的参数

      print args

      def g(a,*args,**kargs):

        print a,args,kargs

      f2(1,2,3,4)

      g(1,2,3,4),g(1,2,3,b=5,c=6)

      

      二分法例子

        math库

          import math

          math.sqrt(20.0)

        自己写函数

          0——————————————————————20

          0————————————10

          0——————5

        2.5——5

          ……

          注意区分整数还是小数,故要把右边最大值设为max(x,1)。

  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. #copyRight by heibanke
  4.  
  5. def sqrt_func(x, small):
  6. #check input
  7. assert x>=0
  8. assert small>0
  9.  
  10. #init value
  11. loops = 1
  12. low = 0.0
  13. high = max(x,1)#非常关键,如果我们用high=x的时候,只能处理大于1的数,巧妙!
  14. while True and loops<=100:
  15. guess = (low+high)/2
  16. #2fen
  17. if abs(guess**2-x)<small:
  18. break
  19. elif guess**2 < x:
  20. low = guess
  21. else:
  22. high = guess
  23.  
  24. print low,high,guess
  25. loops+=1
  26.  
  27. return guess,loops
  28.  
  29. if __name__=="__main__":
  30.  
  31. small_value = 0.0000001
  32. test_data = [10.0, 23, 25, 0, 2, 0.25, 0.5]
  33. for x in test_data:
  34. y,loops=sqrt_func(x,small_value)
  35. assert abs(y**2-x)<small_value, "Error occur in "+str(x)
  36.  
  37. print "Pass"

运行结果:

  1. 0.0 5.0 5.0
  2. 2.5 5.0 2.5
  3. 2.5 3.75 3.75
  4. 3.125 3.75 3.125
  5. 3.125 3.4375 3.4375
  6. 3.125 3.28125 3.28125
  7. 3.125 3.203125 3.203125
  8. 3.125 3.1640625 3.1640625
  9. 3.14453125 3.1640625 3.14453125
  10. 3.154296875 3.1640625 3.154296875
  11. 3.1591796875 3.1640625 3.1591796875
  12. 3.16162109375 3.1640625 3.16162109375
  13. 3.16162109375 3.16284179688 3.16284179688
  14. 3.16223144531 3.16284179688 3.16223144531
  15. 3.16223144531 3.16253662109 3.16253662109
  16. 3.16223144531 3.1623840332 3.1623840332
  17. 3.16223144531 3.16230773926 3.16230773926
  18. 3.16226959229 3.16230773926 3.16226959229
  19. 3.16226959229 3.16228866577 3.16228866577
  20. 3.16226959229 3.16227912903 3.16227912903
  21. 3.16227436066 3.16227912903 3.16227436066
  22. 3.16227674484 3.16227912903 3.16227674484
  23. 3.16227674484 3.16227793694 3.16227793694
  24. 3.16227734089 3.16227793694 3.16227734089
  25. 3.16227763891 3.16227793694 3.16227763891
  26. 3.16227763891 3.16227778792 3.16227778792
  27. 3.16227763891 3.16227771342 3.16227771342
  28. 3.16227763891 3.16227767617 3.16227767617
  29. 0.0 11.5 11.5
  30. 0.0 5.75 5.75
  31. 2.875 5.75 2.875
  32. 4.3125 5.75 4.3125
  33. 4.3125 5.03125 5.03125
  34. 4.671875 5.03125 4.671875
  35. 4.671875 4.8515625 4.8515625
  36. 4.76171875 4.8515625 4.76171875
  37. 4.76171875 4.806640625 4.806640625
  38. 4.7841796875 4.806640625 4.7841796875
  39. 4.79541015625 4.806640625 4.79541015625
  40. 4.79541015625 4.80102539062 4.80102539062
  41. 4.79541015625 4.79821777344 4.79821777344
  42. 4.79541015625 4.79681396484 4.79681396484
  43. 4.79541015625 4.79611206055 4.79611206055
  44. 4.7957611084 4.79611206055 4.7957611084
  45. 4.7957611084 4.79593658447 4.79593658447
  46. 4.7957611084 4.79584884644 4.79584884644
  47. 4.79580497742 4.79584884644 4.79580497742
  48. 4.79582691193 4.79584884644 4.79582691193
  49. 4.79582691193 4.79583787918 4.79583787918
  50. 4.79582691193 4.79583239555 4.79583239555
  51. 4.79582965374 4.79583239555 4.79582965374
  52. 4.79583102465 4.79583239555 4.79583102465
  53. 4.79583102465 4.7958317101 4.7958317101
  54. 4.79583136737 4.7958317101 4.79583136737
  55. 4.79583136737 4.79583153874 4.79583153874
  56. 4.79583145306 4.79583153874 4.79583145306
  57. 4.7958314959 4.79583153874 4.7958314959
  58. 0.0 12.5 12.5
  59. 0.0 6.25 6.25
  60. 3.125 6.25 3.125
  61. 4.6875 6.25 4.6875
  62. 4.6875 5.46875 5.46875
  63. 4.6875 5.078125 5.078125
  64. 4.8828125 5.078125 4.8828125
  65. 4.98046875 5.078125 4.98046875
  66. 4.98046875 5.029296875 5.029296875
  67. 4.98046875 5.0048828125 5.0048828125
  68. 4.99267578125 5.0048828125 4.99267578125
  69. 4.99877929688 5.0048828125 4.99877929688
  70. 4.99877929688 5.00183105469 5.00183105469
  71. 4.99877929688 5.00030517578 5.00030517578
  72. 4.99954223633 5.00030517578 4.99954223633
  73. 4.99992370605 5.00030517578 4.99992370605
  74. 4.99992370605 5.00011444092 5.00011444092
  75. 4.99992370605 5.00001907349 5.00001907349
  76. 4.99997138977 5.00001907349 4.99997138977
  77. 4.99999523163 5.00001907349 4.99999523163
  78. 4.99999523163 5.00000715256 5.00000715256
  79. 4.99999523163 5.00000119209 5.00000119209
  80. 4.99999821186 5.00000119209 4.99999821186
  81. 4.99999970198 5.00000119209 4.99999970198
  82. 4.99999970198 5.00000044703 5.00000044703
  83. 4.99999970198 5.00000007451 5.00000007451
  84. 4.99999988824 5.00000007451 4.99999988824
  85. 4.99999998137 5.00000007451 4.99999998137
  86. 4.99999998137 5.00000002794 5.00000002794
  87. 0.0 0.5 0.5
  88. 0.0 0.25 0.25
  89. 0.0 0.125 0.125
  90. 0.0 0.0625 0.0625
  91. 0.0 0.03125 0.03125
  92. 0.0 0.015625 0.015625
  93. 0.0 0.0078125 0.0078125
  94. 0.0 0.00390625 0.00390625
  95. 0.0 0.001953125 0.001953125
  96. 0.0 0.0009765625 0.0009765625
  97. 0.0 0.00048828125 0.00048828125
  98. 1.0 2 1.0
  99. 1.0 1.5 1.5
  100. 1.25 1.5 1.25
  101. 1.375 1.5 1.375
  102. 1.375 1.4375 1.4375
  103. 1.40625 1.4375 1.40625
  104. 1.40625 1.421875 1.421875
  105. 1.4140625 1.421875 1.4140625
  106. 1.4140625 1.41796875 1.41796875
  107. 1.4140625 1.416015625 1.416015625
  108. 1.4140625 1.4150390625 1.4150390625
  109. 1.4140625 1.41455078125 1.41455078125
  110. 1.4140625 1.41430664062 1.41430664062
  111. 1.41418457031 1.41430664062 1.41418457031
  112. 1.41418457031 1.41424560547 1.41424560547
  113. 1.41418457031 1.41421508789 1.41421508789
  114. 1.4141998291 1.41421508789 1.4141998291
  115. 1.4142074585 1.41421508789 1.4142074585
  116. 1.41421127319 1.41421508789 1.41421127319
  117. 1.41421318054 1.41421508789 1.41421318054
  118. 1.41421318054 1.41421413422 1.41421413422
  119. 1.41421318054 1.41421365738 1.41421365738
  120. 1.41421341896 1.41421365738 1.41421341896
  121. 0.5 1 0.5
  122. 0.5 0.75 0.75
  123. 0.625 0.75 0.625
  124. 0.6875 0.75 0.6875
  125. 0.6875 0.71875 0.71875
  126. 0.703125 0.71875 0.703125
  127. 0.703125 0.7109375 0.7109375
  128. 0.70703125 0.7109375 0.70703125
  129. 0.70703125 0.708984375 0.708984375
  130. 0.70703125 0.7080078125 0.7080078125
  131. 0.70703125 0.70751953125 0.70751953125
  132. 0.70703125 0.707275390625 0.707275390625
  133. 0.70703125 0.707153320312 0.707153320312
  134. 0.707092285156 0.707153320312 0.707092285156
  135. 0.707092285156 0.707122802734 0.707122802734
  136. 0.707092285156 0.707107543945 0.707107543945
  137. 0.707099914551 0.707107543945 0.707099914551
  138. 0.707103729248 0.707107543945 0.707103729248
  139. 0.707105636597 0.707107543945 0.707105636597
  140. 0.707106590271 0.707107543945 0.707106590271
  141. 0.707106590271 0.707107067108 0.707107067108
  142. Pass

        牛顿法

          同样是求20的平方根,利用牛顿法求,迭代的次数要少。

  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. #copyRight by heibanke
  4.  
  5. def sqrt_func(x, small):
  6. #check input
  7. assert x>=0
  8. assert small>0, str(small)
  9.  
  10. #init value
  11. loops = 1
  12. low = 0.0
  13. high = max(x,1)
  14. while True and loops<=100:
  15. guess = (low+high)/2
  16. #2fen
  17. if abs(guess**2-x)<small:
  18. break
  19. elif guess**2 < x:
  20. low = guess
  21. else:
  22. high = guess
  23.  
  24. #print low,high,guess
  25. loops+=1
  26.  
  27. return guess,loops
  28.  
  29. def sqrt_nd(x,small):
  30. #check input
  31. assert x>=0
  32. assert small>0, str(small)
  33.  
  34. #init value
  35. loops = 1
  36. low = 0.0
  37. high = max(x,1)
  38. guess = (low+high)/2
  39. while abs(guess**2-x)>small and loops<=100:
  40. guess = guess - (guess**2-x)/2/guess
  41. loops+=1
  42. return guess,loops
  43.  
  44. if __name__=="__main__":
  45. import math
  46. small_value = 0.0000001
  47. test_data = [10.0, 23, 25, 0, 2, 0.25, 0.5, 123456789,4]
  48.  
  49. print u"二分法结果:"
  50. for x in test_data:
  51. y,loops=sqrt_func(x,small_value)
  52. assert abs(y**2-x)<small_value, u"二分法出错在"+str(x)
  53. print u"%d 次迭代的结果是 %f"%(loops,y)
  54.  
  55. print u"\n牛顿法结果:"
  56. for x in test_data:
  57. y,loops=sqrt_nd(x,small_value)
  58. assert abs(y**2-x)<small_value, "牛顿法出错在"+str(x)
  59. print u"%d 次迭代的结果是 %f"%(loops,y)
  60. print "Pass"

    迭代次数比较:

2、函数式编程

  函数式编程时一种编程方法。以前的编程方法都是结构式的,第一步、第二步、第三步……,而函数式编程把函数当做变量来组合。

  编程方法:

    不同语言的不同点:

      语法,运行环境和库的使用等

    不同语言的相同点:

      语言层面:编程方法和模式。

        哪些场景适合什么方法和模式?

      底层:数据结构和算法

        怎么存储最高效,怎么折腾数据最快。概率论,统计学,数学。

      高层:各种应用所需要的原理

        比如机器学习、网络,爬虫、信号处理

    Python里边一切皆对象,则函数也是一个对象。

    可直接赋给变量: my_sum=sum

    有属性和方法:__call__   (决定是否可以被调用)

    __name__  (其根本的名字)

      

      高阶函数:

        def f1(f,a,b)  把函数当参数的函数就可以叫做高阶函数

          pirnt f(a,b)

        

        如果式子发生变化,结构式编程还需要再写函数,而函数式编程不需要,只需把写好的进行组合一下就可以了。

        自带的高阶函数:

          filter     过滤,把字符串中只有数字或者数字的过滤出来

          

          map 映射,通过map把list里边都算一遍

          

          reduce  归纳演绎

          

          求1+2+3……+100=?

          统计单词词频

            很多文章,要统计他们的十大最热门词汇

              (1)文本处理,统计每个文章的词汇

              (2)合并不同文章的词汇

              (3)排序,输出

            github------------------wordsworth库

          函数式编程——lambda

            用法:

              lower=(lambda x,y:x if x<y else y)

              lambda后边的x,y是参数,冒号后边是返回值,如果x<y则返回x,否则返回y。返回值是一个函数。我们可以直接调用lower,如lower(2,3),返回的就是2。

              

              为什么可以使用各种参数呢?因为Python是动态类型,都是对操作符的重载,如果是c++的话,要写各种操作符的重载函数。

              函数式编程:

                lst=random.randint(-50,50)

                lst2=filter(lamdba n:n>0,lst)

                lst3=map(lamdba x:x*2,lst)

                c=sorted(lst,cmp=lamdba x,y:x-y)

                sorted第一个参数是要排序的列表,第二个参数以前我们用的是关键字key,这次我们用一个函数表示,一般我们用lamdba函数,x-y如果返回的

                是一个正数,在sorted里边的意思是这个数尽量往后排。所以它是一个递增的。还有一个排序的方式是用list的一个函数——sort函数

                  lst.sort(lamdba x,y:1 if x>y else -1)

                  sort函数参数就是一个lamdba的函数。

                  

    

                  上边并没有完成我们预期的。说明讲课的老师这个地方讲错了,如果要实现想要的结果,应该这样写:

                  

                  然后用join()进行输出,join()函数的意思是

                  join()函数

                  语法:  'sep'.join(seq)

                  参数说明
                    sep:分隔符。可以为空
                    seq:要连接的元素序列、字符串、元组、字典
                    上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串

                    返回值:返回一个以分隔符sep连接各个元素后生成的字符串

  函数式编程——函数返回

    内部函数:

      def calc2(s):

        def f_add(a,b):return a+b

        def f_mul(a,b):return a*b

        def f_sub(a,b):return a-b

        if s==’+’:

          return f_add

        elif s==’*’:

          return f_mul

        elif s==’-’:

          return f_sub

        else:

          assert False, ’error’

    内部函数无法被外部调用的。

    上边的程序可以改成lambda的形式,因为内部函数我无需知道具体的函数名字,而是直接返回一个值就可以了。

      def calc2(s):

        if s=='+':

          return lambda a,b:a+b

       elif s=='*':

        return lambda a,b:a*b

       elif s=='-':

          return lambda a,b:a-b

        else :

          assert False,'error:operator not defined'

        如果还想再简单点,可以用字典这么写:

          calc_dict={

            ‘+’:lambda a,b:a+b,

            ‘*’:lambda a,b:a*b,

            ‘-’:lambda a,b:a-b,

          }

          调用的时候:calc_dict[‘+’](1,2)

    函数式编程——就是把函数当做数据进行处理。

3、回调

  在c和c++中回调函数一般用的是函数指针。

  函数作为参数,调用完之后还回来。

    def test (calback):

      print’test func begin’

      callback()

      print’test func end’

    def cb1():

      print’callback 1’

    def cb2():

      print’callback 2’

    test(cb1)

    test(cb2)

    经常用的地方:按钮的地方用回调函数。

4、闭包和装饰器——函数作为返回值

  闭包closure:

    绑定外部变量——让它自己维护自己的信息

    def pow_x(x):

      def echo(value):

        return value**x

      return echo

      返回的是echo这个函数

    lst=[pow_x(2),pow_x(3),pow_x(4)]  这里的2,3,4是参数x的值

    for p in lst:

      print p(2)   这里的2是参数value的值

      

    什么是闭包:已经绑定了外部变量的内部函数

      上边的lst里边都是闭包。

    特点:

      1、嵌套函数

      2、内部函数用到了外部变量(通常是外部函数的参数)

      3、外部函数返回内部函数

      

      如果在里边把x的值改为2,则它永远都是2次方。

  内部函数:

    1、内部函数不能‘改变’外部变量,即不能产生一个和外部变量一样的东西。即局部变量和外部变量是两个变量,不干涉。

    2、内部函数用到了外部变量为list或其他可变的,则可以从外部或内部改变值,并且是外部没有引用也不会回收。

    举例:

      def pow_y(x):

        def echo(value):

          #x[0]=x[0]*2如果不注释,意思是先访问x[0],然后在赋给值,这不会产生局部变量,依然是一个外部变量。只是对外部变量修改了。

          #x=[2,2] 如果不注释,意思是生成了一个局部变量。

          return value**x[0],value**x[1]

        return echo

        

      origin=[0,0]#坐标系统原点

      legal_x=[0,50] #x轴的合法坐标

      legal_y=[0,50] #y轴的合法坐标

      def create(pos):

       def player(direction ,step):

      #这里应该判断dirction和step的合法性

       #然后还要对新生成的x,y的合法性做判断

      new_x=pos[0]+direction[0]+step

      new_y=pos[1]+direction[1]+step

       pos[0]=new_x

      pos[1]=new_y

       return pos

      return player

      player1=create(origin[:])

      #创建棋子1

      print player1([1,0],10)#向x轴方向移动10步

      print player1([0,1],20)#向y轴方向移动20步

      print player1([-1,0],10)#向y轴负方向移动10步

      print 'origin is ',origin

      player2=create(origin[:])

      #创建棋子2

      print player2([-1,0],10)

      print player2([1,1],20)

      print player2([1,0],10)

      这是闭包的一个应用,每个player各自维护自己的数据。

  装饰器——无嵌套

    装饰:在原有函数的基础上加一些功能。函数作为返回值,函数作为参数的一种应用。和设计模式里边的装饰器有些类似。

    举例:

      def decorator(f):

      print 'before'+ f.__name__+ 'called'

       return f

      def myfunc1():

      print 'myfunc1() called'

      #显示说decorator是一个装饰器,把myfunc2()装饰一下

      @decorator

      def myfunc2():

       print 'myfunc2 called'

      if __name__=='__main__':

      pass

      decorator(myfunc1)()

      myfunc2()

      上边这两句语句一样的作用。

      

      从运行结果上看,beformyfunc2called 先输出的,为什么?

      因为用了@decorator之后,导入的时候就会被运行。

      三个问题:

        1、@装饰器会提前执行

        2、目标函数无法带参数

        3、目标函数调用后无法插入代码

    装饰器——2层嵌套

      函数带参数

        def time_cost(f):

          def _f(*arg,**kwarg):

            start=time.clock()

            f(*arg,**kwarg)

            end=time.clock()

            print end-start

          return _f

        @time_cost

        def list_comp(length):

          return [(x,y) for x in range(length) for y in range(length) if x*y>25]

          问题1,装饰被提前执行也不会输出值,因为返回的是一个内部的函数,而这个函数并没有被执行,所以问题1解决了。

          问题2,实际上目标函数已经带了参数,所以,问题2解决了

          问题3,想插入多少代码就可以插入多少代码

           

          这里用的是一个参数的。

          

            这个用的多参数的。从上边的两个例子看出,我们直接运行的时候看不出来是用了装饰器的,只有看源码的时候才发现原来是用来装饰器。这里装饰器的

            作用是输出执行时间。而且是用了两层嵌套,所以即使提前执行,也不会输出结果。

            虽然两层结构实现了我们的需求,但是现在又有了一个问题:

            4、装饰器无法带参数

            加入我们现在有需求,希望求出最好的运行时间和平均运行时间,这个代码应该加在那里?应该加在装饰器上。

          装饰器——三层嵌套

            装饰器带参数:

              当我们会写两层的装饰器之后,再包装一层,然后返回就可以了。

            

  1. import time
  2. import random
  3.  
  4. def time_cost(timef):
  5. def decorator(f):
  6. def _f(*arg,**kwarg):
  7. #可以有多个参数
  8. start=time.clock()
  9. a=f(*arg,**kwarg)
  10. end=time.clock()
  11. print f.__name__,'run cost time is',end-start
  12. return a
  13. return _f
  14. return decorator
  15.  
  16. @time_cost(time.clock)
  17. def list_comp(length):
  18. return [(x,y)for x in range(length) for y in range(length) if x*y>25]
  19.  
  20. @time_cost(time.clock)
  21. def for_loop(length):
  22. a=[]
  23. for x in range(0,length):
  24. for y in range(0,length):
  25. if x*y>25:
  26. a.append((x,y))
  27. return a
  28.  
  29. if __name__=='__main__':
  30.  
  31. a=list_comp(1000)
  32. print len(a)
  33. b=for_loop(1000)
  34. print len(b)

            

            装饰器的参数是在@后边的函数中带着。

            闭包就是这样被映射成装饰器的。

        装饰器——装饰模式

          设计模式:

          给小明穿衣服

          工作时穿工作服,西装,皮鞋,裤子

          运动时穿运动服,T恤,运动鞋,裤子,帽子

          把这种搭配做成套装可以直接给另一个人小红穿上

          这种套装还可以根据日期随意更换,比如周1-4穿工作服,但周2的工作服不穿西装穿T恤。周5-7穿运动装,但周五不戴帽子。

          下面实现部分功能

  1. #coding:utf-8
  2.  
  3. def printInfo(info):
  4. print unicode(info,'utf-8')
  5.  
  6. def wearTrouser(f):
  7. def _f(*arg,**kwarg):
  8. printInfo('裤子')
  9. return f(*arg,**kwarg)
  10. return _f
  11.  
  12. def wearSuit(f):
  13. def _f(*arg,**kwarg):
  14. printInfo('西服')
  15. return f(*arg,**kwarg)
  16. return _f
  17.  
  18. def wearTShirt(f):
  19. def _f(*arg,**kwarg):
  20. printInfo('T恤')
  21. return f(*arg,**kwarg)
  22. return _f
  23.  
  24. def wearCap(f):
  25. def _f(*arg,**kwarg):
  26. printInfo('帽子')
  27. return f(*arg,**kwarg)
  28. return _f
  29.  
  30. def wearSportShoes(f):
  31. def _f(*arg,**kwarg):
  32. printInfo('运动鞋')
  33. return f(*arg,**kwarg)
  34. return _f
  35.  
  36. def wearLeatherShoes(f):
  37. def _f(*arg,**kwarg):
  38. printInfo('皮鞋')
  39. return f(*arg,**kwarg)
  40. return _f
  41.  
  42. #不断的给他穿衣服
  43. def wearedPerson(person,cloths):
  44. w=person
  45. #理解此处的代码去看闭包
  46. for f in cloths:
  47. w=f(w)
  48. return w
  49.  
  50. #@wearTrouser
  51. #@wearTShirt
  52. #加上装饰器之后,他就穿上裤子和T恤了
  53. def person (name):
  54. printInfo('装扮好的%s' %name)
  55.  
  56. person('小明')
  57. print"---------------------"
  58. #商务套装
  59. business_wear=[wearLeatherShoes,wearSuit,wearTrouser]
  60. #运动套装
  61. sports_wear=[wearSportShoes,wearCap,wearTShirt,wearTrouser]
  62. weared_business_person=wearedPerson(person,business_wear)
  63. weared_sport_person=wearedPerson(person,sports_wear)
  64. weared_business_person('小明')
  65. print '-------------------'
  66. weared_sport_person('小红')

          

          装饰器这个地方理解起来需要时间,应该多看看。

5、递归

  函数调用自己

    裴波那契数列(兔子生兔子的问题)

    

    字符串取反(可以不用递归,这里用递归的方式演示):

    

    二分法也是一个递归调用的例子

  1. def sqrt_func_dg(x,small,low,high):
  2. guess = float(low+high)/2
  3.  
  4. if abs(guess**2-x)<small:
  5. return guess
  6. elif guess**2<x:
  7. return sqrt_func_dg(x,small,guess,high)
  8. else:
  9. return sqrt_func_dg(x,small,low,guess)

    递归——编程方法

      快速排序

      具体的可以参考数据结构的辅导书,此处不再赘述。

6、生成器和yield

  Iterable,Iterator,Generator

  可迭代的,迭代器,生成器

  其中,迭代器是可迭代的一个子集。

  什么是可迭代的?

  凡是可以写到for循环后边的都是可迭代的。如字典、列表等。

  什么是生成器?

  生成器是生成一个迭代器的东西。

  迭代器是一个对象,生成器是一个函数或表达式。

  如何把函数变成一个生成器,就是通过yield语句。

  如何把表达式变成一个生成器,元组的推导式解析式。

  next的用法:

    还是用斐波那契的例子。因为上一次我们用的是迭代,所以实际运行时间会长。

    

      包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。

      这是Python里边的惰性计算,只有用到的时候才算出来值,不用的不是后不计算。而且前边就算出来的值都被保存下来了。可以继续利用。

      xrange函数与range函数的区别:

      1、range()返回的是整个list。

      2、xrange()返回的是一个xrange object,且这个对象是一个iterable.

      3、两者都是for循环

      4、xrange()占用更少的内存空间,因为循环时xrange()只生成当前的元素,不像range()一开始就生成完整的list。

      运行时间的比较:

      

      

      下边的形式是错误的,需要注意:

      

      

      这样写,那个函数实际上每次都是从新调用。所以输出结果都是1。

      迭代器,当往后算的时候,1-------100这个方向前进的时候是可以用迭代器进行计算,前边的它会保存下,而100--------1这个方向前进的时候,迭代器就用不上了。

      send用法:

  1. def func():
  2. input=[]
  3. while True:
  4. a=(yield)
  5. your statement
  6. input.append(a)

    好处:生成器自己维护环境变量。

    相对于next,send用的还是比较少一些。

    一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会

    自动调用next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。

    看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

    yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清

    晰。

    推断:迭代器就是应该返回给一个变量来接收,这就成了迭代器。

    关于yield的具体理解还需网上资源查找学习,比如这篇:

    http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

 

    我们看一下库里还有哪些迭代器:

      itertools

        horses=[1,2,3,4]

        races=itertools.permutations(horses)

        #itertools返回的结果是一个迭代器,这个迭代器会把1,2,3,4的所有组合求出来。举个例子,当你需要穷举的时候。

        A=itertool.product([1,2],[3,4])

        product返回的是一个迭代器,这个迭代器有两个列表,也将会求出所有的组合,如1,3 1,4 2,3 2,4

        B=itertool.repeat([1,2],4)

        重复多少遍。

        C=itertools.chain(races,a,b)

        把这几个迭代器链起来。

        

pyhton函数——黑板客老师课程学习的更多相关文章

  1. python类——黑板客老师课程学习

    1.基本语法 class class_name(base_class):  base_class是它继承的父类 class_var def methods(self,args): statements ...

  2. python爬虫——黑板客老师课程学习

    程序: 目标url 内容提取 表现形式 为什么: 大数据——数据膨胀,信息太多了,不知道哪些信息适合你,例如谷歌搜索引擎. 垂直行业搜索——某一个行业的搜索,与搜索引擎最大的区别:搜索引擎是告诉你哪些 ...

  3. 线性代数和numpy——黑板客老师课程学习

    一.代数是什么 代数->数的抽象表示->向量空间(线性空间) 线代->线性代数 关系: 向量空间之间和内部转换是通过线性变换. 实数——一维空间的点 复数——二维空间的点 如果两个向 ...

  4. python计算机视觉——黑板客老师课程学习

    机器学习的一个应用方向,是如何让机器去理解图像.包括对图像里物体的识别,跟踪和测量. 能做什么——无人驾驶汽车.人脸识别.车牌识别手势识别(游戏方向) PIL静态的库 OpenCV 动态的库 impo ...

  5. python语句表达式——黑板客老师课程学习

    1.赋值 多重赋值: a,b=1,2 a,b=’beijing’,’sh’ a,b=’bj’ a,b=(1,2) a,b=[1,2] …… 2.输入输出 输入: raw_input()   原始输入 ...

  6. python变量——黑板客老师课程学习

    1.和C++.Java的区别: 动态类型:不需要声明a的类型. a=34 type(a) <type  ‘int’> 一切皆对象: 4 2.数字: 自动转换类型:a=34  A=3.14 ...

  7. python画图—黑板客老师课程学习

    1.介绍 把每个图都看作一个对象,图中的每一个部分也是对象.——所有的一切都是对象. 工具——ipython notebook 是python里边用的最多的2D&3D的会图库,开源免费库,使用 ...

  8. "做中学"之“极客时间”课程学习指导

    目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时 ...

  9. 传智播客.NET视频学习课件

    传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...

随机推荐

  1. mm/swap

    /* *  linux/mm/swap.c * *  Copyright (C) 1991, 1992  Linus Torvalds */ /* * This file should contain ...

  2. Codeforces 733F Drivers Dissatisfaction

    题意:有n个点,m条边,每条边有不满意度w[i],以及减小一个不满意度代价c[i],问给你s元用来减少代价,找到一个总不满意度最小的生成树,保证有解.(减少后的不满意度可以为负数)思路:显然所有的钱都 ...

  3. Docker 安装及命令

    CentOS 安装 通过脚本安装:curl -sSL https://get.docker.com/ | sh通过yum安装:yum install docker-engine============ ...

  4. asp 实现域名转向

    <% host=lcase(request.servervariables("HTTP_HOST")) select CASE host CASE "aa.cn&q ...

  5. 初识C++的类

    //Sales_item.h#ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include<string&g ...

  6. 显示hello

    The modern user interface is constructed from visual objects of various sorts. Depending on the oper ...

  7. PHP取当前年、月、日开始时间戳和下年、月、日开始时间戳函数

    1.当前年的时间戳 2.当前月的时间戳 3.当前日的时间戳 4.明年的开始时间戳 5.下月的开始时间戳 6.明日的开始时间戳 7.当前时间戳 函数代码: /** * 获取时间戳 * $Ymd = Y ...

  8. Linux定时任务系统 Cron

    运行计划任务时:service crond restart提示:crond: unrecognized service安装计划任务:yum -y install vixie-cron 另外附计划任务的 ...

  9. SG函数闲扯(转)

    http://ydcydcy1.blog.163.com/blog/static/216089040201342412717440/ 没来得及看.

  10. (String) 压缩String

    e.g.  aaabbcccc    返回a3b2c4 public static String compressString(String str) { StringBuilder sb=new S ...