冒泡算法--算法
需求:请按照从小到大对列表 [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] = temp
第二步 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,len(li)): for m in range(len(li)-i): #4,3,2,1 if li[m] > li[m+1]:
#将较大的值放到右侧 temp = li[m+1] li[m+1] = li[m] li[m] = temp
lambda表达式
学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:
1 # 普通条件语句 2 if 1 == 1: 3 name = 'wupeiqi' 4 else: 5 name = 'alex' 6 7 # 三元运算 8 name = 'wupeiqi' if 1 == 1 else 'alex'
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式
1 # ###################### 普通函数 ###################### 2 # 定义函数(普通方式) 3 def func(arg): 4 return arg + 1 5 6 # 执行函数 7 result = func(123) 8 9 # ###################### lambda ###################### 10 11 # 定义函数(lambda表达式) 12 my_lambda = lambda arg : arg + 1 #自动 return 13 14 # 执行函数 15 result = my_lambda(123)
my_lambda = lambda a,b: a + b #接收多参数
#处理简单逻辑
#自动return
lambda存在意义就是对简单函数的简洁表示(只能用于简便的函数)
内置函数 二
一、map
遍历序列,对序列中每个元素进行操作,最终获取新的序列
每个元素增加100
li = [11, 22, 33]
new_list = map(lambda a: a + 100, li)
两个列表对应元素相加
li = [11, 22, 33] sl = [1, 2, 3] new_list = map(lambda a, b: a + b, li, sl)
第一个参数应该是一个函数。
二、filter
对于序列中的元素进行筛选,最终获取符合条件的序列
获取列表中大于12的所有元素集合
li = [11, 22, 33] new_list = filter(lambda arg: arg > 22, li) #filter第一个参数为空,将获取原来序列,并且去除false的布尔值。也就是取值布尔值为真的。
三、reduce
对于序列内所有元素进行累计操作
获取序列所有元素的和
li = [11, 22, 33] result = reduce(lambda arg1, arg2: arg1 + arg2, li) # reduce的第一个参数,函数必须要有两个参数 # reduce的第二个参数,要循环的序列 # reduce的第三个参数,初始值
yield生成器
记住上一次的操作,下次再执行时,继续执行(会暂时冻结这个函数)可以做数据库的链接池。
例如:
def func1(): return 1 #return的生命周期就已经结束了 def func2(): yield 1 yield 2 yield 3 for i in func2(): print i
#他会返回3次。yield生命周期在延续。
1 >>> print range(10) 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 >>> print xrange(10) 4 xrange(10)
如上代码所示,range会在内存中创建所有指定的数字,而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。
1 ####自定义生成器nrange 2 def nrange(num): 3 temp = -1 4 while True: 5 temp = temp + 1 6 if temp >= num: 7 return 8 else: 9 yield temp
for i in nrange(4):
print i
2、文件操作的 read 和 xreadlinex 的的区别
read会读取所有内容到内存
xreadlines则只有在循环迭代时才获取
1 #基于next自定义生成器NReadlines 2 def NReadlines(): 3 with open('log','r') as f: 4 while True: 5 line = f.next() 6 if line: 7 yield line 8 else: 9 return 10 11 for i in NReadlines(): 12 print i
1 ###基于seek和tell自定义生成器NReadlines 2 def NReadlines(): 3 with open('log','r') as f: 4 seek = 0 5 while True: 6 f.seek(seek) 7 data = f.readline() 8 if data: 9 seek = f.tell() 10 yield data 11 else: 12 return 13 14 for item in NReadlines(): 15 print item