本练习的重点:通过实现与内置函数相同功能的函数来达到锻炼提升编码能力的目的。
1.abs(x)函数返回一个数的绝对值。
参数可以是一个整数或浮点数。
如果参数是一个复数,则返回它的模。
如果 x 定义了 abs(),则 abs(x) 将返回 x.abs()。
2.class complex([real[, imag]]) 函数返回值为 real + imag*1j 的复数,或将字符串或数字转换为复数。
如果第一个形参是字符串,则它被解释为一个复数,并且函数调用时必须没有第二个形参。
当从字符串转换时,字符串在 + 或 的周围必须不能有空格。
例如 complex('1+2j')是合法的,但 complex('1 + 2j') 会触发 ValueError 异常。
3.isinstance(object, classinfo) 函数如果参数 object 是参数 classinfo 的实例或者是其 (直接、间接或 虚拟) 子类则返回True。
否则返回 False。
如果 classinfo 是类型对象元组(或由其他此类元组递归组成的元组),那么如果 object 是其中任何一个类型的实例就返回 True。
如果classinfo 既不是类型,也不是类型元组或类型元组的元组,则将引发 TypeError 异常。
In [25]:print(abs(1))print(abs(1.212))print(abs(complex('1+2j'))) # 返回 sqrt(1+4)a = complex('1+2j')11.2122.23606797749979请实现下面的函数,模仿abs函数的功能,返回数字的绝对值。
In [23]:import math# 方法1def my_abs_1(number):if type(number) == int or type(number) == float:if number < 0:return number*(1)else:return numberelif type(number) == complex:return math.sqrt(number.real**2 + number.imag**2)#方法2# 判断变量类型,可以使用isinstance函数,# 该函数的第一个参数是需要检查类型的对象,# 第二个参数可以是数据类型,也可以是一个元组,# 元组里是多个数据类型,只要满足其中一个就返回Truedef my_abs_2(number):if isinstance(number, (float,int)):if number < 0:return number*(1)else:return numberelif isinstance(number, complex):return math.sqrt(number.real**2 + number.imag**2)if __name__ == "__main__":print(abs(1), end = " ")print(abs(1.212), end = " ")print(abs(complex('1+2j')), end = " \n")print(my_abs_1(1), end = " ")print(my_abs_1(1.212), end = " ")print(my_abs_1(complex('1+2j')), end = " \n")print(my_abs_2(1), end = " ")print(my_abs_2(1.212), end = " ")print(my_abs_2(complex('1+2j')), end = " ")1 1.212 2.236067977499791 1.212 2.236067977499794. sum(iterable, /, start=0)函数从 start 开始自左向右对 iterable 的项求和并返回总计值。
iterable 的项通常为数字,而 start 值则不允许为字符串。
对某些用例来说,存在 sum() 的更好替代。
拼接字符串序列的更好更快方式是调用''.join(sequence)。
要以扩展精度对浮点值求和,请参阅 math.fsum()。
要拼接一系列可迭代对象,请考虑使用 itertools.chain()。
sum 函数可以获取列表所有数据的总和,模仿这个功能实现下面的函数In [48]:sum ((1.1,2,3))# sum([1,2,3, [1,2,3]])In [43]:def my_sum (lst):'''返回列表里所有数据的总和:param lst::return:'''sum = 0if not isinstance (lst, (list , tuple , set )):return Nonefor i in lst:if isinstance (i, (float , int )):sum += ielse :print ("error!!!")returnreturn sumif __name__ == "__main__":print (sum ([1.1,2,3]), sum ((1.1, 2, 3)), sum ({1.1,2,3}))print (my_sum([1.1,2,3]), my_sum((1.1, 2, 3)), my_sum({1.1,2,3})) #print(sum([1.1,2,3, [1,2,3]]))#print(my_sum([1.1,2,3,[1,2,3]]))5. max(iterable, [, key, default]) max(arg1, arg2,args[, key]) 函数1 1.212 2.23606797749979Out[48]: 6.16.1 6.1 6.16.1 6.1 6.1返回可迭代对象中最大的元素,或者返回两个及以上实参中最大的。
如果只提供了一个位置参数,它必须是非空 iterable ,返回可迭代对象中最大的元素;如果提供了两个及以上的位置参数,则返回最大的位置参数。
实现下面的函数,实现max()函数同样的功能,如果序列里有非数字类型的数据,可以忽略,如果序列是空的,可以直接返回None In [55]:def my_max (lst):'''返回lst 里所有数据的最大值(Tuple, list, set):param lst::return:'''dd = float ("inf")max_value = ddif not isinstance (lst, (list , tuple , set )):return Noneif len (lst) == 0:return len (lst)for i in lst:if isinstance (i, (float , int )):if i > max_value:max_value = ielse :print ("error!!!")returnreturn max_valueif __name__ == "__main__":print (max ([1.1,2,3]), max ((1.1, 2, 3)), max ({1.1,2,3}))print (my_max([1.1,2,3]), my_max((1.1, 2, 3)), my_max({1.1,2,3})) #print(sum([1.1,2,3, [1,2,3]]))#print(my_sum([1.1,2,3,[1,2,3]]))6. min(iterable, [, key, default]) min(arg1, arg2,args[, key]) 函数返回可迭代对象中最小的元素,或者返回两个及以上实参中最小的。
如果只提供了一个位置参数,它必须是非空 iterable ,返回可迭代对象中最小的元素;如果提供了两个及以上的位置参数,则返回最小的位置参数。
3 3 33 3 3实现下面的函数,实现min()函数同样的功能,如果序列里有非数字类型的数据,可以忽略,如果序列是空的,可以直接返回NoneIn [57]:def my_min(lst):'''返回lst里所有数据的最小值(Tuple, list, set):param lst::return:'''dd = float("inf")min_value = ddif not isinstance(lst, (list, tuple, set)):return Noneif len(lst) == 0:return len(lst)for i in lst:if isinstance(i, (float, int)):if i < min_value:min_value = ielse:print("error!!!")returnreturn min_valueif __name__ == "__main__":print(min([1.1,2,3]), min((1.1, 2, 3)), min({1.1,2,3}))print(my_min([1.1,2,3]), my_min((1.1, 2, 3)), my_min({1.1,2,3}))#print(sum([1.1,2,3, [1,2,3]]))#print(my_sum([1.1,2,3,[1,2,3]]))1.1 1.1 1.11.1 1.1 1.17. class int([x]) class int(x, base=10)函数返回一个基于数字或字符串 x 构造的整数对象,或者在未给出参数时返回 0, 对于浮点数,它将向零舍入。