#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,参数) 返回全部参数的映射值
print ‘11-7‘
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()
# ‘‘‘--------------------输出到文件-------------‘‘‘
# filename = raw_input(‘enter file name:‘)
# fobj = open(filename,‘w‘)
# #会覆盖原文件
# for eachLine in lines:
# print eachLine,
# fobj.write(‘%s%s‘ % (line1,os.linesep))
# 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))