11–1.参数。比较下面 3 个函数:
def countToFour1():
for eachNum in range(5):
print eachNum,
def countToFour2(n):
for eachNum in range(n, 5):
print eachNum,
def countToFour3(n=1):
for eachNum in range(n, 5):
print eachNum,
给定如下的输入直到程序输出,你认为什么会发生?向下表 11.2 填入输出。如果你认为给定的输入会发生错误的话填入“ERROR”或者如果没有输出的话填入“NONE”
11-2.函数。结合你对练习 5-2 的解,以便你创建一个带相同对数字并同时返回一它们之和以及产物的结合函数。
表 11.2 问题 11-1 的输出图
Input countToFour1 countToFour2 countToFour3
2 ERROR 2 3 4 2 3 4
4 ERROR 4 4
5 ERROR None None
(nothing) 0 1 2 3 4 ERROR 1 2 3 4
11-3 函数。在这个练习中,我们将实现 max()和 min()内建函数。
(a) 写分别带两个元素返回一个较大和较小元素,简单的 max2()核 min2()函数。他们应该可以用任意的 python 对象运作。举例来说,max2(4,8)和 min2(4,8)会各自每次返回 8 和 4。
def max2(a,b):
max_num = a
if a<b:
max_num =b
return max_num
def min2(a,b):
min_num = a
if a>b:
min_num =b
return min_num
(b) 创建使用了在 a 部分中的解来重构 max()和 min()的新函数my_max()和 my_min().这些函数分别返回非空队列中一个最大和最小值。它们也能带一个参数集合作为输入。用数字和字符串来测试你的解。
这题是我理解有问题吗,和网上代码都不一样
def max2(a,b):
max_num = a
if a<b:
max_num =b
return max_num
aset={1}
my_max = reduce(max2,aset)
print my_max
11–4. 返回值。给你在 5-13 的解创建一个补充函数。创建一个带以分为单位的总时间以及返回一个以小时和分为单位的等价的总时间。
#5-13 输入的不就是小时和分为单位?题目没弄清
def change_time():
time=raw_input("input a time split by ':' ")
minutes =int(time.split(':')[0])*60 +int(time.split(':')[1])
print time ,"is equl" ,minutes,"minutes"
change_time()
11–5. 默认参数。更新你在练习 5-7 中创建的销售税脚本以便让销售税率不再是函数输入的必要之物。创建使用你地方税率的默认参数如果在调用的时候没有值传入。
def tax(money,tax_ratio=0.6):
tax=money*tax_ratio
return tax
11–6. 变长参数。下一个称为 printf()的函数。有一个值参数,格式字符串。剩下的就是根据格式化字符串上的值,要显示在标准输出上的可变参数,格式化字符串中的值允许特别的字符串格式操作指示符,如%d, %f, etc。提示:解是很琐碎的—-无需实现字符串操作符功能性,但你需要显示用字符串格式化操作(%)
#抄网上代码
def printf(rule,*num):
i = -1
for j in num:
i = rule.find("%",i+1) #对%定位,分三种情况讨论并进行替换
if rule[i+1]=="d" and type(j)==int:
result = rule.replace("%d",str(j),1)
elif rule[i+1]=="f" and type(j)==float:
result = rule.replace("%f",str(j),1)
elif rule[i+1]=="s" and type(j)==str:
result = rule.replace("%s",j,1)
else:
print "ERROR" #当对应类型不正确时抛出异常
exit(0)
rule = result
print result
11–7. 用map()进行函数式编程 。给定一对同一大小的列表,如[1,2 , 3] 和[‘abc’,’def’,’ghi’,….],将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我们的结果看起来像这样:{[(1, ‘abc’), (2, ‘def’), (3, ‘ghi’), …}.(虽然这问题在本质上和第六章的一个问题相似,那时两个解没有直接的联系)然后创建用 zip 内建函数创建另一个解。
a=[1, 2, 3,]
b=['abc', 'def', 'ghi']
map(None,a,b)
a=[1, 2, 3,]
b=['abc', 'def', 'ghi']
zip(a,b)
11–8. 用 filer()进行函数式编程.使用练习 5-4 你给出的代码来决定年。更新你的代码一边他成为一个函数如果你还没有那么做的话。然后写一段代码来给出一个年份的列表并返回一个只有闰年的列表。然后将它转化为用列表解析。
def judge_year(year):
if (year%4==0 and year%100!=0) or year%400 ==0:
return True
else:
return False
year_list=range(1987,2020)
leap_year=filter(judge_year,year_list)
print leap_year
#列表解析
[year for year in range(1987,2020) if (year%4==0 and year%100!=0) or year%400 ==0]
11–9. 用 reduce()进行函数式编程。复习 11.7.2 部分,阐述如何用 reduce()数字集合的累加的代码。修改它,创建一个叫 average()的函数来计算每个数字集合的简单的平均值。
average = reduce(lambda x,y:x+y,range(10))/float(len(range(10)))
11–10.用 filter()进行函数式编程。在 unix 文件系统中,在每个文件夹或者目录中都有两个特别的文件:’.’表示现在的目录,’..’表示父目录。给出上面的知识,看下 os.listdir()函数的文档并描述这段代码做了什么:
files = filter(lambda x: x and x[0] != ‘.’, os. listdir(folder))
#不懂
11–11.用 map()进行函数式编程。写一个使用文件名以及通过除去每行中所有排头和最尾的空白来“清洁“文件。在原始文件中读取然后写入一个新的文件,创建一个新的或者覆盖掉已存在的。给你的用户一个选择来决定执行哪一个。将你的解转换成使用列表解析。
#抄的网上代码
def strip(strTemp):
return strTemp.strip()
while True:
fileName = raw_input("please enter the fileName(q to quit):")
if fileName.lower() == "q":
break
choice = raw_input("n to new file, or c to cover file:")
if choice.lower() == "n":
newFileName = raw_input("please enter the new file name:")
with open(newFileName,"w") as fobj:
with open(fileName) as fobjold:
lines = fobjold.readlines()
for line in map(strip, lines):
fobj.write(repr(line))
fobj.write("\n")
else:
with open(fileName) as fobjold:
lines = fobjold.readlines()
with open(fileName,"w") as fobjold:
for line in map(strip, lines):
fobjold.write(repr(line))
fobjold.write("\n")
11–12. 传递函数。给在这章中描述的 testit()函数写一个姊妹函数。timeit()会带一个函数对象(和参数一起)以及计算出用了多少时间来执行这个函数,而不是测试执行时的错误。返回下面的状态:函数返回值,消耗的时间。你可以用 time.clock()或者 time.time(),无论哪一个给你提供了较高的精度。(一般的共识是在 POSIX 上用 time.time(),在win32 系统上用 time.clock())
注意:timeit()函数与 timeit 模块不相关(在 python2.3 中引入)
import time
def timeit(func):
start_time = time.clock()
result = func
end_time = time.clock()
return (result, end_time - start_time)
def func(a, b):
return a * b
print timeit(func(23, 12))
11–13.使用 reduce()进行函数式编程以及递归。在第 8 张中,我们看到 N 的阶乘或者 N!作为从 1 到 N 所有数字的乘积。
(a) 用一分钟写一个带 x,y 并返回他们乘积的名为 mult(x,y)的简单小巧的函数。
def mult(x,y):
return x*y
(b)用你在 a 中创建 mult()函数以及 reduce 来计算阶乘。
def mult(x,y):
return x*y
def fac1(n):
return reduce(mult, range(1,n+1))
(c)彻底抛弃掉 mult()的使用,用 lamda 表达式替代。
def fac2(n):
return reduce(lambda x, y: x * y, range(1,n+1))
(d)在这章中,我们描绘了一个递归解决方案来找到 N!用你在上面问题中完成的 timeit()函数,并给三个版本阶乘函数计时(迭代的,reduce()以及递归)
#暂空
11–14. 递归。我们也来看下在第八章中的 Fibonacci 数字。重写你先前计算 Fibonacci 数字的解(练习 8-9)以便你可以使用递归。
def fibo(n):
if n == 1:
return 1
elif n == 2:
return 1
else:
return fibo(n - 1) + fibo(n - 2)
11–15.递归。从写练习 6-5 的解,用递归向后打印一个字符串。用递归向前以及向后打印一个字符串。
#抄网上代码
#向后打印
def printLeft(strTemp):
if strTemp:
print strTemp[0],
return printLeft(strTemp[1:])
#向前打印
def printRight(strTemp):
if strTemp:
print strTemp[-1],
return printRight(strTemp[:-1])
11–16. 更新 easyMath.py。这个脚本,如例子 11.1 描绘的那样,以入门程序来帮助年轻人强化他们的数学技能。通过加入乘法作为可支持的操作来更进一步提升这个程序。额外的加分:也加入除法;这比较难做些因为你要找到有效的整数除数。幸运的是,已经有代码来确定分子比分母大,所以不需要支持分数。
# 太麻烦 ,头大...
11–17.定义
(a) 描述偏函数应用和 currying 之间的区别。
(b) 偏函数应用和闭包之间有什么区别?
(c) 最后,迭代器和生成器是怎么区别开的?
#没什么深入的理解,放过
11–18. 同步化函数调用。复习下第六章中当引入浅拷贝和深拷贝的时候,提到的丈夫和妻子情形(6.20 小结)。他们共用了一个普通账户,同时对他们银行账户访问时会发生不利影响。
创建一个程序,让调用改变账户收支的函数必需同步。换句话说,在任意给定时刻只能有个一进程或者线程来执行函数。一开始你试着用文件,但是一个真正的解决方法是用装饰器和在threading 或者 mutex 模块中的同步指令。你看看第 17 张来获得更多的灵感。
不会