向北方  

冒泡算法--算法

需求:请按照从小到大对列表 [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

 

 
posted on 2016-02-16 22:53  Sun0810  阅读(203)  评论(0)    收藏  举报