目录
一、迭代器
二、yield生成器
三、装饰器
四、递归
五、基础算法
迭代器
#1.在不使用for循环的情况下
li = [11 ,22, 33, 44]
#count = len(li)
#start = 0
#while count > start:
# print(li[start])
# start += 1
#while 使用索引进行操作,所有的其他预言,都支持while #for item in li:
# print(item)
#for循环本质
#1.创建一个特殊的东西(迭代器),获取到一个具有Next方法的对象
#2.根据这个东西去操作列表Li中的内容 #benzhi
#obj = iter(li)
#print(obj.__next__())
#迭代器 = iter(li)
#执行迭代器返回一个对象,对象是含有next方法 #使用本质,创建一个for循环
obj = iter(li)
while True:
try:
item = obj.__next__()
print(item)
except Exception:
pass # 迭代器
#
# 循环
# 1.while
# 索引,下标取数据,随意取值
# 2.for
# 一,执行迭代器,获取了一个含有next方法的对象
# 二,执行对象的next方法(一直执行)
#
# ====引出,迭代器
# 执行iter,获取一个具有next方法的对象
# -->顺序拿
迭代器
生成器
生成器
#
# python2.7
# range,xrange
#
# python3
# range=pyth2.7中的xrange
#
#
# 例:
# range(10)--->立马在内存里创建0-9
# xrange(10)--->内存里面没有数字
# for i in xrange(10):
# 第一次循环内存创建0
# i = 0
# 第二次循环内存创建1
# i = 1
# .
# .
# .
# print i
生成器
xrange,redis>keys, f句柄
生成器,内存消耗的问题就解决了
生成器最重要的东西yield
#函数
# def show():
# return 123
#
# i = show()
# print(i) #生成器
# def show():
# yield 123
#
# i = show()
# print(i) #<generator object show at 0x000001BA338658E0>
#回想,文件操作 100G文件,
#1、f=open('') =>File对象
#for i in f: ==>自动触发f对象的__iter__方法
# f = open('f1.log',"r")
# for line in f:
# print(line)
#一行一行区数据
#文件操作:
# 1、必须迭代执行生成器
# 2、yield冻结状态(记住上次执行的位置) #模拟大文件操作
def show():
yield 'line1'
yield 'line2'
yield 'line3' #本质
my_f = show()
for line in my_f:#特殊的东西
print(line)
#输出结果
'''
line1
line2
line3
'''
#总结:1.函数如果有yield,函数返回值特殊的东西(必须和for一起使用)
#2、for,函数返回的特殊东西,函数内部执行代码,如果遇到yield关键字
# 冻结当前状态,跳出函数
# 回到for,特殊东西的位置,for的一次循环完成后
# 再次进入函数,回到上次执行代码的位置,继续向下执行
#
装饰器
#装饰器 --必备
#
#1、装饰器是一个函数,装饰器其他函数(一个函数装饰另外一个函数) def login(func):
def wrapper(*arg,**kwargs):
print('before')
ret = func(*arg,**kwargs)
print('after')
return ret
return wrapper @login #方式三
def show():
return 'show' show()#-->
#show指向show函数内存地址 show()执行show函数
#方式一
new_show = login(show)
new_show()
#上下两种是相同的
#方式二
show = login(show)
show() '''
def new_show():
ret = show(*arg,**kwargs)
return ret
'''
#功能上实现了一个嵌套
#创建一个新的函数,函数内部,在执行另外一个函数
简单装饰器
递归
利用函数编写如下数列:
斐波那契数列指的是这样一个数列 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
def func(arg1,arg2):
if arg1 == 0:
print arg1, arg2
arg3 = arg1 + arg2
print arg3
func(arg2, arg3) func(0,1)
冒泡算法
需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序
思路:相邻两个值进行比较,将较大的值放在右侧,依次比较!
li = [13, 22, 6, 99, 11] for m in range(4): # 等价于 #for m in range(len(li)-1):
if li[m]> li[m+1]:
temp = li[m+1]
li[m+1] = li[m]
li[m] = tem
第一步
li = [13, 22, 6, 99, 11] for m in range(4): # 等价于 #for m in range(len(li)-1):
if li[m]> li[m+1]:
temp = li[m+1]
li[m+1] = li[m]
li[m] = temp for m in range(3): # 等价于 #for m in range(len(li)-2):
if li[m]> li[m+1]:
temp = li[m+1]
li[m+1] = li[m]
li[m] = temp for m in range(2): # 等价于 #for m in range(len(li)-3):
if li[m]> li[m+1]:
temp = li[m+1]
li[m+1] = li[m]
li[m] = temp for m in range(1): # 等价于 #for m in range(len(li)-4):
if li[m]> li[m+1]:
temp = li[m+1]
li[m+1] = li[m]
li[m] = temp
print li
第二步
复制代码
li = [13, 22, 6, 99, 11] for i in range(1,5):
for m in range(len(li)-i):
if li[m] > li[m+1]:
temp = li[m+1]
li[m+1] = li[m]
li[m] = tem
第三步
二分查找
def binary_search(data_source,find_n):
mid = int(len(data_source)/2)
if len(data_source) >= 1:
if data_source[mid] > find_n: #data in left
print("data in left of [%s]"%data_source[mid])
binary_search(data_source[:mid],find_n)
elif data_source[mid] < find_n: #data in right
print("data in right of [%s]"%data_source[mid])
binary_search(data_source[mid:],find_n)
else:
print("found dind_s,",data_source[mid])
else:
print("cannot find ") if __name__ == "__main__":
data = list(range(1,600,3))
print(data)
binary_search(data,480)
二分法查找
二维数组90度旋转
将一下数组旋转90度:
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]
旋转后:
[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
二维数组代码:
data = [[col for col in range(4)]for row in range(4)]
for row in data:
print(row)
print("-"*15)
#方法一
for r_index,row in enumerate(data):
for c_index in range(r_index,len(row)):
tmp = data[c_index][r_index]
data[c_index][r_index] = row[c_index]
data[r_index][c_index] = tmp
print("-"*15)
for r in data:
print(r)
方法一
#方法二
for i in range(len(data)):
a = [data[i][i]for row in range(4)]
print(a)
方法二