一、闭包
- 闭包的三大条件
- 1、函数嵌套
- 2、将内部函数作为返回值返回
- 3、内部函数必须使用到外部函数的变量或者参数
- 闭包的作用(特性):闭包可以保存外部函数的变量不被销毁
代码演示:
def fun_out(num1):
def fun_inner(num2):
res = num1 + num2
print(res)
return fun_inner
f = fun_out(1) # f = fun_inner
f(2)
fun_out(1)(2) # 函数 的调用等于函数的返回值 fun_out()() = fun_inner()
f = fun_out(1) # f = fun_inner
f(2)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/高级编程/闭包.py
3
3
3
Process finished with exit code 0
注:f = fun_out(1),f(2)等价于fun_out(1)(2)
二、装饰器
- 多重装饰器
代码演示实例:
def fun_out(fn):
def fun_inner(*args, **kwargs):
print('函数开始执行')
r = fn(*args, **kwargs) # r = add1()
print(r)
print('函数执行结束')
return fun_inner
def fun(fn):
def wrapper(*args, **kwargs):
print('我是第二个装饰器')
r = fn(*args, **kwargs)
print(r)
return wrapper
@fun
@fun_out # @fun_out == fun_out(add1) # 语法糖的写法
def add1(a, b):
return a + b
add1(1, 2)
def qiuji():
print(111)
# 装饰函数
def fun(fn):
print('函数开始执行')
fn()
print('函数执行结束')
fun(qiuji)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/高级编程/闭包.py
我是第二个装饰器
函数开始执行
3
函数执行结束
None
函数开始执行
111
函数执行结束
Process finished with exit code 0
三、列表推导式
- 推导式分为 列表推导式、字典推导式、集合推导式等。
- 在这里我们主要说其中一种也是用的最多列表推导式。
- 列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表简单理解就是由一个旧的列表来构建出一个新的列表。
列表推倒式基本演示: - 普通函数:
‘’‘
找到长度大于3的名字
’‘’
list = ['cheney', 'jerry', '居然', 'amy']
# 普通函数法:
def fn(list):
new_list = []
for i in list1:
if len(i) > 3:
new_list.append(i)
return new_list
res = fn(list)
print(res)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/高级编程/列表推导式.py
['cheney', 'jerry']
Process finished with exit code 0
- 列表推导式法:
- 语法:
- [表达式 for 变量 in 旧列表]
- [表达式 for 变量 in 旧列表 if 条件]
# 列表推导式语法
# [表达式 for 变量 in 旧列表]
list3 = [i for i in range(10)]
print(list3)
# # [表达式 for 变量 in 旧列表 if 条件]
list1 = ['cheney', 'jerry', '居然', 'amy']
list2 = [i*2 for i in list1 if len(i) > 3] # list2 = [i1, i2, i3, i4]
print(list2)
# 1-100之间能被4整除的数据放到新列表中 还要能被6整除的数
list4 = [i for i in range(1, 101) if i % 4 == 0]
list5 = [i for i in list4 if i % 6 == 0]
# 对于某某某在某某某中间,然后我们干嘛
list4 = [name+1 for name in range(1, 101) if name % 4 == 0 and name % 6 == 0]
print(list4)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/高级编程/列表推导式.py
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
['cheneycheney', 'jerryjerry']
[13, 25, 37, 49, 61, 73, 85, 97]
Process finished with exit code 0
四、生成器
- 时代背景:通过列表推导式我们可以直接创建出一个列表,但是受到内存的限制,我们不可能创造出一个无限大的列表。而且创建一个有200万个元素的列表,会占用很大的内存空间,而这个时候我们仅仅需要访问列表中几个元素,那么后面的元素就占用着空间就是一种浪费的行为。那么我们可不可以用几个元素就创建出几个元素。这样在一定程度上就优化了内存。那么在Python中有一种一边循环一边计算的机制就是生成器。
- 创建生成器的方式:
- 1、通过列表推导式的方式
list1 = [i for i in range(1, 101) if i % 4 == 0]
print(list1)
gen = (i for i in range(1, 101) if i % 4 == 0)
print(gen, type(gen)) # generator 生成器
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
list1 = [i for i in gen]
print(list1)
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/高级编程/生成器.py
[4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100]
<generator object <genexpr> at 0x7fb357ebff90> <class 'generator'>
4
8
12
16
[20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100]
Process finished with exit code 0
- 生成器的性质:生成器是一种特殊的迭代器,是一种容器。数据取完了就没有数据了,变成一个空的容器。如果没有取完,生成器会记住上一次取数据的位置,下次你再取的时候,就会在记住的位置继续取数据。
- 使用函数的方式得到生成器 —yield函数
- 2、通过函数的方式
def fun():
i = 0
while True:
i += 1
yield i # yield和return有同样得返回得效果, yield有阻塞程序得效果
# print(i)
#
#
r = fun()
print(r)
print(next(r))
print(next(r))
print(next(r))
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/高级编程/生成器.py
<generator object fun at 0x7feb260c7f90>
1
2
3
Process finished with exit code 0
五、迭代器
- 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,指导所有元素被访问完结束。
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
- 生成器是可迭代的,也是迭代器
- 列表是可迭代的,但不是迭代器
- 通过iter()函数可以将可迭代的变成一个迭代器
代码演示实例:
# 可迭代对象 实现了iter()这个方法
# 迭代器对象 实现了 next()\ iter()方法
list1 = [1, 2, 3, 4, 5]
tuple1 = (1, 2, 3, 4, 5)
itra = iter(list1)
itra1 = iter(tuple1)
print(itra) # list_iterator
print(itra1) # tuple_iterator
# 通过不同的可迭代对象可以转换为迭代器,但是对象本质不同
# list2 = [i for i in itra]
# print(list2)
# list3 = [i for i in itra]
# print(list3)
print(next(itra))
print(next(itra))
print(next(itra))
# 迭代器可以完成是事情,生成器都可以完成,而且生成器更加灵活
打印输出结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-11/上课代码/05-迭代器.py
<list_iterator object at 0x7fa78a3081c0>
<tuple_iterator object at 0x7fa78a308040>
1
2
3
Process finished with exit code 0