目录

一、迭代器

二、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)
方法二