Python核心编程第二版第十一章:函数和函数式编程(课后习题)----我的答案

11-1.参数。比较下面3个参数:

 
 
def countToFour1():
    for eachnum in range(5):
        print(eachnum),
    print

def countToFour2(n):
    for eachnum in range(n, 5):
        print(eachnum),
    print

def countToFour3(n=1):
    for eachnum in range(n, 5):
        print(eachnum),
    print

countToFour1()
countToFour2(2)
countToFour2(4)
countToFour2(5)
countToFour3(2)
countToFour3(4)
countToFour3(5)

函数1无法传入参数,因为没有定义一个形参。参数2必须传入一个相应的参数n才能运行。参数可以选择传入一个参数或者使用默认值1.

11-2.函数。结合你对练习5-2的理解,以便你创建一个带相同对数字并同时返回一它们之和以及产物的结合函数。

def Multipliers(a, b):
    return "The result is %d" % (a + b)

print(Multipliers(2, 3))

11-3.函数。在这个练习里,我们将实现max()和min()内建函数。

(a)写分别带两个元素返回一个较大和较小元素,简单的max2()和min2()函数。它们应该可以用任意的python对象运作。

def max2(a, b):
    if a > b:
        return a
    else:
        return b

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

print(max2(3, 4))
print(min2(3, 4))

(b)创建使用了在a部分中的解来重构max()和min()的新函数my_max()和my_min().这些函数分别返回非空队列中一个最大和最小值。它们也能带一个参数集合作为输入。用数字和字符串来测试你的解。

def my_min(lyst):
    i = 1
    min = 0
    while i < len(lyst):
        if lyst[i] < lyst[min]:
            min = i
        i += 1
    return lyst[min]

def my_max(lyst):
    index = 1
    max = 0
    while index < len(lyst):
        if lyst[index] > lyst[max]:
            max = index
        index += 1
    return lyst[max]

print(my_max([3, 5, 6, 1, 4]))
print(my_min([3, 5, 6, 1, 4]))

11-4.返回值。给你在5-13的解创建一个补充函数。创建一个以分为单位的总时间,以及返回一个以小时和分为单位的等价的总时间。

def tranS(m):
    hour = m // 60
    min = m % 60
    return 'The time is %d : %d' % (hour, min)

mins = int(raw_input('Input some mins: '))
print(tranS(mins))

11-5.默认参数。更新你在练习5-7中创建的销售税脚本以便让销售税率不再是函数输入的必要之物。创建使用你地方税率的默认参数如果在调用的时候没有值传入。

def taxes(earnmoney, percent = 0.05):
    tax = earnmoney * percent
    return tax
if __name__ == '__main__':
    earnmoney = int(raw_input("Input your earn money number: "))
    print taxes(earnmoney)

11-6.变长参数。下一个称为printf()的函数。有一个值参数,格式化字符串。

def printf(arg ,*nkw):
    print([arg % eachNum for eachNum in nkw])

printf('%d',2,3.4,5)
printf('%f',2,3.4,5)

11-7.用map()进行函数式编程。给定一对同一大小的列表,将两个标归并为一个由每个列表元素组成的元组的单一的表。

def Map():
    return map(lambda x, y: (x, y), [1, 2, 3], ['abc', 'def', 'ghi'])

def Zip():
    s = zip([1, 2, 3], ['abc', 'def', 'ghi'])
    return s

print(Map())
print(Zip())

11-8.用filter()进行函数式编程。使用练习5-4你给出的代码来决定闰年。

def testYear(years):
    leap = filter(lambda x: (x % 4 == 0 and x % 100 != 0) or (x % 4 == 0 and x % 100 == 0), years)
    return leap

print(testYear([1997, 2020, 2015, 2018]))

def teatYear2(years):
    leap = [x for x in years if (x % 4 == 0 and x % 100 != 0) or (x % 4 == 0 and x % 100 == 0)]
    return leap

print(teatYear2([2000, 2013, 1000, 2018]))

11-9.用reduce()进行函数式编程。创建一个叫average()的函数来计算每个数字集合的简单平均值。

def average(lyst):
    Sum = reduce(lambda x, y:x + y, lyst)
    return Sum / len(lyst)

print(average([1, 2, 3, 4]))

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

files = filter(lambda x: x and x[0] != '.', os.listdir(folder))

os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。

只支持在 Unix, Windows 下使用。

这里表示用filter找出非当前文件夹的folder文件夹(过滤掉其他文件夹)

11-11.用map()进行函数式编程。写一个使用文件名以及通过除去每行中所有排头和最尾的空白来清洁文件。在原始文件中读取然后写入一个新文件,创建一个新的或者覆盖掉已存在的。给你的用户一个选择来决定执行哪一个。将你的解转化成使用列表解析。

def lineStrip(line):
    return line.strip(' /n')

def map(func,seq):
    func_seq=[]
    for i in seq:
        func_seq.append(func(i))
    return func_seq

filename='test.txt'
f=open(filename,'r')
lines=f.readlines()
f.close()
choosen=0
while not choosen:
    file_choose=raw_input('''which file will you save? choose: 
    (N)ew file 
    (O)ld file 
    ''')
    choose=file_choose.strip()[0].lower()
    if choose not in 'no':
        print 'choose invalid'
    elif choose=='n':
        file=raw_input('enter your new file name:')
        choosen=1
    else:
        file=filename
        choosen=1
        f=open(file,'w')
        for line in map(lineStrip,lines):
            f.write('%s/n'%line)
            f.close()

11-12pass

11-13.使用reduce()进行函数式编程以及递归

(a)

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

print(mult(3, 4))

(b)

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

print(reduce(mult, [1, 2, 3, 4, 5]))

(c)

print(reduce(lambda x, y: x * y, [1, 2, 3, 4, 5]))

(d)pass

11-14.用递归写斐波那契数列。

def fib(n):
    if n < 3:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

print(fib(8))

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

def fronttoback(string):
    if string:
       print string[0],
       return fronttoback(string[1:])

def backtofront(string):
    if string:
       print string[-1],
       return backtofront(string[:-1])

fronttoback('iloveyou')
print
backtofront('iloveyou')

11-16pass






猜你喜欢

转载自blog.csdn.net/qq_41805514/article/details/80516529