1、闭包
# def test_one():
# print("---1---")
#
#
# # test_one() # 函数的调用
# t_o = test_one()
# print(id(test_one()))
# print(id(t_o)) # t_o变量指向了test_one函数的调用
# # t_o() # 报错
def test(number): # number 形参 临时变量
print("--1--")
def test_in(number_in):
print(number_in)
print("--2--")
return number_in + number
print("--3--")
return test_in
# test()执行完毕时,输出1,3。并且函数里面的变量会被释放掉(number)
res = test(30) # res = test_in
res1 = res(25) # test_in()
print(res1) # 45,说明在外层函数执行完毕时,number并没有被释放,而是继续给内层函数使用。
"""
总结:闭包它是一种现象
一般情况下,外函数执行完毕时,临时变量会被释放。
但此时,外函数发现自己的临时变量会在将来被使用,
所以外函数结束的时候,在返回内函数引用的同时,将外函数的临时变量与内函数进行绑定。
这也是为什么当外函数结束,但内函数仍然可以使用外函数临时变量的原因。
"""
2、装饰器
2.1 引出装饰器
import time # python内置模块,时间模块
# 计算时间得函数
def calcu_time(func):
start = time.time()
func()
end = time.time()
print(f"spend {end - start}")
def test1():
print("--test1--")
time.sleep(2)
def test2():
print("--test2--")
time.sleep(2)
calcu_time(test1)
calcu_time(test2)
"""
就是在不改变函数源代码得情况下为函数添加新得功能
"""
2.1 装饰器介绍
# 需要给各个函数添加上打印hello world得功能
def print_hw(f):
print("hello world")
return f
@print_hw # @装饰器函数名称 test2 = print_hw(test)
def test():
sum_li = sum([12, 3, 4])
print(sum_li)
return sum_li
@print_hw
def test2():
print("我是老amy")
# test2 = print_hw(test) # test函数引用作为实参 test2 = f = test
# test2() # test2() = f() = test()
test()
test2()
"""
注意:
1. test()函数未调用得时候,装饰器就已经执行
"""
2.1 使用装饰器优化
import time
"""
此处是问题代码,因为重复调用了test1()
"""
# # 计算时间得函数
# def calcu_time(func): # func = test1
# start = time.time()
# func() # test1()
# end = time.time()
# print(f"spend {end - start}")
# return func
#
#
# def test1():
# print("--test1--")
# time.sleep(2)
#
#
# test = calcu_time(test1) # test = func = test1
# test()
# 计算时间得函数
def calcu_time(func):
def test_in(): # 1.外函数里面有内函数
start = time.time()
func() # test1() # 2.内函数引用了外函数得临时变量
end = time.time()
print(f"spend {end - start}")
return test_in # 3.内函数的引用作为外函数的返回值
@calcu_time # test = calcu_time(test1)
def test1():
print("--test1--")
time.sleep(2)
@calcu_time
def test2():
print("--test2--")
time.sleep(2)
# test = calcu_time(test1) # test = test_in
# test() # test_in()
# test = calcu_time(test2) # test = test_in
# test() # test_in()
test1()
"""
此处,形成闭包的现象。
1.嵌套函数
2.内层函数引用外层函数变量-->函数名本质也是变量
3.内函数的引用作为外层函数的返回值
"""
3、推导式
"""
生成一个[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0] 的列表
"""
# print(range(0, 11, 0.5)) # 报错 步长不能为浮点数
# li = []
# for i in range(1, 21):
# # print(i/2)
# li.append(i/2)
#
#
# print(li)
# 列表推导式的便利之处
# li1 = [i/2 for i in range(1, 21)]
# print(li1)
"""
有列表如:li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]。
需求:将li列表 <0 的数进行平方 生成新列表
"""
# li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]
# li1 = []
#
# for i in li:
# if i < 0:
# i = i**2
# li1.append(i)
#
# print(li1)
# 将小于0的过滤出来 filter()
# 将过滤出来的元素 映射做平方操作
# fil = list(filter(lambda x: x < 0, li))
# print(list(map(lambda x: x**2, fil)))
# 注意:此处不是三目运算符!!!
# li2 = [i**2 for i in li if i < 0]
# print(li2)
# for i in "123":
# for j in "abc":
# print(i+j)
# 列表推导式的嵌套
# print([i+j for i in "123" for j in "abc"])
# 实现:以下列表中的元素 与 索引 --> {key:value} 的形式
# li = ["age", "name", "gender"]
# dic = {i: li.index(i) for i in li}
# print(dic)
# 实现生成10个1-100之间的元素,进行去重
# 集合推导式
# import random
# s1 = {random.randint(1, 100) for i in range(10)}
# print(s1)
# 注意:没有元组推导式,而是生成器
tu = (i for i in range(3))
print(tu) # generator
print(type(tu)) # generator
print(tuple(tu)) # 转为tuple类型
作业
题1
names = ["jerry", "hansen", "Amy", "Wendy", "Tom", "Bob"]
print([i.upper() for i in names if len(i) > 3])
题2
res = [(i, j) for i in range(5) if i % 2 == 0 for j in range(5) if j % 2 == 1]
print(res)
题3
names = ['Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob', 'JAMES', 'jAMeS']
distinct_name = {name.capitalize() for name in names}
print(distinct_name)