今日内容面试
内容回顾闭包
函数的参数传递的是什么?【内存地址=引用 or 值】
v = [11,2,33,4]app
def func(arg): print(id(arg)) # 列表内存地址 print(id(v)) # 列表内存地址 func(v) # 传递的是内存地址。
函数也能够返回
def func():
def inner():
pass
return innerdom
v = func()
函数不被调用,内部代码永远不执行。
def func():
return i
func_list = []
for i in range(10):
func_list.append(func)函数
print(i) # 9 v1 = func_list[4]()#9 v2 = func_list[0]()#9 func_list = [] for i in range(10): # func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。) func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。) print(func_list)#列表,10个函数的内存地址。 print(func_list[2]())#9
执行函数时,会新建立一块内存保存本身函数执行的信息 => 闭包
def base():
return icode
def func(arg): def inner(): return arg return inner base_list = [] # [base,base,] func_list = [] # [由第一次执行func函数的内存地址,内部arg=0 建立的inner函数,有arg=1的inner函数 ] for i in range(10): # i = 0 ,1 base_list.append(base) func_list.append(func(i)) # 1. base_list 和 func_list中分别保存的是什么? """ base_list中存储都是base函数。 func_list中存储的是inner函数,特别要说的是每一个inner是在不一样的地址建立。 """ # 2. 若是循环打印什么? for item in base_list: v = item() # 执行base函数 print(v) # 都是9 for data in func_list: v = data() print(v) # 0 1 2 3 4 。在for循环过程当中,func(i)已经执行,for循环过程当中i的变化值已经被包在其中。
总结:对象
内容详细内存
2.装饰器作用域
v = 1 v = 2 # ######################## def func(): pass v = 10 v = func # ########################## def base(): print(1) def bar(): print(2) bar = base bar() def func(): def inner(): pass return inner v = func() print(v) # inner函数 # ######################################### def func(arg): def inner(): print(arg) return inner v1 = func(1) v2 = func(2) print(v1,v2) #两个inner函数内存地址。 # ######################################### def func(arg): def inner(): arg() return inner def f1(): print(123) v1 = func(f1) v1() # ########################################### def func(arg): def inner(): arg() return inner def f1(): print(123) return 666 v1 = func(f1) result = v1() # 执行inner函数 / f1含函数 -> 123 print(result) # None # ########################################### def func(arg): def inner(): return arg() return inner def f1(): print(123) return 666 v1 = func(f1) result = v1() # 执行inner函数 / f1含函数 -> 123 print(result) # 666 def func(): print(1) v1 = func func = 666
===========================装饰器=========v8
def func(arg): def inner(): print('before') v = arg() print('after') return v return inner def index(): print('123') return '666' # 示例一 """ v1 = index() # 执行index函数,打印123并返回666赋值给v1. """ # 示例二 """ v2 = func(index) # v2是inner函数,arg=index函数 index = 666 v3 = v2() """ # 示例三 """ v4 = func(index) index = v4 # index ==> inner index() """ # 示例四 index = func(index) index() def func(arg): def inner(): v = arg() return v return inner # 第一步:执行func函数并将下面的函数参数传递,至关于:func(index) # 第二步:将func的返回值从新赋值给下面的函数名。 index = func(index) @func def index(): print(123) return 666 print(index) index=func(index) index()
装饰器:在不改变原函数内部代码的基础上,在函数执行以前和以后自动执行某个功能。 (以前和以后增长某些功能-func)
应用:
# 计算函数执行时间 import time def wrapper(func): def inner(): start_time = time.time() v = func() end_time = time.time() print(end_time-start_time) return v return inner @wrapper def func1(): time.sleep(2) print(123) @wrapper def func2(): time.sleep(1) print(123) def func3(): time.sleep(1.5) print(123) func1() #装饰器做用,在变更原函数(func)的基础上,增长原函数的功能(在wrapper里增长)。 #在不改变原函数内部代码的基础上,在函数执行以前和以后自动执行某个功能。
总结
编写装饰器 和应用
# 装饰器的编写
def x(func):
def y():
# 前
ret = func()
# 后
return ret
return y
# 装饰器的应用 @x def index(): return 10 @x def manage(): pass # 执行函数,自动触发装饰器了 v = index() print(v)
装饰器应用格式
@外层函数
def index():
pass
index()
问题:为何要加 *args, **kwargs
3.推导式
基本格式
"""
目的:方便的生成一个列表。
格式:
v1 = [i for i in 可迭代对象 ]
v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true才进行append
"""
v1 = [ i for i in 'alex' ]
v2 = [i+100 for i in range(10)]
v3 = [99 if i>5 else 66 for i in range(10)]
def func(): return 100 v4 = [func for i in range(10)] v5 = [lambda : 100 for i in range(10)] result = v5[9]() def func(): return i v6 = [func for i in range(10)] result = v6[5]() v7 = [lambda :i for i in range(10)] result = v7[5]() v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题 # 1.请问 v8 是什么? # 2.请问 v8[0](2) 的结果是什么? # 面试题 def num(): return [lambda x:i*x for i in range(4)] # num() -> [函数,函数,函数,函数] print([ m(2) for m in num() ]) # [6,6,6,6] # ##################### 筛选 ######################### v9 = [i for i in range(10) if i > 5]
今日总结
变量赋值
def func():
print(1)
v1 = func func = 666
模块
import time
v = time.time() # 获取当前时间 time.sleep(2) # 睡2秒