Python之函数下

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)

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值