python核心编程--第十章 11.11 练习

本文通过一系列Python编程练习,探讨了函数式编程、递归、性能测试等核心概念。其中包括实现max和min函数、字符串格式化、计算平均值、过滤文件列表、函数执行时间测量、阶乘计算、斐波那契数列生成及字符串逆向输出等功能。
摘要由CSDN通过智能技术生成




#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11-3 函数。在这个练习中,我们将实现max()和min()内建函数。
#  (a) 写分别带两个元素返回一个较大和较小元素,简单的max2()核min2()函数。
#      他们应该可以用任意的python 对象运作。举例来说,max2(4,8)和min2(4,8)会各自每次返回8 和4。
#  (b) 创建使用了在a 部分中的解来重构max()和min()的新函数my_max()和my_min().
#      这些函数分别返回非空队列中一个最大和最小值。它们也能带一个参数集合作为输入。
#      用数字和字符串来测试你的解。


# (a)
def min2(a, b):
    if (a < b):
        return a
    else:
        return b

def max2(a, b):
    if (a > b):
        return a
    else:
        return b
# (b)
def my_min(*nkwargs):
    args = []
    for arg in nkwargs:
        args.append(arg)
    else:
        return reduce(min, args)

def my_max(*nkwargs):
    args = []
    for arg in nkwargs:
        args.append(arg)
    else:
        return reduce(max2, args)


    
print my_max(1, 2, 3, 4, 5, 6, 7)
print my_max("a", "c", "d", "A")
print my_min(1, 2, 3, 4, 5, 6, 7)
print my_min("a", "c", "d", "A")

#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11–6. 变长参数。下一个称为printf()的函数。有一个值参数,格式字符串。
#       剩下的就是根据格式化字符串上的值,要显示在标准输出上的可变参数,
#       格式化字符串中的值允许特别的字符串格式操作指示符,如%d, %f, etc。
#       提示:解是很琐碎的----无需实现字符串操作符功能性,
#       但你需要显示用字符串格式化操作(%)

def printf(format, *nkwargs):
    print format % nkwargs

printf("%s, %d, %f", "aaa", 10.54, 10)


#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11–9. 用reduce()进行函数式编程。复习11.7.2 部分,阐述如何用reduce()数字集合的累加
#       的代码。修改它,创建一个叫average()的函数来计算每个数字集合的简单的平均值。


def average(*numbers):
    count = len(numbers)
    return reduce(lambda x, y: float(x+y), numbers)/count

print average(1, 2, 3, 4, 5, 6, 7, 8, 9)


11–10.用filter()进行函数式编程。在unix 文件系统中,在每个文件夹或者目录中都有两个
特别的文件:'.'表示现在的目录,'..'表示父目录。给出上面的知识,看下os.listdir()函数的文
档并描述这段代码做了什么:
files = filter(lambda x: x and x[0] != '.', os. listdir(folder))

显示folder文件夹下的所有非隐藏目录。

#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11–12. 传递函数。给在这章中描述的testit()函数写一个姊妹函数。
#        timeit()会带一个函数对象(和参数一起)以及计算出用了多少时间来执行这个函数,
#        而不是测试执行时的错误。返回下面的状态:函数返回值,消耗的时间。
#        你可以用time.clock()或者time.time(),无论哪一个给你提供了较高的精度。
#        (一般的共识是在POSIX 上用time.time(),在win32 系统上用time.clock())
#        注意:timeit()函数与timeit 模块不相关(在python2.3 中引入)


import time

def timeit(func):
    def _timeif(*targs, **dargs):
        pretime = time.time()
        retval = func(*targs, **dargs)
        consume = time.time() - pretime
        print consume
        return retval
    return _timeif

@timeit
def test():
    time.sleep(1)


if __name__ == '__main__':
    test()


#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11–13.使用reduce()进行函数式编程以及递归。
#       在第8 张中,我们看到N 的阶乘或者N!作为从1 到N 所有数字的乘积。
#   (a) 用一分钟写一个带x,y 并返回他们乘积的名为mult(x,y)的简单小巧的函数。
#   (b) 用你在a 中创建mult()函数以及reduce 来计算阶乘。
#   (c) 彻底抛弃掉mult()的使用,用lamda 表达式替代。
#   (d) 在这章中,我们描绘了一个递归解决方案来找到N!
#       用你在上面问题中完成的timeit()函数,并给三个版本阶乘函数计时(迭代的,
#       reduce()以及递归)

import time
import sys   
sys.setrecursionlimit(1000000000)

def timeit(func):
    def _timeif(*targs, **dargs):
        pretime = time.time()
        retval = func(*targs, **dargs)
        consume = time.time() - pretime
        print consume
        return retval
    return _timeif

# (a)
def mult(x, y):
    return x * y

number = 10000

print

# (b)
@timeit
def factorial1(number):
    return reduce(mult, range(1, number+1))


# (c)
@timeit
def factorial2(number):
    return reduce(lambda x, y: x*y, range(1, number+1))


# (d)
def factorial3(number):
    if number == 0 or number == 1:
        return 1
    else:
        return factorial3(number-1) * number

@timeit
def factorial(number):
    retval = factorial3(number)
    return retval

factorial3(number)

factorial1(number)
factorial2(number)
factorial(number)


#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11–14. 递归。我们也来看下在第八章中的Fibonacci 数字。
#        重写你先前计算Fibonacci 数字的解(练习8-9)以便你可以使用递归。

def getfibonacci(number):
    if number == 1 or number == 2:
        return 1
    else:
        return getfibonacci(number-1) + getfibonacci(number-2)

    
print getfibonacci(10)

#!/usr/bin/python
# -*- coding: utf-8 -*-

# 11–15.递归。从写练习6-5 的解,用递归向后打印一个字符串。
#       用递归向前以及向后打印一个字符串。

def reverse_show_string(a_string):
    if len(a_string) == 1:
        pass
        print a_string
    else:
        print a_string[len(a_string)-1],
        reverse_show_string(a_string[:len(a_string) - 1])

reverse_show_string("abcdef")

def cross_show_string(a_string):
    if len(a_string) <= 2:
        print a_string
    else:
        print a_string[0],
        if len(a_string) > 1:
             print a_string[len(a_string)-1],
        cross_show_string(a_string[1:len(a_string) - 1])

cross_show_string("123456789")




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值