zoukankan      html  css  js  c++  java
  • Python全栈工程师(装饰器、模块)

     

    ParisGabriel
     
     
     
             每天坚持手写  一天一篇  决定坚持几年 全栈工程师
     
      

                          Python人工智能从入门到精通

     

    装饰器 decorators(专业提高篇)
      装饰器是一个函数 ,主要用来包装另一个函数或类
      装饰的目的是在 不改变函数的的原名(或类名)的情况下
      改变对象的行为
    函数装饰器
      函数装饰器指装饰器传入的是一个函数,返回的也是一个函数
      原理就是改变原变量绑定的函数

      语法:
      def 装饰器函数名(参数):
        语句块
        return 函数对象

          例如:

    # 此示例示意函数装饰器的定义用调用
    def mydeco(fn):
        def fx():
            print("=========这是myfunc调用之前==========")
            fn()
            print('---------这是myfunc调用之后----------')
        return fx
    
    
    @mydeco
    def myfunc():
        print("myfunc被调用")
    
    
    # myfunc = mydeco(myfunc)  # 原理是改变原变量绑定的函数
    
    
    myfunc()
    myfunc()
    myfunc()
    # 此示例示意一个函数被两个装饰器先后顺序装饰
    
    def message_send(fn):
        def fy(name, x):
            fn(name, x)
            print(name, "办理了", x, '元的业务![工商银行]')
        return fy
    
    
    # ----- 以下是小王写的装饰器函数用来进行权限验证----
    def privileged_check(fn):
        def fx(name, x):
            print("正在检查权限.... 通过")
            fn(name, x)
        return fx
    
    
    # ------- 以下是老魏写的程序----------
    @privileged_check
    def save_money(name, x):  # 存钱
        print(name, '存钱:', x, '')
    
    # myfunc = mydeco(myfunc)
    @message_send
    @privileged_check
    def withdraw(name, x):
        print(name, '取钱:', x, '')
    
    
    # -------以下是调用者小李写的程序
    save_money('小张', 200)
    save_money('小赵', 500)
    withdraw('小杨', 300)

    函数的文档字符串:
      函数内第一次未被赋值给任何变量的字符串是此函数的文档字符串
    def 函数名(参数列表):
      函数文档字符串
      函数语句块
      help(函数变量) 查看函数信息
      fa.__doc__ 查看文档字符串
    函数定义语句(def 语句)的完整语法:
      [ @装饰器] 
      [ @装饰器]
      [ ... ]
      def 函数名([位置形参], [ *元组形参], [命名关键字形参], [**字典形参])
      文档字符串

    模块 Module:
      模块是一个包含有一系列数据、函数、类等组成的程序组
      模块是一个文件,模块文件通常以.py结尾
      作用:
        让一些相关的数据、函数、类等有逻辑的组织在一起,使用逻辑结构清晰
        模块的数据、函数、类等 可提供给其他模块或程序使用
    模块的分类;
      内建模块(builtins)在解析器的内可以直接使用、
      标准库模块,安装python时已安装且可以使用
      第三方模块(通常开源),需要自己安装
      用户自己编写模块(可以作为其他人的第三方模块)
    模块的导入:
      import 语句:
      inport 模块名1 [ as 模块新名1], 模块2 [as 模块2新名], .........
      作用:
        将某模块整体导入到当前模块中
      impoer math 数学模块
      impoer sys os copy

      用法:
        模块名.属性名
        模块名.函数属性名(实参)
    from import
      语法:
        from 模块名 import 模块属性名1[as 属性新名1]
        模块属性名2[as 属性名2]
      作用:
        将谋模块的一个或多个属性导入到当前模块的作用域
    from math import pi as p
    from import * 
      语法:
         from 模块名 import 模块属性名1 [as 属性新名1], 模块属性名2 [as 属性新名2], ....
      作用:
        将某模块的所有属性全部导入到当前模块
    dir函数:
      dir([对象]) 返回一个字符串的列表
      说明:
        如果没有给参数调用,则返回当前作用域内的所有变量的列表
        如果给定一个对象作为参数,则返回这个对象的所有变量类型列表
        对于一个模块,返回这个模块的全部属性
        对于一个类 ,返回这个类的所有变量 ,并递归基类对象的所有变量
        对于他的对象,所有类变量和基类变量
    内建模块 :
      math模块:

    数学模块 math

    • 模块名: math
    • 注:
      • linux下为内建模块
      • Mac OS下为标准库模块

    数学模块用法:

    import math
    # 或
    from math import *
    
    变量描述
    math.e 自然对数的底e
    math.pi 圆周率pi
    函数名描述
    math.ceil(x) 对x向上取整,比如x=1.2,返回2
    math.floor(x) 对x向下取整,比如x=1.2,返回1
    math.sqrt(x) 返回x的平方根
    math.factorial(x) 求x的阶乘
    math.log(x[, base]) 返回以base为底x的对数, 如果不给出base,则以自然对数e为底
    math.log10(x) 求以10为底x的对数
    math.pow(x, y) 返回 x**y (x的y次方)
    math.fabs(x) 返回浮点数x的绝对值
    角度和弧度degrees互换  
    math.degree(x) 将弧度x转换为角度
    math.radians(x) 将角度x转换为弧度
    三角函数  
    math.sin(x) 返回x的正弦(x为弧度)
    math.cos(x) 返回x的余弦(x为弧度)
    math.tan(x) 返回x的正切(x为弧度)
    math.asin(x) 返回x的反正弦(返回值为为弧度)
    math.acos(x) 返回x的反余弦(返回值为为弧度)
    math.atan(x) 返回x的反正切(返回值为为弧度)





    时间模块 time

    • 此模块提供了时间相关的函数,且一直可用

    时间简介

    • 公元纪年是从公元 0000年1月1日0时开始的

    • 计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1

    • UTC 时间 (Coordinated Universal Time) 是从Greenwich时间开始计算的.
      UTC 时间不会因时区问题而产生错误

    • DST 阳光节约时间(Daylight Saving Time),又称夏令时, 是一个经过日照时间修正后的时间

    时间元组

    • 时间元组是一个9个整型元素组成的,这九个元素自前至后依次为:
      • 四位的年(如: 1993)
      • 月 (1-12)
      • 日 (1-31)
      • 时 (0-23)
      • 分 (0-59)
      • 秒 (0-59)
      • 星期几 (0-6, 周一是 0)
      • 元旦开始日 (1-366)
      • 夏令时修正时间 (-1, 0 or 1).
    • 注:
      • 如果年份值小于100,则会自动转换为加上1900后的值

    模块名: time

    时间模块用法:

    import time
    # 或
    from time import xxx
    # 或
    from time import *
    
    变量描述
    time.altzone 夏令时时间与UTC时间差(秒为单位)
    time.daylight 夏令时校正时间
    time.timezone 本地区时间与UTC时间差(秒为单位)
    time.tzname 时区名字的元组, 第一个名字为未经夏令时修正的时区名,
    第一个名字为经夏令时修正后的时区名

    注: CST为中国标准时间(China Standard Time UTC+8:00)

    函数名描述
    time.time() 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
    time.sleep(secs) 让程序按给定秒数的浮点数睡眠一段时间
    time.gmtime([secs]) 用给定秒数转换为用UTC表达的时间元组
    (缺省返回当前时间元组)
    time.asctime([tuple]) 将时间元组转换为日期时间字符串
    time.mktime(tuple) 将本地日期时间元组转换为新纪元秒数时间(UTC为准)
    time.localtime([secs]) 将UTC秒数时间转换为日期元组(以本地时间为准)

    练习:
    1. 请编写函数fun 其功能是计算下列多项式的和:
    fn = 1 + 1/1! + 1/2! + 1/3! + 1/4! + .. + 1/n!
    (建义用数学模块的factorial实现)

    求当n 等于100时,fn的值
    看一下fn(100)的值是什么

    答案:

    import math
    def fun(n):
        if n == 1:
            return 1 + 1 / 1
        return fun(n - 1) + (1 /  math.factorial(n))
    print(fun(100))

    2. 写一个程序,以电子时钟格式:
    HH:MM:SS格式显示时间
    要求每隔一秒变化一次

    答案:

    import time
    
    while True:
        x = time.time() % (3600 * 24)
        h = x // 3600
        m = (x % 3600) // 60
        s = x % 60
        time.sleep(1)
        print('%02d:%02d:%02d' % (h + 8, m, s))
    # 方法二:
    
    import time
    while True:
        time.sleep(1)
        s = time.localtime()
        print('%02d:%02d:%02d' % (s[3], s[4], s[5]))

    3 写函数f(n)求下多项式的和
    fn = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 .... 1/(2*n-1)的和

    求当n取值为1000000时,
    1) 打印 f(1000000) 的值
    2) 打印 f(1000000) * 4的值,看看是什么

    答案:

    def fn(n):
        s = 0
        for x in range(1, n):
            if x % 2 == 0:
                s -= 1 / (x * 2 - 1)
            else:
                s += 1 / (x * 2 - 1)
        return s * 4  # 此处乘4
    print(fn(1000000))
    方法二:
    def fn(n):
        s = 0
        for x in range(1, n):
            if x % 2 != 0:
                s += (1 / (x * 2 - 1)) - (1 / ((x * 2 + 2) - 1))
        return s * 4
    print(fn(1000000))

     

    练习:
    1. 输入一个圆的半径,打印出这个圆的面积
    2. 输入一个圆的面积,打印出这个圆的半径

    (要求用math模块内的函数和数据实现)

    答案:

    import math
    r = float(input("please input radius of a circle:"))
    s = math.pi * r ** 2
    print(s)
    s = float(input("please input acreage of a circle:"))
    x = s / math.pi
    r = math.sqrt(x)
    print(r)

    装饰器 decorators

    装饰器 顾名思义 在不改变原函数的基础上改变功能 就好比在卧室里贴壁纸
    壁纸是后来加上去的 但是墙还是墙 没有任何变化 不管我是贴上去还是撕下来
    不可能说吧墙砸烂再贴 墙是不需要变化的 我就可以改变墙的外观  对吧
    墙就是原函数
    壁纸就是内部装饰函数
    装饰器本身也是一个函数 但是他要传入一个函数 返回一个函数
    传入的函数: 形参就是原函数
    返回的函数:就是装饰函数内部嵌套的函数 也是最终装饰函数 是它最终调用的原函数
    这里利用内部嵌套函数调用外部函数的形参变量(原函数)用内部嵌套函数来装饰原函数
    返回后的函数是内部嵌套的函数 外部函数被释放 这也是一个典型的闭包函数
    调用装饰函数 @message_send 等同于 myfunc = mydeco(myfunc)
    可以有多层装饰最外层依次包含内部


    函数的文档字符串 就是给你写的函数加一个注解 但是这个不等同与注释 因为注释不会被解释执行器所识别
    他是一个字符串形式的
    函数名.__doc__ 查看该函数注解


    4种模块:
    内建模块是解释执行器自带的模块
    标准库模块是安装python时自动安装的模块
    第三方模块是自己下载安装是的模块
    还有一种就是自己写的模块 可以自己用 也可以给别人用 相当于自定义第三方模块


    import 调用模块 [一系列参数...]


    math 、 time 内建模块 直接导入就可以

     

  • 相关阅读:
    Seconds_Behind_Master的计算
    innnodb 线程在做什么?
    Mysql Join_buffer_size的使用原理
    C 实现位图排序
    C 内存池的实现
    C实现队列
    mysqld执行的函数栈
    Source Insight的基本用法
    MySQL高性能以及高安全测试
    【设计篇】状态与策略
  • 原文地址:https://www.cnblogs.com/ParisGabriel/p/9326393.html
Copyright © 2011-2022 走看看