演示示例:
‘’‘
将一个指定的列表中的偶数,保存到一个新的列表中返回。
’‘’
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn(list1):
new_list = []
for i in list1:
if i % 2 == 0:
new_list.append(i)
return new_list
r = fn(list1)
print(r)
打印输出结果:
[2, 4, 6, 8, 10]
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn2(i):
if i % 2 == 0:
return True
def fn1(fn):
new_list = []
for i in liat1:
if fn(i):
new_list.append(i)
retrue new_list
res = fn1(list1)
print(res)
打印输出结果:
[2, 4, 6, 8, 10]
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn1(i):
if i % 2 == 0:
return True # 返回真值(条件满足则继续向下执行,不满足则返回上部重新执行。)
# 外部函数的作用:可以多次使用,避免代码重复。
def fn(fun, list1): # 将实参fn1()传递给形参fun,完成外部函数的调用。
new_list = []
for i in list1:
if fun(i):
new_list.append(i)
return new_list
r = fn(fn1, list1) # 将函数对象fn1()调用(传参)为实参。就是调用函数fn()内部的代码
print(r)
打印输出结果:
[2, 4, 6, 8, 10]
执行流程:
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn1(i):
if i % 2 == 0:
return True
print(filter(fn1,list1)) # 得出对象
print(list(filter(fn1,list1))) # 得出结果
打印输出结果:
<filter object at 0x7fafdf642130>
[2, 4, 6, 8, 10]
注:如果想要得到相应的结果则需要对打印输出结果进行相应转换,否则只会得出结果的函数对象。
def fn(a,b)
reture a + b
fn(1 , 2)
print(lambda a, b: a + b)
print(lambda a , b: a + b)(1 , 2)
打印输出结果:
<function <lambda> at 0x7fd54f1ce040>
3
示例2:
res = lambda a, b: a + b
print(res(1, 3))
# 例如2:
res = (lambda a, b: a + b)(1, 3)
print(res)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-10/上课代码/02-匿名函数.py
4
4
Process finished with exit code 0
演示示例:
def fun_out(num1):
# 定义一个内部函数
def fun_inner(num2):
# 内部函数用到了外部函数的变量或者参数
res = num1 + num2
print(res)
print(id(num1))
fun_inner(2)
print(id(num1))
# 返回函数对象fun_inner
return fun_inner
f = fun_out(1)
f(2)
# f(3)体现闭包的作用
f(3)
打印输出结果;
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-10/上课代码/03-函数的闭包.py
4469021376
3
4469021376
3
4
Process finished with exit code 0
def fun_out(num1):
def fun_inner(num2):
nonlocal num1
# nonlocal 关键字用来在函数或其他作用域中使用外层(非全局)变量
# 1. 如果在内部函数中仅仅读取外部变量,可以不在此变量前加nonlocal。
# 2. 如果在内部函数中尝试进行修改外部变量,且外部变量为不可变类型,则需要在变量前加nonlocal。
# 3. 如果变量为可变类型,则变量前不需要添加nonlocal。
num1 = 10
r = num1 + num2
print(r)
print(num1)
fun_inner(2)
print(num1)
return fun_inner
r = fun_out(1)
打印输出结果:
1
12
10
演示实例:
def fn1():
print('我是fn1')
# 启用装饰器(装饰fn1)
def fn():
print('函数开始执行!')
fn1()
print('函数执行结束!')
fn()
打印输出结果:
函数开始执行!
我是fn1
函数执行结束!
def fun_out(fn):
def fun_inner(*args, **kwargs):
print('函数开始执行')
r = fn(*args, **kwargs)
print('函数执行结束')
return r
return fun_inner
@fun_out # 装饰器语法糖的写法
def add(a, b):
return a + b
r = add(1, 2)
print(r)
@fun_out
def qiuji():
print(111)
qiuji()
# f = fun_out(add)
# r = f(1, 2)
# print(r)
# 语法糖: @fun_out 等价于 fun_out(fn)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-10/老师上课讲解代码/装饰器的使用.py
函数开始执行
函数执行结束
3
函数开始执行
111
函数执行结束
Process finished with exit code 0
def fn(fun):
def new_fun():
print('函数执行开始')
fun()
print('函数执行结束')
return new_fun
# 需要的新功能
def fn1():
print('我是fn1')
r = fn(fn1)
r()
打印输出结果:
函数执行开始!
我是fn1
函数执行结束!
函数执行流程:
演示示例:
def fn(fun):
def new_fun(*args,**kwargs):
print('函数执行开始!')
r = fun(*args, **kwargs)
print('函数执行结束!')
return r
return new_fun
# 需要装饰的函数:
def add(a, b):
return a + b
r = fn(add)
r(1,2)
print(r)
打印输出结果:
函数执行结束!
函数执行开始!
<function fn.<locals>.new_fun at 0x7ffb102ce1f0>
函数执行流程:
与普通装饰器同理
值得注意的是虽然我们输入了实参,但是最后结果,并不是我们想要的结果,而是一个对象.
因为我们赋值的1,2都穿参args,kwargs没有值,虽然a 和b。还是1 和2。
但是**kwargs是None,没有值,导致运算变量r无法正常打印出3.
def fn(fun):
def new_fun(*args,**kwargs):
print('函数执行开始!')
r = fun(*args, **kwargs)
print('函数执行结束!')
return r
return new_fun
# 需要装饰的函数:
def fn1():
print('我是fn1')
def add(a, b):
return a + b
@fn
def speak():
print('好好学习!')
speak()
打印输出结果:
函数执行开始!
好好学习!
函数执行结束!
注意:
@fn 等价于speak = fn(speak)
list1 = ['cheney', 'jerry', 'amy', '居然', 'tony', 'anny', 'james','豆腐', 'wolf']
result = [name for name in list1 if len(name) > 4]
print(result)
打印输出结果:
['cheney', 'jerry', 'james']
# generator = (表达式 for 变量 in 旧列表 if 条件)
# print(next(generator)) next取值得到数据
# 再用推倒式:r = [表达式 for i in generator]
# print(r) 得到想要的结果
def fn():
print('fn执行了!')
i = 1
while True:
yield i
i += 1
r = fn()
print(r)# 变成生成器了
print(next(r))
打印输出结果:
<generator object fn at 0x7fdf7357f430>
fn执行了!
1
* 模式二:
def fn():
print('fn执行了!')
i = 1
while True:
yield i
i += 1
r = fn()
# print(r)# 变成生成器了
print(next(r))
print(next(r))
打印输出结果:
fn执行了!
1
2
# 创建迭代器
list1 = [1, 2, 3, 4, 5, 6]
iterator = iter(list1)
print(type(iterator))
print(next(iterator))
打印输出结果:
<class 'list_iterator'>
1
在结果处,我们可以看到iterator就已经是一个列表迭代器了。
'''
请使用装饰器实现已存在的函数的执行所花费的时间。
'''
import time
def time1(fn):
def time2():
print('装饰器开始执行!')
begin = time.time()
fn()
end = time.time()
print('装饰器结束执行!')
print('函数执行时间为{}'.format(end - begin))
return fn
return time2
@ time1
def time3():
j = 0
for i in range(1, 100000):
j = j + i
print(j)
time3()
打印输出结果:
4999650006
4999750003
4999850001
4999950000
装饰器结束执行!
函数执行时间为0.34472131729125977
Process finished with exit code 0