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

 multiply = lambda x, y: x * y

 if __name__ == '__main__':
x = int(input('x: '))
y = int(input('y: '))
print(multiply(x, y))

11-3 函数。

在这个练习中,我们将实现max()和min()内建函数。

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

 min2 = lambda x, y: x if x < y else y
max2 = lambda y, x: y if x < y else x
print('min:', min2(1, 2))
print('max:', max2(2, 1)) def my_max(*args):
retval = args[0]
for i in args:
retval = max2(retval, i)
return retval def my_min(*args):
retval = args[0]
for i in args:
retval = min2(retval, i)
return retval print('max:', my_max(1,3,2))
print('max:', my_max('ab', 'gh', 'ef'))
print('min:', my_min(1,3,2))
print('min:', my_min('ab', 'gh', 'ef'))

11–4. 返回值。

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

 def time(min):

     hour = min // 60
minute = min % 60 return '%d min = %d hour %d min' % (min, hour, minute) if __name__ == '__main__':
min = int(input('minute: '))
print(time(min))

11–5 默认参数。更新你在练习5-7中创建的销售税脚本以便让销售税率不再是函数输入的必要之物。

 def taxs(tax=0.05):
amount = float(input("商品金额:"))
return round(amount * tax) print(taxs())

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

 def printf(format, *args):

     return format % args

 print(printf('%d:%d:%d', 23, 59, 59))

11–7. 用map() 进行函数式编程。
给定一对同一大小的列表, 如[1 , 2 , 3] 和['abc','def','ghi',....],将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我们的结果看起来像这样:{[(1, 'abc'), (2, 'def'), (3, 'ghi'), ...}.(虽然这问题在本质上和第六章的一个问题相似,那时两个解没有直接的联系)然后创建用zip 内建函数创建另一个解。

 lmap = list(map(lambda x, y: (x,y), [1, 2, 3], ['abc','def','ghi']))
print(lmap) lzip = list(zip([1, 2, 3], ['abc','def','ghi']))
print(lzip)

11–8. 用filer()进行函数式编程.

使用练习5-4 你给出的代码来决定闰年。更新你的代码一边他成为一个函数如果你还没有那么做的话。然后写一段代码来给出一个年份的列表并返回一个只有闰年的列表。然后将它转化为用列表解析。

 def leap_years(year):

     if (year % 4 == 0 and year % 100 != 0) or (year % 4 == 0 and year % 400 == 0):
return year years = []
for i in range(2000, 2100):
years.append(i)
print(list(filter(leap_years, years))) print([year for year in [i for i in range(2000, 2100)]
if (year % 4 == 0 and year % 100 != 0) or (year % 4 == 0 and year % 400 == 0)])

11–9. 用reduce()进行函数式编程。

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

 from functools import reduce

 def average(numlist):
return reduce(lambda x,y: x+y,numlist) / len(numlist) print(average([1, 2, 3, 4, 5]))

11–11.用map()进行函数式编程。

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

 def new(filename):
f = open(filename)
lines = f.readlines()
f.close()
newlines = list(map(lambda line: line.strip(), lines))
num = input('[1]新建\n[2]覆盖\n请输入编号:')
if num == '':
f = open('new%s' % filename, 'w')
for line in newlines:
f.write(line + '\n')
elif num == '':
f = open(filename, 'w')
for line in newlines:
f.write(line + '\n')
else:
print('输入有误') if __name__ == '__main__':
filename = input('filename: ')
new(filename)

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

 import time

 def timeit(func, *nkwargs, **kwargs):

     try:
start = time.time()
retval = func(*nkwargs, **kwargs)
end = time.time()
result = (True, retval, end-start)
except Exception as diag:
result = (False, str(diag))
return result def test():
funcs = (int, float)
vals = (1234, 12.34, '', '12.34') for eachfunc in funcs:
print('_'* 20)
for eachval in vals:
retval = timeit(eachfunc,
eachval)
if retval[0]:
print('%s(%s)= ' % (eachfunc.__name__, 'eachval'), retval[1])
print('this func cost %s secs' % retval[2])
else:
print('%s(%s)= FAILED:' %
(eachfunc.__name__, 'eachval'), retval[1]) if __name__ == '__main__':
test()

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()以及递归)

 from functools import reduce
import time def timeit(func, *nkwargs, **kwargs): try:
start = time.time()
retval = func(*nkwargs, **kwargs)
end = time.time()
result = (True, retval, end-start)
except Exception as diag:
result = (False, str(diag))
return result def factorial(n):
if n == 0 or n == 1:
return 1
return (n * factorial(n-1)) def mul(x, y):
return x * y def lreduce(n):
# return (reduce(mul, range(1, n)))
return reduce(lambda x,y: x*y, range(1, n+1)) def iteration(n):
num = 1
if n == 0 or n == 1:
return 1
for i in range(1, n+1):
num *= i
return num def test(): vals = 5
funcs = (iteration, factorial, lreduce) for eachfunc in funcs:
print('-'* 20)
retval = timeit(eachfunc, vals)
if retval[0]:
print('%s(%s)= ' % (eachfunc.__name__, 'eachval'), retval[1])
print('this func cost %s secs' % retval[2])
else:
print('%s(%s)= FAILED:' %
(eachfunc.__name__, 'eachval'), retval[1]) if __name__ == '__main__':
test()

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

 def sequence(num):
if num == 1 or num == 2:
return 1
return sequence(num - 1) + sequence(num - 2) if __name__ == '__main__':
num = int(input("Number: "))
print(sequence(num))

11–15.递归。

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

 def backward(s, i=0):
if i < len(s):
return (
s[0:i + 1],
backward(s, i + 1)) def forward(s, j=0):
if j > -len(s):
return (
s[j - 1:],
forward(s, j - 1)) if __name__ == '__main__':
print(backward('abcdefg'))
print(forward('abcdefg'))

11-16 更新easyMath.py。这个脚本,如例子11.1描绘的那样,以入门程序来帮助年轻人强化他们的数学技能。通过加入乘法作为可支持的操作来进一步提升这个程序。额外的加分:也加入除法,这比较难做些因为你要找到有效的整型除数。幸运地是,已经有代码来确定分子比分母大,所以不需要支持分数。

 from operator import add, sub, mul, truediv
from random import randint, choice ops = {'+': add, '-': sub, '*': mul, '/': truediv}
MAXTRLES = 2 def doprob():
op = choice('+-*/')
nums = [randint(1, 10) for i in range(2)]
nums.sort(reverse=True)
ans = ops[op](*nums)
pr = '%d %s %d=' % (nums[0], op, nums[1])
oops = 0
while True:
try:
if float(input(pr)) == ans:
print('correct')
break
if oops == MAXTRLES:
print('answer\n%s%s' % (pr, ans))
else:
print('incorrect... try again')
oops += 1
except (KeyboardInterrupt,
EOFError, ValueError):
print('invalid input... try again') def main():
while True:
doprob()
try:
opt = input('Again? [y]').lower()
if opt and opt[0] == 'n':
break
except (KeyboardInterrupt, EOFError):
break if __name__ == '__main__':
main()

11-18 同步化函数调用。复习下第6章中当引入浅拷贝和深拷贝时,提到的丈夫和妻子情形。他们共用了一个普通账户,同时对他们银行账户访问会发生不利影响。创建一个程序,让调用改变账户收支的函数必须同步。换句话说,在任意给定时刻只能有一个进程或者线程来执行函数。一开始你试着用文件,但真正的解决办法是用装饰器和threading或者mutex模块中的同步指令。看看17章获得更多灵感。

 person = ['name', ['savings', 100.00]]
hubby = person[:]
wifey = list(person)
hubby[0] = 'joe'
wifey[0] = 'jane' def count(who): def cost(f, *args, **kargs):
if len(args) != 2:
print('paras num error')
elif args[0] == 'joe':
hubby[1][1] -= args[1]
print(hubby, wifey, person)
elif args[0] == 'jane':
wifey[1][1] -= args[1]
print(hubby, wifey, person)
else:
print('paras error') def hubby_cost(f):
def wrapper(*args, **kargs):
cost(f, *args, **kargs)
return f(*args, **kargs) return wrapper def wife_cost(f):
def wrapper(*args, **kargs):
cost(f, *args, **kargs)
return f(*args, **kargs) return wrapper try:
return {'joe': hubby_cost, 'jane': wife_cost}[who]
except KeyError as e:
raise (ValueError(e), 'must be "joe" or "jane"') @count('joe')
def changehubby(name, money):
print('change count of %s, minus %f' % (name, money)) @count('jane')
def changewifey(name, money):
print('change count of %s, minus %f' % (name, money)) changehubby('joe', 10.0)
changewifey('jane', 20.0)

python核心编程2 第十一章 练习的更多相关文章

  1. 《Python核心编程》 第六章 序列 - 课后习题

    课后习题 6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? 答:成员关系操作符(in.not in) import string ...

  2. 《Python核心编程》 第四章 Python对象- 课后习题

    练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到.  类型:对象的 ...

  3. Python核心编程2第四章课后练习

    4-1 Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下.      身份:对象的唯一标识      类型 :对象的类型决定了该对象可以保存什么类型的值       ...

  4. Python核心编程笔记 第三章

    3.1     语句和语法    3.1.1   注释( # )   3.1.2   继续( \ )         一般使用换行分隔,也就是说一行一个语句.一行过长的语句可以使用反斜杠( \ ) 分 ...

  5. 《Python核心编程》第五章:数字

    PS:[笔记+代码+图片]在GitHub上持续更新,欢迎star:https://github.com/gdouchufu/Core-Python-Programming 本章大纲 介绍Python支 ...

  6. python核心编程2 第六章 练习

    6-2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 key ...

  7. 《Python核心编程》 第七章 映射和集合类型 - 习题

    课后习题 7–1. 字典方法.哪个字典方法可以用来把两个字典合并到一起? 答: dict1 = {' :' python' } dict2 = {' :"hello" } dict ...

  8. 《Python核心编程》 第五章 数字 - 课后习题

    课后习题  5-1 整形. 讲讲 Python 普通整型和长整型的区别. 答:普通整型是绝大多数现代系统都能识别的. Python的长整型类型能表达的数值仅仅与你机器支持的(虚拟)内存大小有关. 5- ...

  9. 《Python核心编程》 第三章 Python基础 - 练习

    创建文件: # -*- coding: gbk -*- #! /auto/ERP/python_core/chapter ''' Created on 2014年5月21日 @author: user ...

随机推荐

  1. linux服务器上创建svn版本库

    1. 创建存放各个svn版本库的目录svnrepos(自己定义路径) -bash: cd /usr/local/apache/htdocs/ -bash: mkdir svnrepos 2. 假设我要 ...

  2. 面向对象三大特性——封装(含property)

    一.封装概念 封装是面向对象的特征之一,是对象和类概念的主要特性. 封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 二.隐藏属性 在p ...

  3. 元类(metaclass)

    一.储备知识exec 储备知识exec:有下面三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定默认使用globals() 参数三:局部作用域(字典形式),如果不指定默认就 ...

  4. iframe中插入代码并执行

    最近有需求通过iframe插入代码.有蛮多方法,如下: 1 var iframe = document.getElementById('previewUrl'); 2 iframe.src = 'ab ...

  5. 一次完整的HTTP事务过程

    基本流程: a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器得到html代码 e. 浏览器解析html代码,并请求html代码 ...

  6. IS Decisions如何帮助企业提高安全标准

    PCI DSS标准有什么要求? 简单地说,PCI DSS要求最高级别的网络安全性.这一标准如今广泛应用于需要存储.管理.传输客户(或持卡人)个人数据的行业和领域. 施行严格的访问监控措施 为了保证关键 ...

  7. java面试题之----get和post请求方法的区别

    GET和POST两种基本请求方法的区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过req ...

  8. redis复制集(sentinel)

    https://www.jianshu.com/p/45ffd2a84143 内核配置 cat >> /etc/rc.local << EOF echo never > ...

  9. Zookeeper的集群配置和Java测试程序

    Zookeeper是Apache下的项目之一,倾向于对大型应用的协同维护管理工作.IBM则给出了IBM对ZooKeeper的认知: Zookeeper 分布式服务框架是 Apache Hadoop 的 ...

  10. 深入JDK源码,这里总有你不知道的知识点!

    Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面最 ...