python学习【四】 python基础3

冒泡算法

上一篇文章中介绍了一部分内置函数,这里就用内置函数实现一个冒泡排序算法。

需求:请按照从小到大对列表 [13, 33, 4, 9, 11]进行排序。

for m in range(1,len(li)):
     for n in range(len(li)-m):
         num1 = li[n]
         num2 = li[n+1]
         if num1 > num2:
             temp = num1
             li[n] = num2
             li[n+1] = temp
print li

lambda表达式

lambda表达式主要用来简化简单的函数。

例如:

# 常用函数的定义
def func(args):
    return args + 1
result = func(100)
print result
结果:101
# lambda方式 func2 = lambda a : a+1 result = func2(1000) print result 结果:1001

内置函数2

(1)、map()

map接收一个函数和一个可迭代对象(如列表)作为参数,用函数处理每个元素,然后返回新的列表。
例1:使li列表中的每个元素加1

li = [11,22,34,56]
def func(args):
  return args + 1
new_list = map(func,li)
print new_list

输出结果:[12, 23, 35, 57]
例2:使li和li2列表中的对应元素相加

li = [11,22,34,56]
li2 = [3,4,5,6]
def func2(args, args2):
  return args + args2
new_list = map(func,li,li2)
print new_list

例3:使用lambda表达式作为map的参数,实现li和li2列表中的对应元素相加

li = [11,22,34,56]
li2 = [3,4,5,6]
print map(lambda a,a2 : a+a2,li,li2)

(2)、filter()

filter函数的功能相当于过滤器。调用一个布尔函数bool_func来迭代遍历每个seq中的元素;返回一个使bool_seq返回值为true的元素的序列。

li = [11,22,34,56]
print filter(lambda a: a > 33, li)
输出结果:[34,56]

(3)、reduce()

reduce函数,func为二元函数,将func作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列的元素),连续的将现有的结果和下一个值作用在获得的随后的结果上,最后我们的序列为一个单一的返回值。下面的例子就实现了对列表内元素的求和。

li = [11,22,34,56]
print reduce(lambda a1, a2: a1 + a2, li)

# reduce的第一个参数,函数必须要有两个参数
# reduce的第二个参数,要循环的序列
# reduce的第三个参数,初始值

yield生成器

yield会记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数对上一次返回时所记住的位置,而上次调用的所有局部变量都保持不变。

例1:

def func():
    yield 1
    yield 2
    yield 3

for i in func():
    print i

循环调用func()函数时,当func函数执行到yield 1时,将返回到for循环中执行print输出1,然后再跳转到yield 1的位置继续向下执行;执行到yield 2时,将返回到for循环中执行print输出2,然后再跳转到yield 2的位置继续向下执行。因此在控制台会依次输出:

1
2
3

例2:使用yield生成器实现和xrange()内置函数一样的效果

def mrange(args):
    send = -1
    while True:
        send = send + 1
        if send > args-1:
            return
        else:
            yield send

for i in mrange(10):
    print i 

装饰器

装饰器主要用于在改变已有对象内部结构的情况下对该对象添加新的功能。下面我们用例子对装饰器进行深入的了解。

现有一个求平方的的函数:

def square(a):
    return a**2

print square(3)

现在我想打印是求谁的平方,通常情况下我们会用下面的方式来实现:

def square(a):
    print "%d的平方为:" % a
    return a**2

print square(3)

但是上面的方法修改了square()函数的代码结构,我们怎样才能在不修改函数的结构的情况下来增加打印功能呢,这就需要使用到装饰器,实现如下:

def dayin(func):
    def new_func(a):
         print '%d的平方为:' % a
         return func(a)
    return new_func
@dayin
def square(a):
    return a**2

print square(3)

解释:当我们使用square()函数时,首先会调用dayin()函数并将square作为该函数的参数,即@dayin==》dayin(square).

因此square也会被dayin()函数内部所使用,即:return func(a) ==》return square(a),相当于我们print square(3),其实真正调用square(a)函数是在这里才开始。因此我们的执行过程如下:

执行square(3)时,先调用dayin(func),将square作为该函数的参数替换func,返回new_func()函数的函数名new_func,这时执行square(3)就变成执行new_func(3)函数,就会执行print '%d的平方为:' % a进行打印,然后执行return func(a),因为func是dayin()函数的参数,在调用dayin()函数时已将square传入,因此执行return func(3)就相当于return square(3),这里调用square()函数返回3的平方9,最后打印输出9。

 

 

 

posted @ 2015-11-18 20:48  杜瑞龙  阅读(99)  评论(0)    收藏  举报