您的位置:首页 > 编程语言 > Python开发

python闯关4——最大最小

2016-10-24 19:23 211 查看
来自一个python编程挑战网站.整理供大家参考提高。

题干

  在这个任务中,你应该自己写出PY3中实现的内建函数 min 和 max. 一些内建函数在这里是不能用的:import,eval,exec,globals。 别忘了,你需要在你的代码中实现两个函数。

  max(iterable, [, key]) 或者 min(iterable, [, key])

  max(arg1, arg2, *args[, key]) 或者 min(arg1, arg2, *args[, key])

  返回迭代中的最大(最小)项中或者返回根据所提供参数的最大(最小)值 。

  如果有一个参数时,它应该是一个迭代器。返回在迭代器的最大(最小)的项。如果提供两个或更多的参数,返回参数中的最大(最小)的项。

  可选的唯一关键字是一个用于从每个列表元素提取一个用于比较的参数的函数。(例如,key=str.lower.lower)

如果有多个值同是最大(最小)的,函数返回所遇到的第一个最大值。

– Python 文档 内建函数

  输入: 一个参数作为一个迭代器或两个以上的参数。 一个函数作为可选关键字参数。

  输出: “max” 函数输出最大的项 “min” 函数输出最小的项。

范例:

max(3, 2) == 3

min(3, 2) == 2

max([1, 2, 0, 3, 4]) == 4

min(“hello”) == “e”

max(2.2, 5.6, 5.9, key=int) == 5.6

min([[1,2], [3, 4], [9, 0]], key=lambda x: x[1]) == [9, 0]

  如何使用: 此任务将帮助你了解一些内置的功能是如何在更精确的水平上工作的。

  前提: 所有的测试用例都是正确的并且函数不会引发异常。

我的代码

def minSimple(arg1, arg2, key):
if key!=None and key(arg1)<key(arg2) or key==None and arg1<arg2: return arg1
return arg2

def min(*args, **kwargs):
key=kwargs.get("key", None)         # Extracting key
if len(args)==1: args=list(args[0]) # Adapting arguments

# Comparing arguments, one by one
result=args[0]
for x in range(1,len(args)):
result=minSimple(result,args[x],key)
return result

def maxSimple(arg1, arg2, key):
if key!=None and key(arg2)>key(arg1) or key==None and arg2>arg1: return arg2
return arg1

def max(*args, **kwargs):
key=kwargs.get("key", None)         # Extracting key
if len(args)==1: args=list(args[0]) # Adapting arguments

# Comparing arguments, one by one
result=args[0]
for x in range(1,len(args)):
result=maxSimple(result,args[x],key)
return result

if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert max(3, 2) == 3, "Simple case max"
assert min(3, 2) == 2, "Simple case min"
assert max([1, 2, 0, 3, 4]) == 4, "From a list"
assert min("hello") == "e", "From string"
assert max(2.2, 5.6, 5.9, key=int) == 5.6, "Two maximal items"
assert min([[1, 2], [3, 4], [9, 0]], key=lambda x: x[1]) == [9, 0], "lambda key"
assert min(abs(i) for i in range(-10, 10)) == 0


总结

  这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前。举个栗子:

def foo(*args, **kwargs):
print 'args = ', args
print 'kwargs = ', kwargs
print '---------------------------------------'

if __name__ == '__main__':
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4, a=1,b=2,c=3)
foo('a', 1, None, a=1, b='2', c=3)


输出结果为:

args =  (1, 2, 3, 4)
kwargs =  {}
---------------------------------------
args =  ()
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =  (1, 2, 3, 4)
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =  ('a', 1, None)
kwargs =  {'a': 1, 'c': 3, 'b': '2'}
---------------------------------------


本题目主要学习任意数量参数的编程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python