每日习题

每日一题

1.下面这段代码的输出结果是什么,并给出你的解释
def index():
    return [lambda x : i * x for i in range(4)]
print([m(2) for m in index()]) 

fun = [lambda x: x*i for i in range(4)]
for item in fun:
    print(item(1))
上述式子的输出结果:
预计结果为:0, 2, 4, 6
实际输出为:3, 3, 3, 3
最终输出为:6 ,6 ,6 ,6
列表解析式运行时,列表解析式命名空间中的 i 经过循环依次变化为 0-->1-->2-->3 最后固定为 3 ,
所以当 lambda x: x*i 内层函数运行时,去外层函数取 i 每次都只能取到 3
解决办法:变闭包作用域为局部作用域。
给内层函数 lambda x: x*i 增加参数,命名空间中有了用来存储每次的 i ,
即改成 [lambda x, i=i: x*i for i in range(4)] 这样每一次,内部循环生成一个lambda 函数时,

2.有一个列表[3,4,1,2,5,6,6,5,4,3,3]请写出一个函数,找出该列表中没有重复的数的总和
li= [3,4,1,2,5,6,6,5,4,3,3]

def func(li):
    xx = 0
    sss = list(set(li))
    print(sss)
    for i in range(len(sss)):
        xx += int(sss[i])
    return xx

t = func(li)
print(t)
3.什么是函数的递归调用?书写递归函数需要注意什么?你能否利用递归函数打印出下面列表中每一个元素(只能打印数字),l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]

要有结束条件  
l = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]

def func1(listl):
    for item in listl:
        if type(item) is not list:
            print(item)
        else:
            func1(item)

func1(l)

#or
def get(seq):
    for item in seq:
        if type(item) is list:
            get(item)
        else:
            print(item)
get(l)
二分法是算法的一种,算法是如何高效地解决问题的思路
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101]  # 从小到大排列的数字列表
def binary_search(find_num,nums):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return
    # 功能
    mid_index = len(nums) // 2
    if find_num > nums[mid_index]:
        # in the right
        nums=nums[mid_index+1:]
        # 重新运行功能,传入新列表
        binary_search(find_num,nums)
    elif find_num < nums[mid_index]:
        # in the left
        nums=nums[:mid_index]
        # 重新运行功能,传入新列表
        binary_search(find_num,nums)
    else:
        print('find it')

# binary_search(97,nums)
binary_search(95,nums)
原文地址:https://www.cnblogs.com/shaozheng/p/11907485.html