路飞学城Python开发21天入门
侵权删!
参数
def(a1,a2): pass
def(a1,a2=None): pass 默认参数推荐用不可变类型,慎用可变类型
def(*arg,**kwargs): pass
注意:位置参数>关键字参数
面试题
函数可以做参数
def func(arg):
arg()
def show():
pass
func(show)
函数的参数传递的是什么
v = [11,22,33,44]
def = func(arg):
print(id(arg))
print(id(v)) # 列表的内存地址
func(v)
# 传递的是内存地址
*args 和 **kwargs的作用
返回值
常见的数据类型
函数也可以返回
def func():
def inner():
pass
return inner
v = func()
特殊
执行函数
函数不调用,内部代码永远不执行
def func():
return 1
func_list = []
for i in range(10):
func_lsit.append(func)
print(i)
v = func_list[0]()
v = func_list[4]()
func_list = []
for i in range(10):
func_list.append(lambda :i)
print(func_list)
func_list[2]()
执行函数的时候,会新创建一块内存保存自己函数执行的信息(闭包)
总结:
def func(arg):
def inner():
print('before')
v = arg()
print('after')
return v
return inner
def index():
print('123')
return '666'
index = func(index)
index()
# 在不改变index函数内部的情况下,在前后加上before和after代码段
def func(arg):
def inner():
print('before') #
v = arg()
print('after') #
return v
return inner
# 第一步:执行func函数并将下面的函数当做参数传递。相当于func(index)
# 第二步:将func的返回值重新赋值给下面的函数名。index = func(index)
@func
def index():
print('123')
return '666'
装饰器:在不改变原函数内部代码的基础上, 在函数执行之前和之后自动执行某个功能。
应用:
# 计算函数执行时间
import time
def wrapper(func):
def inner():
start_time = time.time()
v = func()
end_time = time.time()
print(start_time - end_time)
return v
return inner
@wrapper
def func1():
time.sleep(1)
print(123)
func1()
目的:不改变原函数的基础上,在函数执行前后自定义一些功能。
编写装饰器 和应用:
# 编写
def x(func):
def y():
ret = func()
return ret
return y
# 应用
@x
def index():
pass
# 执行
v = index()
print(v)
应用场景:想要为函数扩展功能时,可以选择装饰器。
记住:
装饰器编写格式
def 外层函数(参数):
def 内层函数(*args,**kwargs):
return 参数(*args,**kwargs)
return 内层函数
装饰器应用格式
@外层函数
def index():
pass
index()
为什么要加*args,**kwargs
列表推导式
基本格式
'''
目的:方便的生成一个列表
格式:
v1 = [i for i in 可迭代对象 ]
v2 = [i for i in 可迭代对象 if 条件] # 条件为True才append
'''
变量 = [ for循环的变量 for循环一个可迭代对象 ]
value = [ i for i in 'alex' ]
# ['a','l','e','x']
v2 = [i+100 for i in range(10)]
v2 = [99 if i>5 else 66 for i in range(10)]
def func():
return 123
v3 = [func for i in range(10)]
v4 = [lambda :100 for i in range(10)]
result = v4[0]()
v5 = [lambda :100+i for i in range(10)]
result = v5[0]()
# 面试题一
v6 = [lambda x:x*i for i in range(10)]
result = v6[0]()
# 1.请问 v6 是什么?
# 2.请问 v6[0](2) 是什么?
# 面试题二
def num():
return [lambda x:i*x for i in range(4)]
print([ m(2) for m in num() ])
# 筛选 先循环再判断再append
v7 = [i for i in range(10) if i>5]
集合推导式
类比列表推导式即可
字典推导式
v1 = {
'k'+str(i):i for i in range(3) }
# v1 = {'k0':0,'k1':1,'k2':2}
总结
装饰器
推导式
模块
import time
v = time.time() # 获取当前时间
time.sleep(2) # 睡两秒