第1001次python入门——Day09

本文深入探讨了Python编程中的高阶函数、函数嵌套和闭包概念。通过实例讲解如何计算代码执行时间并进行优化,重点介绍了装饰器的使用及其详细解释,包括如何导入和应用不同模块如os、sys、math、random、datetime、time、calendar、hashlib和hmac等进行实际操作。
摘要由CSDN通过智能技术生成

高阶函数

# 1.把一个函数当做另一个函数的返回值
def test():
    print('我是test函数')
    return 'hello'

def demo():
    print('我是demo函数')
    return test

def bar():
    print('我是bar函数')
    return test()

# x = test()
# print(x)
#
# y = demo()  # y是test函数
# print(y)
# z = y()
# print(z)

a = bar()
print(a)

# 2.把一个函数当做另一个函数的参数,lambda表达式的使用
# sort filter map reduce
# 3.在函数内部再定义一个函数

函数的嵌套

def outer(x):
    m = 100  #局部变量
    print('我是outer函数')

    def inner():  # inner函数是定义在outer函数内部的一个函数
        print('我是inner函数')

    if x > 18:
        inner()

    return 'hello'


outer(121)



# print(m)
# inner()

闭包的概念

# 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)

def outer():
    x = 10   #  在外部函数里面定义了一个变量x,是一个局部变量

    def inner():
        # 在内部函数如何修改外部函数的局部变量
        nonlocal x  # 此时,这里的x不再是新增的变量,而是外部的局部变量x
        y = x + 1
        x = 20
        print(y)
        print(x)
    print(x)
    return inner

outer()()

计算一段代码的执行时间

import time #time模块可以获取时间

# 代码运行之前,获取一下时间
start = time.time() #time模块里的time方法,可以获取当前时间的时间戳
print(start)
x = 0

for i in range(1, 100000000):
    x += i

print(x)

stop = time.time()

print(stop)
print('用了', stop - start)

# 代码运行完成以后,再获取一下时间

优化计算时间的代码

import time #time模块可以获取时间
def cal_time(fn):
    start = time.time()
    fn()
    end = time.time()
    print('代码运行耗时{}秒'.format(end - start))


def demo():
    x = 0
    for i in range(1, 100000000):
        x += i
    print(x)

cal_time(demo)

def foo():
    print('hello')
    time.sleep(3)
    print('world')

cal_time(demo)
cal_time(foo)

# start = time.time()
# x = 0
#
# for i in range(1, 100000000):
#     x += i
#
# print(x)
#
# stop = time.time()
#
# print(stop)
# print('用了', stop - start)

装饰器的使用

import time

def cal_time(fn):
    print('我是外部函数,我被调用了')
    print('fn = {}'.format(fn))

    def inner():
        start = time.time()
        fn()
        end = time.time()
        print('代码耗时', end - start)
    return inner

@cal_time  #第一件事调用cal_time;第二件事把被装饰的函数传递给fn
def demo():
    x = 0
    for i in range(1, 100000000):
        x += i
    print(x)

# 第三件事:当再次调用demo函数时,此时的demo函数已经不再是上面的demo了
# 而是装饰器的返回值inner函数

print('装饰后的demo = {}'.format(demo))
demo()   #此时就是inner函数了


@cal_time
def foo():
    print('hello')
    time.sleep(3)
    print('world')

demo()
foo()

装饰器的详解

import time


def cal_time(fn):

    def inner(m, *args, **kwargs):
        start = time.time()
        s = fn(m)
        end = time.time()
        print('代码耗时', end - start)
        return s, end - start

    return inner


@cal_time
def demo(n):
    x = 0
    for i in range(1, n):
        x += i
    return x


m = demo(100000000, 'good', p='hello')
print(m)

装饰器的使用

# 产品经理:提需求 / 改需求
# 超过22点就不可以玩游戏,不告诉时间就不让玩
# 开放封闭原则

def can_play(fn):
    def inner(name, game, *args, **kwargs):
        # print(args)
        clock = kwargs.get('clock', 23)
        if clock <= 22:
            fn(name, game)
        else:
            print('太晚,快睡')

    return inner


@can_play
def play_game(name, game):
    print('{}正在玩{}'.format(name, game))


play_game('zhangsan', 'wangzherongyao', m='good', n='hello')
play_game('lisi', 'juediqiusheng', clock=16)

导入模块的语法

# 模块:一个py文件,就可以理解为一个模块
# 不是所有的py文件都可以作为模块导入
# 如果想要一个py文件能够被导入,模块名字必须要遵循命名规则(数字字母下划线组成,不能以数字开头)
# 为了方便开发,提供了很多内置模块


import time  # 1.使用import模块名直接导入一个模块

# 导入这个模块以后,就可以使用这个模块里的方法和变量
print(time.time())
# time.sleep(3)

from random import randint  # 2.form模块名import函数名,导入一个模块里的方法或者变量

randint(0, 2)  # 生成[0, 2]的随机整数

from math import *  # 3.from 模块名import * 导入这个模块里的所有方法和变量

print(pi)

import datetime as dt  # 4.导入一个模块并起个别名

print(dt.MAXYEAR)

from copy import deepcopy as dp  # 5.from 模块名 import 函数名 as 别名

dp(['hello', 'good', [1, 2, 3], 'hi'])

os模块介绍

# os全称 operationSystem 操作系统
# 模块是用来调用操作系统里面的方法的
import os

# os.name ==> 获取操作系统的名字  Windows系列 ==>  /  非windows ==>posix
print(os.name)  # nt
print(os.sep)  # 路径的分隔符  windows==>\  非windows==>/

# os模块里的 path 经常会使用
# abspath获取文件的绝对路径
print(os.path.abspath('01-高阶函数.py'))

# isdir判断是否是文件夹
print(os.path.isdir('02-函数的嵌套.py'))
print(os.path.isdir('xxx'))

# isfile判断是否是文件

# exists判断是否存在
print(os.path.exists('05-优化计算时间的代码.py'))

# split

file_name = '2020.2.21.demo.py'
print(file_name.rpartition('.'))
print(os.path.splitext('2020.2.21.demo.py'))

# os里其它方法的介绍
# os.getcwd()   # 获取当前工作目录
# os.chdir('test')    # 改变当前脚本的工作目录
# os.rename('毕业论文.txt', '毕业论文最终版.txt')    #  文件重命名
# os.remove('毕业论文.txt')   # 删除文件
# os.rmdir('demo')    # 删除文件夹
# os.mkdir('demo')    # 新建文件夹
# os.chdir('C:\\')   # 切换工作目录
# os.listdir('C:\\')  # 列出目录中的所有文件
# os.name   #  操作系统名称
# os.environ  # 获取到环境配置
# os.environ.get('PATH')   # 获取指定的环境配置

sys模块

# sys 系统相关的模块
import sys
import random


print('hello world')
print('呵呵呵')

#
print(sys.path)   # 结果是一个列表,表示查找模块的路径
# sys.exit(100)   # 程序直接退出,并且设置退出码为100 和内置函数exit功能一样
sys.stdin  # 可以像input一样,接收用户的输入,和input相关 ,可以不断输入
# input('请输入用户名:')
sys.stdout   # 标准输出,打印到指定的地方,默认是输出台

sys.stderr  # 修改sys.stderr 可以改变错误输出的默认位置,默认是控制台

math模块

# 数学计算相关模块
import math

# 2 ** 10  /  pow(2, 10)   /  math.pow(2, 10)
print(math.factorial(6))
print(math.pow(2, 10))   # 1024  幂运算


print(math.floor(12.98))  # 12.向下取整
print(math.ceil(15.001))    # 16.向上取整


# round()  内置函数,实现四舍五入到指定位数


print(math.sin(math.pi / 6))   # 弧度 π=180  π/6
print(math.cos(math.pi / 3))
print(math.tan(math.pi / 2))

random模块的使用

# random模块用来生成随机数
import random

# randint  用来生成[a, b]的随机整数   等价于 randrange(a, b+1)
print(random.randint(2, 9))

# random() 用来生成[0,1)的随机浮点数
print(random.random())

#randrange(a, b) 用来生成[a, b)的随机整数
print(random.randrange(2, 9))

# choice 用来在可迭代对象里随机抽取一个数据
random.choice(['zhangsan', 'lisi', 'jack', 'jerry', 'henry', 'tony'])

# sample 用来在可迭代对象里面随机抽取n个数据
print(random.sample(['zhangsan', 'lisi', 'jack', 'jerry', 'henry', 'tony'], 2))

datetime模块

import datetime as dt

# 以一个下划线_ 开始  _x
# 以两个下划线__ 开始   __x
# 以两个下划线开始, 再以两个下划线结束  __x__


# 涉及到四个类 datetime/date/time/timedelta
print(dt.datetime.now())  # 获取当前时间

print(dt.date(2020, 1, 1))  # 创建一个日期

print(dt.time(18, 23, 45))  # 创建一个时间

print(dt.datetime.now() + dt.timedelta(3))    # 计算三天以后的日期时间

# 内置类
# list tuple int str
print(int('123'))


time模块

import time

print(time.time())   # 获取从1970-01-01  00:00:00  UTC 到现在时间的秒数
print(time.strftime("%Y-%m-%d %H:%M:%S"))  # 按照指定格式输出时间
print(time.asctime())   # Fri Mar 25 12:18:22 2022
print(time.ctime())  # Fri Mar 25 12:18:22 2022

print('hello')
print(time.sleep(10))    # 让线程暂停10秒钟
print('world')

calendar模块

import calendar  # 日历模块

calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.firstweekday())

c = calendar.calendar(2022)  # 生成2019年的日历
print(c)   # 打印2019年日历

print(calendar.isleap(1900))  # 判断是否是闰年
count = calendar.leapdays(1996, 2022)  # 获取1996到2022年之间一共有多少个闰年

print(count)
print(calendar.month(2022, 3))

hashlib和hmac模块

import hashlib
import hmac

# 这两个模块都是用来进行数据加密
# hashlib模块里主要支持两个算法 md5 和 sha加密方式
# 加密方式:单向加密(只有加密过程,不能解密)md5/sha   对称加密  非对称加密rsa

# 需要将要加密的内容转换成为二进制
x = hashlib.md5()   # 生成一个md5对象
x.update('abc'.encode('utf8'))
print(x.hexdigest())   # 900150983cd24fb0d6963f7d28e17f72
# 'abc'  ==>  900150983cd24fb0d6963f7d28e17f72

x1 = hashlib.md5('y76djfh8!'.encode('utf8'))
print(x.hexdigest())


h1 = hashlib.sha1('123456'.encode())
print(h1.hexdigest())
h2 = hashlib.sha224('123456'.encode())   # 224位  一个十六进制占4位
print(h2.hexdigest())
h3 = hashlib.sha256('123456'.encode())
print(h3.hexdigest())
h4 = hashlib.sha384('123456'.encode())
print(h4.hexdigest())





# 文件的md5


# hmac加密可以指定秘钥
h = hmac.new('h'.encode(), '你好'.encode())
result = h.hexdigest()
print(result)    #获取加密后的结果


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值