目录
一、迭代器
二、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 #
装饰器
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)
冒泡算法
需求:请按照从小到大对列表 [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)