路飞学城Python开发21天入门
侵权删!
Day13
今日内容
- 装饰器
- 推导式
- 模块
内容回顾
1、函数
-
参数
-
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()
-
特殊
- 默认没返回就是None
- return 1,2,3, 等价于返回元组(1,2,3,)
-
-
执行函数
-
函数不调用,内部代码永远不执行
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]()
-
执行函数的时候,会新创建一块内存保存自己函数执行的信息(闭包)
-
总结:
- 传参:位置参数在前,关键字在后
- 函数不调用,内部代码永远不执行
- 每次调用函数时,都会为此调用开辟一块内存。内存中可以保存自己以后想要用的值
- 函数是作用域,如果自己的作用域中没有,就往上级作用域找。
2、内置和匿名函数
3、模块
- getpass
- random
- hashlib
内容详细
1、作业讲解
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
-
3、推导式
-
列表推导式
-
基本格式
''' 目的:方便的生成一个列表 格式: 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) # 睡两秒