编写一个函数:函数接收一个列表,将列表中所有的奇数,放到偶数之前,要求过程中不增加新的列表
def fun(*args): # 因为奇数放在偶数之前,标记出奇数中的偶数 # 并将该偶数取出放在数列的最后面 # 同时将奇数中间的偶数标记为"*" args_long = len(args) args = list(args) j = 0 for i in range(args_long): if args[i] % 2 == 0: j += 1 args.append(args[i]) args[i] = "*" # 将奇数中的偶数(已经标记为*)删去 new_args_long = len(args) k = 0 for i in range(new_args_long-j-k): if args[i-k] == "*": del args[i-k] k +=1 return argsprint(fun(*[1,2,3,4,5,6,7,8,9]))print(fun(*[9,8,7,6,5,4,3,2,1]))
运行
[1, 3, 5, 7, 9, 2, 4, 6, 8][9, 7, 5, 3, 1, 8, 6, 4, 2]
将该方案进行优化
def fun(*args): # 因为奇数放在偶数之前,标记出奇数中的偶数 # 并将该偶数取出放在数列的最后面 # 同时将奇数中间的偶数标记为"*" args_long = len(args) args = list(args) j = 0 for i in range(args_long): if args[i-j] % 2 == 0: j += 1 args.append(args[i]) #追加至列表尾部 del args[i] #将该位置的偶数删去 return argsprint(fun(*[1,2,3,4,5,6,7,8,9])) #[1, 3, 5, 7, 9, 2, 4, 6, 8]print(fun(*[9,8,7,6,5,4,3,2,1])) #[9, 7, 5, 3, 1, 8, 6, 4, 2]
问题当没有 args = list(args) 这段代码
Traceback (most recent call last): File "t12.py", line 14, inprint(fun(*[1,2,3,4,5,6,7,8,9])) #[1, 3, 5, 7, 9, 2, 4, 6, 8] File "t12.py", line 10, in fun args.append(args[i]) #追加至列表尾部AttributeError: 'tuple' object has no attribute 'append'
会直接报错。
报错原因是 元组 没有 append 属性。
元组?
实际上,虽然我们是实参传入的是列表,但是再函数调用后将其作为元组进行运算;所以必须进行类型转换。