python笔记12 - 装饰器,模块(时间,数学)

本文深入探讨了Python中的装饰器概念及其应用,并详细讲解了如何使用时间模块和数学模块,包括常见函数和实用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2017/10/17

装饰器,模块(时间,数学)



1.装饰器decorator(专业提高篇):
    装饰器是一种函数,主要作用是用来包装另一个函数或者是类;
包装的目的:
    是在不改变原函数名的情况下,改变被包装函数(对象)的行为;
装饰器函数:
def 装饰器函数名(参数):
    函数块
    return 函数


带装饰器函数的语法:
    @ 装饰器函数名[(装饰器函数传参)]<换行>
    def 函数名(参数列表):
        语句块
      [注]:[]表示可省略


实例:
    def deco(fn):
      print("装饰器函数被调用,并返回原函数")
      return fn


实例:
    def myfunc():
      print("函数myfunc被调用!")


      myfunc()


实例:
def deco(fn);
    print('装饰器函数被调用,并返回原函数')
    print(fn)
    return lambda : print('hello world!')      #lambda是函数名,匿名


@deco
def myfunc():                          
    print('函数myfun被调用!')


myfunc()
myfunc()


#以上@deco语句等同于
#myfunc = deco(myfunc)
总结:将原来的函数绑定成另一个函数的语句块,另一个函数需要返回内容。另一个函数会在 @的时候 最初运行一次。


--------------------------------------------------------------------
实例:
def msg_service(fn):
    def savemoney2(name,x):
        print('欢迎',name,'来北京银行,请取号!')
        fn(name,x)
        print(name,'办理存',x,'元钱的业务,短信发送中...') 
    return savemoney2


def savemoey(name,x):
    print(name,'存在',x,'元')


savemoey('小张',200)
savemoey('小赵',500)
savemoey('小王',400)
savemoey('小于',700)


>>>
小张 存在 200 元
小赵 存在 500 元
小王 存在 400 元
小于 存在 700 元


--------------------------------------------------------------------
实例-接上对比:
def msg_service(fn):
    def savemoney2(name,x):
        print('欢迎',name,'来北京银行,请取号!')
        fn(name,x)                                   #######闭包知识
        print(name,'办理存',x,'元钱的业务,短信发送中...') 
    return savemoney2


@msg_service                ##########@@@@@@@等同于savemoey =  msg_service(savemoey)
def savemoey(name,x):
    print(name,'存在',x,'元')   过程:删除本行函数语句,返回需要执行的语句


savemoey('小张',200)
savemoey('小赵',500)
savemoey('小王',400)
savemoey('小于',700)


>>>
欢迎 小张 来北京银行,请取号!
小张 存在 200 元
小张 办理存 200 元钱的业务,短信发送中...
欢迎 小赵 来北京银行,请取号!
小赵 存在 500 元
小赵 办理存 500 元钱的业务,短信发送中...
欢迎 小王 来北京银行,请取号!
小王 存在 400 元
小王 办理存 400 元钱的业务,短信发送中...
欢迎 小于 来北京银行,请取号!
小于 存在 700 元
小于 办理存 700 元钱的业务,短信发送中...


--------------------------------------------------------------------


###################以下方法不可取###########################
def savemokey2(name,x):
    print('欢迎',name,'来北京银行,请取号!')
    savemoey(name,x):
    print(name,'办理存',x,'元钱的业务,短信发送中...')
###原因在于,如果想要调用  savemoey()  和  savemoey2() 函数,需要进行多次调用,如果用装饰器,只用savemoey()即可解决 
#############################################################




=====================================================================
2.函数的文档字符串:
语法:
def 函数名(参数列表):
"函数文档字符串"      ####冒号后面的第一行字符串,不复制给任何的变量,通常在函数定义之后,第一个语句之前
    语句块                ####文档字符串,非注释内容
    ...


作用:
    文档字符串通常用来说明函数的功能和用法


用>>> help(函数名)可以产看文档字符串


实例:
def mymax(a,b):
"""mymax函数用于取两个变量的最大值
    a 形参
    b 也是形参
"""
    pass


注:在交互模式下使用命令 help(mymax)
>>>
Help on function mymax in module __main__:


mymax(a, b)
    mymax函数用于取两个变量的最大值
    a 形参
    b 也是形参




=====================================================================
3.已经学过的函数的语法:


[@装饰器名]
def 函数名([未知参数],[*元组参数],[命名关键字参数],[**字典参数]):
    ["文档字符串"]
    语句块


注:[]表示内部的内容可以省略


=====================================================================
4.函数的属性:


(1)__name__
作用:用来记录函数名
说明:以双下划线开头,以双下划线结尾的标识符通常表示python的特殊属性等,返回函数对象绑定的名字。


实例:
def abc():
    pass
a = abc
print(a.__name__)   #abc


>>> a.__name__      #函数对象a绑定了函数abc,abc是函数对象的名字
'abc'






(2)__doc__属性
作用:用于记录文档字符
实例:
def cba():
"我是文档字符串"
    pass


>>> cba.__doc__      #注意,只可以提取文档字符串,无法获取注释
'我是文档字符串'


=====================================================================
5.补充内容:布尔测试
bool(x)  #True/False


结果为False的情况:
None
False
0
0.0
0+0j
[]
''
()
{}
set()
frozenset()


=====================================================================
6.模块 Module
    模块是一个包含有一系列变量,函数,类等组成的程序组;
    模块是一个文件,模块文件名通常以.py结尾


作用:
    让一些相关的变量,函数,类等有逻辑的组织在一起,让逻辑结构更加清晰;
    模块中的变量,函数和类等可供其他模块或程序使用


分类:
    内置模块(builtins),在解析器的内部可以直接使用;
    安装的标准库模块,安装python时已经安装,可直接使用;
    第三方模块(通常开源),需要自己安装;
    用户自己编写的模块(可以作为其他人的第三方模块)


--------------------------------------------------------------------


模块的导入:


(1)import 语句


语法:
    import 模块名1[as 模块新名1],模块名1[as 模块新名2],....
    如果导入的模块在整个程序中,有被当做变量使用,其打印值的时候仍然会当做模块名而没有办法打印,程序报错。    
如果将模块名改名:import math as m,那么就可以进行print(math)操作,而math模块以后都只可以用m 名代替。 


实例:
import math
import sys,os


作用:
    将某模块整体导入到当前模块


import语句的用法:
模块名.属性名
math.sin(3.14)


相关函数:@@@@@@@@@@@@@@@@@@@@@
help(obj) 函数,可以查看模块相当的文档字符串  例:help(math)
dir(obj)函数,返回模块所有属性的字符串列表  例:help(dir)


实例:
import math
s = math.log10(10)
print(s)


(2)from import 语句
语法:
    from 模块名 import 模块属性1 [as 属性别名1],模块属性名2[as 属性名2],...


作用:将某模块内的一个或多个属性(模块内的一种函数)导入到当前模块


意义:程序中,只是用几个模块属性,而又不想经常键入 模块名. 的时候,可以这样使用


实例:
from math import sin
from math import pi
from math import factorial as fac


实例:
from math import factorial as fac
s = fac(5)           #阶乘,可以免去程序中键入 模块名.
print(5) 
>>>120




(3)from import * 语句
语法:
    from 模块名 import *
作用:
    将某模块所有的属性导入到当前的模块


实例:
from math import *
print(sin(pi/2))
print(pi)
print(log10(10))


>>>
1.0
3.141592653589793
1.0




--------------------------------------------------------------------


dir()函数
    dir([对象]) 返回一个字符串列表
作用:
    如果没有参数调用,则返回当前作用域内的所有变量的列表;
    如果给定一个对象作为参数,则返回这个对象的所有变量列表
        对于模块,返回这个模块的全部变量
        对于类,返回类对象的所有变量
        对于其他对象,返回所有变量,类变量和基类变量


内置模块(built-in):
    builtins,sys,time,itertools....,math
标准库模块(os.py):
    random,datetime,os,xml
实例:
dir()
dir(sin)


下载python手册,下载内置模块,标准库模块的应用方法:
http://docs.python.org


--------------------------------------------------------------------


模块学习:
(1)时间模块 time
    提供时间相关的函数,且一直可用


导入方式:
import time
from time import *
from time import xxx


help(time) 查看时间模块的相关信息


时间简介:
    公元纪年是公元0000年1月1日开始
    对于Unix/Linux系统,计算机元年是从1970-1-1零时开始的,此时时间为0
    UTC时间(Coordinated Universal Time)是从Greenwich时间开始计算的
    UTC时间不会因为时区问题而产生错误


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


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


模块中的变量和函数:
变量:
time.timezone 本地区时间与UTC时间差(秒为单位)
time.altzone  夏令时间与UTC时间差(秒为单位)
time.daylight 夏令时校正时间
time.tzname   时区名称的元组 注:CST china standard time




实例(交互环境):
>>>time.time()
1508226734.464446


函数:
time.time()             返回计算机元年至当前时间的秒数的浮点数(UTC时间为准)
time.sleep(seconds)     让程序按给定的秒数睡眠一段时间
time.gmtime([seconds])  将给定的秒数转换为UTC表达的时间元组
time.mktime(tuple)      将时间元组转换为新纪元秒数时间(UTC时间为准)
time.asctime([tuple])   将时间元组转换为字符串
time.localtime([seconds])  将UTC秒数转换为时间元组(以本地时间为准)
time.clock()             返回CPU开始运行到现在的时间的秒数的浮点数


注[]内内容可省略


实例:
time.sleep(2)


time.time.gmtime()
>>>time.struct_time(tm_year=2017, tm_mon=10, tm_mday=17, tm_hour=8, tm_min=8, tm_sec=1, tm_wday=1, tm_yday=290, tm_isdst=0)


time.mktime((1970,1,1,9,0,0,0,0,0))  #创建时间
>>>3600.0           #计算机时间至此的秒数时间


time.asctime((2008,8,8,0,0,0,0,0,0))
>>>Mon Aug  8 00:00:00 2008'


time.localtime()
>>>time.struct_time(tm_year=2017, tm_mon=10, tm_mday=17, tm_hour=16, tm_min=10, tm_sec=41, tm_wday=1, tm_yday=290, tm_isdst=0)


time.clock()   
>>>0.432308


练习:
写一个程序,输入出生日期,算出你已经出生多少天。


解:
import time
a = time.mktime((2017,10,17,0,0,0,0,0,0)) 
b = time.mktime((1993,2,28,0,0,0,0,0,0))
c = a - b
c = c // (24*60*60)
print(c)


--------------------------------------------------------------------


(2)数学模块 math
注:linux下为内建模块
    Mac OS 为标准库模块


变量:
math.e 自然对数e
math.pi 圆周率


函数
math.ceil(x)         对x向上取整,比如 x = 1.2,返回2 (ceil天花板)
math.floor(x)        对x向下取整,比如 x = 1.2,返回1 (floor地板)
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
math.fabs(x)         返回浮点数x的绝对值


#角度和弧度转换
math.degrees(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的反正弦(x为弧度值)
math.acos(x)  返回x的反余弦(x为弧度值)
math.atan(x)  返回x的反正切(x为弧度值)




实例:
>>>math.log(8,2)    #3.0


from math import * 
a = log(8,e)          
print(a)            #2.0794415416798357


a =  log(8)
print(a)            #2.0794415416798357






练习1:
输入圆的半径r 和圆的角度d,算出圆的扇形的面积。


from math import *
def s(r):
    s = r ** 2 * pi
    return s


a = float(input('please enter the radious:'))                                                                                                                                                                                                                                                                                                                                                      
print(s(a))




练习2:
写一个程序打印出一个电子时钟,格式为:HH:MM:SS,17:27:23
每隔一秒钟,打印刷新一次


解:
from time import *
while 1:
    t = localtime()
    sleep(1)
    print("%02d:%02d:%02d" % (t[3],t[4],t[5]),end='\r')




练习3:
编写一个闹钟程序,启动时设置定时时间,到时间后打印一句话“起床了”,然后退出程序


解:
from time import *


a1 = int(input('闹钟年时间:'))
a2 = int(input('闹钟月时间:'))
a3 = int(input('闹钟日时间:'))
a4 = int(input('闹钟时时间:'))
a5 = int(input('闹钟分时间:'))
a6 = int(input('闹钟秒时间:'))


t1 = (a1,a2,a3,a4,a5,a6,0,0,0)


t_clock = mktime(t1)  #t_clock = mktime((a1,a2,a3,a4,a5,a6,0,0,0)) 


while 1:
    t2 = localtime()
    sleep(1)
    print("%02d:%02d:%02d" % (t2[3],t2[4],t2[5]),end='\r')
    t_now = mktime(t2)
    if t_clock == t_now:
        print('起床!!!!!!!!!!!!!!!!!')
        break








如果用./students.py运行,需要为该文件添加执行权限 chmod u+x shiyan.py 并在该程序文档的首行(必须是第一行)键入#!/usr/bin/python3  来声明python3 解释执行器的位置


如果是shell文件 则要键入   #!/usr/bin/bash
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值