您的位置:首页 > 编程语言 > Python开发

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

2017-10-31 17:21 447 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: