#encoding=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().这些函
# 数分别返回非空队列中一个最大和最小值。它们也能带一个参数集合作为输入。用数字和字符串来
# 测试你的解。
def max2(a,b): if a > b: return a else: return b def min2(a,b): if a > b: return b else: return a print max2(4,8) print min2(4,8) #返回队列的最大最小值 aList = [1,2,3,4,5,6,5,4,3,2] def mymax(list): for i in range(len(aList)): if i == 0: max = aList[i] max = max2(max,aList[i]) return max def mymin(list): for i in range(len(aList)): if i == 0: min = aList[i] min = min2(min,aList[i]) return min print mymax(aList) print mymin(aList) #enumerate参数为可遍历的变量,如 字符串,列表等; 返回值为enumerate类 for i,j in enumerate(aList): print i,j
print '11-6'
# 11–6. 变长参数。下一个称为 printf()的函数。有一个值参数,格式字符串。剩下的就是根
# 据格式化字符串上的值,要显示在标准输出上的可变参数,格式化字符串中的值允许特别的字符串
# 格式操作指示符,如%d, %f, etc。提示:解是很琐碎的----无需实现字符串操作符功能性,但你需
# 要显示用字符串格式化操作(%)
#变长参数有默认参数,*元组实现的非关键字默认参数,**字典实现的关键字默认参数
def printf(arg ,*nkw): for eachNum in nkw: print arg % eachNum, printf('%d',2,3.4,5) printf('%f',2,3.4,5) #非关键字可变参数 元组 * def tuple(arg1,arg2='B',*theRest): print 'formal arg1:',arg1 print 'formal arg2:',arg2 for eacharg in theRest: print 'another arg:',eacharg tuple('abc') tuple(23,4) tuple(23,'abc','xyz',456)
# 11–7. 用 map() 进 行 函 数 式 编 程 。 给 定 一 对 同 一 大 小 的 列 表 , 如 [1 , 2 , 3] 和
# ['abc','def','ghi',....],将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我
# 们的结果看起来像这样:{[(1, 'abc'), (2, 'def'), (3, 'ghi'), ...}.(虽然这问题在本质上和
# 第六章的一个问题相似,那时两个解没有直接的联系)然后创建用 zip 内建函数创建另一个解。
#map(func,参数) 返回全部参数的映射值
aList1 = [1,2,3,4,5] aList2 = ['abc','def','ghi','jkl','mno'] print map(None,aList1,aList2)
# 11–8. 用 filer()进行函数式编程.使用练习 5-4 你给出的代码来决定闰年。更新你的代码一
# 边他成为一个函数如果你还没有那么做的话。然后写一段代码来给出一个年份的列表并返回一个只
# 有闰年的列表。然后将它转化为用列表解析。
#filter(func,参数)返回为1的参数,筛选
def is_runyear(year): if (year%4 == 0 and year%100 != 0) or (year%400 == 0 ): return 1 else: return 0 aList = [1996,2000,2001,2002,2003,2004,1900] print filter(is_runyear,aList) print [n for n in aList if is_runyear(n)]
# 11–9. 用 reduce()进行函数式编程。复习 11.7.2 部分,阐述如何用 reduce()数字集合的累
# 加的代码。修改它,创建一个叫 average()的函数来计算每个数字集合的简单的平均值。
aList = [1,3,5,7,9] def average(list): sum = reduce((lambda x,y: x+y), aList) return sum / len(aList) print average(aList)
# 11–11.用 map()进行函数式编程。写一个使用文件名以及通过除去每行中所有排头和最尾的空
# 白来“清洁“文件。在原始文件中读取然后写入一个新的文件,创建一个新的或者覆盖掉已存在的。
# 给你的用户一个选择来决定执行哪一个。将你的解转换成使用列表解析。
#每一行输入保存到1.txt,读取1.txt处理文件,
#每行输入保存到文件1。txt
'''----------迭代读取文件---------------''' f = open('2.txt','r') lines = f.readlines() def func(s): s.split() for eachLine in lines: print eachLine,len(eachLine) print len(eachLine.split()) print map(func,eachLine) str1 = '12345' str2 = 'efghi' print map(None,str1) def chuli(line): return line.strip(' /n') filename='2.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(chuli,lines): f.write('%s/n'%line) f.close()
# 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()以及递归
def mult(x,y): return x*y #q求5! print reduce(mult,range(1,6)) print reduce(lambda x,y:x*y,range(1,6))