面试题

def extendList(val, list=[]):
    list.append(val)
    return list

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


'''
a =  5
a =  6
print(a)
lst = []
lst.append(1)
print(lst)
lst.append(2)
print(lst)
lst = []
lst.append(1)
print(lst)
'''

"""
函数如果定义一个默认形参,那么这个值会在内存当中提前保留一份
在函数调用时,如果用户定义了实参,那么使用用户自己的实际值
	         如果用户没有给与实际参数,那么使用默认形参值
print("<===>")
def func(a = 5):
	print(a)
func() # a = 5
func(6)

def func(val, list=[]):
    list.append(val)
    print( list)
func(1)
func(2,[5,6,7])
func(3)

"""

# ###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]
'''
for  m in lst:
	'''
	def func(x):
		return i*x	
	'''
	res = m(2)
	print(res)
'''
函数的定义处和函数的调用处要分开
只有在函数调用的时候,才会执行函数体,
定义的时候只是单纯的定义包括参数,而没有去调用里面的内容
'''

for i in range(4):
	pass
print(i)



# ###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]
'''

for n in [2,10]:
	pass
print(n)

  

原文地址:https://www.cnblogs.com/huangjiangyong/p/10920450.html