Day14.2 面试题、滑动序列

1.滑动序列面试题

# 作业:可滑动的序列 自定义一个函数 根据参数n的值,变成对应个元素的容器 (zip)
"""
listvar = [1,2,3,4,5,6,7,8,9]
n = 2
listvar = [[1,2],[3,4],[5,6],[7,8]]
n = 3
listvar = [[1,2,3],[4,5,6],[7,8,9]]
n = 4
listvar = [[1,2,3,4],[5,6,7,8]]
"""
"""
#复习
lst1 = [1,5]
lst2 = [2,6]
lst3 = [3,7]
lst4 = [4,8]
it = zip(lst1,lst2,lst3,lst4)
print(list(it))

# [(1, 2), (3, 4), (5, 6), (7, 8)]
# n = 2
lst1 = [1 , 3 , 5 , 7 ,9]   listvar[0::2] # 0 2 4 6 8 
lst2 = [2 , 4 , 6 , 8 ]     listvar[1::2]
it = zip(lst1,lst2)
print(list(it))

#listvar = [[1,2,3],[4,5,6],[7,8,9]]
n=3
lst1 = [1,4,7]  listvar[0::3] # 0 3 6 
lst2 = [2,5,8]  listvar[1::3]
lst3 = [3,6,9]  listvar[2::3]
it = zip(lst1,lst2,lst3)

#listvar = [[1,2,3,4],[5,6,7,8]]
lst1 = [1,5,9]    listvar[0::4] # 0 4 8
lst2 = [2,6]      listvar[1::4] 2 6
lst3 = [3,7]      listvar[2::4]
lst4 = [4,8]      listvar[3::4]
it = zip(lst1,lst2,lst3,lst4)

range(4)
"""
# n = 2
# lst1 = [1 , 3 , 5 , 7 ,9]   #listvar[0::2] # 0 2 4 6 8 
# lst2 = [2 , 4 , 6 , 8 ]     #listvar[1::2]
# it = zip(lst1,lst2)
# print(list(it))
# zip(listvar[0::2],listvar[1::2])


listvar = [1,2,3,4,5,6,7,8,9]
n = 2
res = [listvar[i::n] for i in range(n)]
print(res)
# [[1, 3, 5, 7, 9], [2, 4, 6, 8]]

n = 3
res = [listvar[i::n] for i in range(n)]
print(res)
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

n = 4
res = [listvar[i::n] for i in range(n)]
print(res)
# [[1, 5, 9], [2, 6], [3, 7], [4, 8]]

# 把大列表当中的每一个小列表一个一个的拿出来当成zip的参数进行赋值
# 过程化版本
n = 5
it = zip(*[listvar[i::n] for i in range(n)])
print(list(it))
# [(1, 2, 3, 4, 5)]

# 普通版本
def func(listvar,n):
    return zip(*[listvar[i::n] for i in range(n)])
res = func(listvar,2)
print(list(res))
# [(1, 2), (3, 4), (5, 6), (7, 8)]
# 优化版本
func = lambda listvar,n : zip(  *[  listvar[i::n] for i in range(n)  ]   )
it = func(listvar,3)
print(list(it))
# [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
# 复习 * 和 ** 的魔术用法(是函数的调用处使用)
def func(a,b,c):
    print(a,b,c)
# 把列表当中的每一个元素,一个一个拿出来作为func的参数进行赋值;
listvar = [1,2,3]
func(*listvar)

def func(a=1,b=2,c=3):
    print(a,b,c)
# 1 2 3
dic = {'a':10,"b":12,"c":13}
func(**dic) # a=10,b=12,c=13
# 10 12 13

# ###2.值是多少
def extendList(val, list=[]):
  list.append(val)
  return list

list1 = extendList(10)
list2 = extendList(123, [])
list3 = extendList('a')

函数如果定义一个默认形参,那么这个值会在内存当中提前保留一份
在函数调用时,如果用户定义了实参,那么使用用户自己的实际值
如果用户没有给与实际参数,那么使用默认形参值
list1 = extendList(10)
print(list1)  #[10]
list2 = extendList(123, [])
print(list2)  #[123]
list3 = extendList('a')
print(list3)  #[10,a]


# ###3.res多少?
def func():
  return [lambda x : i*x for i in range(4)]

res = [m(2) for m in func()]
print(res)

# 在ceshi函数当中 跑循环4遍 ,循环定义4个函数
# 注意的是,遍历的时候仅仅是定义,只有在调用的时,才会运行函数体,
# 所以定义时,i变量不会直接走入函数体内参与运算
# 
# 最后通过lst返回,lst当中包含4个函数,因为内函数func使用了外函数ceshi的变量i,
# 所以变量i延长了它的生命周期,这是闭包的特点
# 
# 返回出来之后,通过列表推导式 , 循环调用了4次函数,这个时候 2 与先前的i 参与运算,
# 因为i值已经全部循环结束,最后的i = 3,所以每个函数的运算结果 都是 2*i => 2 * 3 =>6
# 因为循环4次,所以列表里 产生了4 个 6;
'''

def ceshi():
    lst = []
    for i in range(4):
        def func(x):
            return i*x        
        lst.append(func)
    return lst


lst = ceshi()
print(lst)
res = len(lst) #4
'''
#
# [
# <function ceshi.<locals>.func at 0x000001805BB50EA0>, 
# <function ceshi.<locals>.func at 0x000001805BB50F28>, 
# <function ceshi.<locals>.func at 0x000001805BB50E18>, 
# <function ceshi.<locals>.func at 0x000001805BB85048>
# ]
# lst = [函数1,函数2,函数3,函数4]
# 函数的定义处和函数的调用处要分开
# 只有在函数调用的时候,才会执行函数体,
# 定义的时候只是单纯的定义包括参数,而没有去调用里面的内容

##4.打印多少?
def add(a,b): #普通求和函数
  return a + b
def test(): #生成器函数
  for i in range(4):
  yield i
g=test()
for n in [2,10]:
  g=(add(n,i) for i in g)
print(list(g))

"""
定义一个生成器可以使用两种方式 要么使用生成器表达式,要么使用生成器函数,
注意只有调用时,才能执行生成器里面的内容 , next,for,list都是在调用生成器
而g=(add(n,i) for i in g) 写法是在定义生成器
next(g) for .. in g  list(g) 是在调用


在循环时候,只是定义了生成器2次,没有在调用,下次再拿取n的时,n已经等于10

第一次调用生成器
先计算g=(add(n,i) for i in (0,1,2,3)) 得到结果得范围 g = (10,11,12,13)
第二次调用生成器
先计算g=(add(n,i) for i in (10,11,12,13)) 得到结果得范围 g = (20,21,22,23)
list进行强转,得到列表[20,21,22,23]
"""
'''
g=(add(n,i) for i in g)  # i的范围 0 1 2 3
add(n,0) => add(10,0) => 10
add(n,1) => add(10,1) => 11
add(n,2) => add(10,2) => 12
add(n,3) => add(10,3) => 13
g = (10,11,12,13)

g=(add(n,i) for i in g)
add(n,10) => add(10,10) => 20
add(n,11) => add(10,11) => 21
add(n,12) => add(10,12) => 22
add(n,13) => add(10,13) => 23
[20,21,22,23]

猜你喜欢

转载自www.cnblogs.com/longerandergou/p/10959822.html