• python学习day4


    目录

    一、迭代器

    二、yield生成器

    三、装饰器

    四、递归

    五、基础算法


    迭代器

      1 #1.在不使用for循环的情况下
      2 li = [11 ,22, 33, 44]
      3 #count = len(li)
      4 #start = 0
      5 #while count > start:
      6 #    print(li[start])
      7 #    start += 1
      8 #while 使用索引进行操作,所有的其他预言,都支持while
      9 
     10 #for item in li:
     11 #    print(item)
     12 #for循环本质
     13 #1.创建一个特殊的东西(迭代器),获取到一个具有Next方法的对象
     14 #2.根据这个东西去操作列表Li中的内容
     15 
     16 #benzhi
     17 #obj = iter(li)
     18 #print(obj.__next__())
     19 #迭代器 = iter(li)
     20 #执行迭代器返回一个对象,对象是含有next方法
     21 
     22 #使用本质,创建一个for循环
     23 obj = iter(li)
     24 while True:
     25     try:
     26         item = obj.__next__()
     27         print(item)
     28     except Exception:
     29         pass
     30 
     31 # 迭代器
     32 #
     33 # 循环
     34 # 1.while
     35 # 	索引,下标取数据,随意取值
     36 # 2.for
     37 # 	一,执行迭代器,获取了一个含有next方法的对象
     38 # 	二,执行对象的next方法(一直执行)
     39 #
     40 # ====引出,迭代器
     41 # 执行iter,获取一个具有next方法的对象
     42 # -->顺序拿
    迭代器

    生成器

      1 生成器
      2 # 
      3 # python2.7
      4 # 	range,xrange
      5 # 	
      6 # python3
      7 # 	range=pyth2.7中的xrange
      8 # 	
      9 # 	
     10 # 例:
     11 # range(10)--->立马在内存里创建0-9
     12 # xrange(10)--->内存里面没有数字
     13 # for i in xrange(10):
     14 # 	第一次循环内存创建0
     15 # 	i = 0
     16 # 	第二次循环内存创建1
     17 # 	i = 1
     18 # 	.
     19 # 	.
     20 # 	.
     21 # 	print i
    生成器

    xrange,redis>keys,         f句柄

    生成器,内存消耗的问题就解决了

    生成器最重要的东西yield

      1 #函数
      2 # def show():
      3 #     return 123
      4 #
      5 # i = show()
      6 # print(i)
      7 
      8 #生成器
      9 # def show():
     10 #     yield 123
     11 #
     12 # i = show()
     13 # print(i)    #<generator object show at 0x000001BA338658E0>
     14 #回想,文件操作 100G文件,
     15 #1、f=open('') =>File对象
     16 #for i in f: ==>自动触发f对象的__iter__方法
    
    
     17 # f = open('f1.log',"r")
     18 # for line in f:
     19 #     print(line)
     20 #一行一行区数据
     21 #文件操作:
     22 #   1、必须迭代执行生成器
     23 #   2、yield冻结状态(记住上次执行的位置)
     24 
     25 
     26 #模拟大文件操作
     27 def show():
     28     yield 'line1'
     29     yield 'line2'
     30     yield 'line3'
     31 
     32 #本质
     33 my_f = show()
     34 for line in my_f:#特殊的东西
     35     print(line)
     36 #输出结果
     37 '''
     38 line1
     39 line2
     40 line3
     41 '''
     42 #总结:1.函数如果有yield,函数返回值特殊的东西(必须和for一起使用)
     43 #2、for,函数返回的特殊东西,函数内部执行代码,如果遇到yield关键字
     44 #   冻结当前状态,跳出函数
     45 #   回到for,特殊东西的位置,for的一次循环完成后
     46 #   再次进入函数,回到上次执行代码的位置,继续向下执行
     47 #
    View Code

    装饰器

      1 #装饰器  --必备
      2 #
      3 #1、装饰器是一个函数,装饰器其他函数(一个函数装饰另外一个函数)
      4 
      5 
      6 def login(func):
      7     def wrapper(*arg,**kwargs):
      8         print('before')
      9         ret = func(*arg,**kwargs)
     10         print('after')
     11         return ret
     12     return wrapper
     13 
     14 @login  #方式三
     15 def show():
     16     return 'show'
     17 
     18 show()#-->
     19 #show指向show函数内存地址      show()执行show函数
     20 #方式一
     21 new_show = login(show)
     22 new_show()
     23 #上下两种是相同的
     24 #方式二
     25 show = login(show)
     26 show()
     27 
     28 '''
     29 def new_show():
     30     ret = show(*arg,**kwargs)
     31     return ret
     32 '''
     33 #功能上实现了一个嵌套
     34 #创建一个新的函数,函数内部,在执行另外一个函数
    简单装饰器

    递归

    利用函数编写如下数列:

    斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

      1 def func(arg1,arg2):
      2     if arg1 == 0:
      3         print arg1, arg2
      4     arg3 = arg1 + arg2
      5     print arg3
      6     func(arg2, arg3)
      7 
      8 func(0,1)
    View Code

    冒泡算法

    需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序

    思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!

      1 li = [13, 22, 6, 99, 11]
      2 
      3 for m in range(4):     # 等价于 #for m in range(len(li)-1):
      4     if li[m]> li[m+1]:
      5         temp = li[m+1]
      6         li[m+1] = li[m]
      7         li[m] = tem
    第一步
      1 li = [13, 22, 6, 99, 11]
      2 
      3 for m in range(4):     # 等价于 #for m in range(len(li)-1):
      4     if li[m]> li[m+1]:
      5         temp = li[m+1]
      6         li[m+1] = li[m]
      7         li[m] = temp
      8 
      9 for m in range(3):     # 等价于 #for m in range(len(li)-2):
     10     if li[m]> li[m+1]:
     11         temp = li[m+1]
     12         li[m+1] = li[m]
     13         li[m] = temp
     14 
     15 for m in range(2):     # 等价于 #for m in range(len(li)-3):
     16     if li[m]> li[m+1]:
     17         temp = li[m+1]
     18         li[m+1] = li[m]
     19         li[m] = temp
     20 
     21 for m in range(1):     # 等价于 #for m in range(len(li)-4):
     22     if li[m]> li[m+1]:
     23         temp = li[m+1]
     24         li[m+1] = li[m]
     25         li[m] = temp
     26 print li
    第二步
      1 复制代码
      2 li = [13, 22, 6, 99, 11]
      3 
      4 for i in range(1,5):
      5     for m in range(len(li)-i): 
      6         if li[m] > li[m+1]:
      7             temp = li[m+1]
      8             li[m+1] = li[m]
      9             li[m] = tem
    第三步

    二分查找

      1 def binary_search(data_source,find_n):
      2     mid = int(len(data_source)/2)
      3     if len(data_source) >= 1:
      4         if data_source[mid] > find_n: #data in left
      5             print("data in left of [%s]"%data_source[mid])
      6             binary_search(data_source[:mid],find_n)
      7         elif data_source[mid] < find_n: #data in right
      8             print("data in right of [%s]"%data_source[mid])
      9             binary_search(data_source[mid:],find_n)
     10         else:
     11             print("found dind_s,",data_source[mid])
     12     else:
     13         print("cannot find ")
     14 
     15 if __name__ == "__main__":
     16     data = list(range(1,600,3))
     17     print(data)
     18     binary_search(data,480)
    二分法查找

    二维数组90度旋转

    将一下数组旋转90度:

      1 [0, 1, 2, 3]
      2 [0, 1, 2, 3]
      3 [0, 1, 2, 3]
      4 [0, 1, 2, 3]

    旋转后:

      1 [0, 0, 0, 0]
      2 [1, 1, 1, 1]
      3 [2, 2, 2, 2]
      4 [3, 3, 3, 3]

    二维数组代码:

      1 data = [[col for col in range(4)]for row in range(4)]
      2 for row in data:
      3     print(row)
      4 print("-"*15)
      1 #方法一
      2 for r_index,row in enumerate(data):
      3     for c_index in range(r_index,len(row)):
      4         tmp = data[c_index][r_index]
      5         data[c_index][r_index] = row[c_index]
      6         data[r_index][c_index] = tmp
      7     print("-"*15)
      8     for r in data:
      9         print(r)
    方法一
      1 
      2 #方法二
      3 for i in range(len(data)):
      4     a = [data[i][i]for row in range(4)]
      5     print(a)
    方法二
  • 相关阅读:
    单例模式
    堆排序--leetcode 215
    二叉树--路径问题
    二叉树--前中后序两两结合构建二叉树
    CglibProxy
    JdkProxy
    git config --global http.sslVerify false
    PdfUtil
    idea中创建的文件类型无法识别
    sql优化
  • 原文地址:https://www.cnblogs.com/spykids/p/5231462.html
Copyright © 2020-2023  润新知