python基础day12笔记

2018.7.17

day11回顾

 高阶函数

map filter sorted

 递归 recursion

 闭包  closure

day12

装饰器 decorators(专业提高篇)

  装饰器是一个函数,主要是作用是用来包装另一个函数或类(后面再讲)

  装饰的目的是在不改变原函数名(或类名)的情况下,改变被包装对象的行为

函数装饰器

  函数装饰器指装饰器传入的是一个函数,返回的也是一个函数

语法:

  • def 装饰函数名(参数):
  •     语句块
  •     return 函数对象
  • @装饰器函数名<换行>
  • def 函数名(形参列表):
  •     语句块

示例:

  #此示例示意函数装饰器定义用调用

  1. def mydeco(fn):
  2.     def fx():
  3.         print('====================')
  4.         print('--------------')
  5.     return fx
  6. @mydeco
  7. def myfunc():
  8.     print('myfunc被调用')
  9. myfunc()
  10. myfunc()
  11. myfunc()
  • #====================
  • #--------------
  • #====================
  • #--------------
  • #====================
  • #--------------
  1. def mydeco(fn):
  2.     def fx():
  3.         fn()
  4.         print('====================')
  5.         print('--------------')
  6.     return fx
  7. @mydeco
  8. def myfunc():
  9.     print('myfunc被调用')
  10. myfunc()
  11. myfunc()
  12. myfunc()
  • myfunc被调用
  • ====================
  • --------------
  • myfunc被调用
  • ====================
  • --------------
  • myfunc被调用
  • ====================
  • --------------
     

示例:

 此示例示意一个函数两个装饰器先后顺序装饰

  1. def privileged_chieck(fn):
  2.     def fx(name,x):
  3.         print('正在检查权限')
  4.         fn(name,x)
  5.     return fx
  6.  
  7. @privileged_chieck
  8. def save_money(name,x): #存钱
  9.     print(name,'存钱',x,'元')
  10.  
  11. @privileged_chieck
  12. def withdraw(name,x):
  13.     print(name,'取钱',x,'元')
  14. save_money('小张',200)
  15. save_money('小赵',200)
  16. withdraw('小杨',200)
  • #正在检查权限
  • #小张 存钱 200 元
  • #正在检查权限
  • #小赵 存钱 200 元
  • #正在检查权限
  • #小杨 取钱 200 元

函数的文档字符串

  函数内第一次来被赋值给任何变量的字符串是此函数的文档字符串

  语法:

def 函数名(参数列表):

    '函数文档字符串'

    函数语句块

示例:

def myfun(name,x):

    '''这是函数的文档字符串

    name 表示人名

    x表示钱数

    '''

    pass

>>>help(myfun)

说明:

 1. 文档字符串通常用来说明本函数的功能和使用方法

 2. 在交互模式下输入:help(函数名), 可以查看函数的‘文档字符串’

 3.函数的文档字符串绑定在函数的_doc_属性上

函数的_doc_属性

  用于绑定函数的文档字符串

函数定义语句(def 语句)的完整语法:

    [@装饰器1]

    [@装饰器2]

    [...]

def 函数名([位置形参,],[*元组形参],[命名关键字形参],[**字典形参]):

    '''文档字符串'''

    语句块

    注:[]可以省略内容

模块module

什么是模块:

  模块是一个包含有一系列数据,函数,类等组成的程序组

  模块是一个文件,模块文件名通常以.py结尾.

作用:

  让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰

  模块中的数据,函数,类等可提供给其它模块或程序使用

模块的分类:

  内建模块(builtins)在解析器的内可以直接使用

  标准库模块,安装python时已安装且可以直接使用

  第三方模块(通常开源),需要自己安装

  用户自己编写的模块(可以作为其它人的第三方模块)

模块的导入语句

import 语句

  语法:

  import 模块1 [as 模块新名1],模块名2[as模块新名2],...

示例:

  import math  #导入math模块

  import sys,os

作用:

  将某模块整体导入到当前模块中

用法:

  模块名.属性名  或  模块名.函数属性名(实参传参)

如:

  math.factorial(5)

dir(obj) 函数返回所有属性的字符串列表

help(obj) 函数可以查看模块的相关文档字符串

练习:

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

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

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

  1. import math
  2. r = float(input("请输入圆的半径: "))
  3. area = math.pi * r ** 2
  4. print("面积是: ", area)
  1. # 输入一个圆的面积,打印出这个圆的半径 
  2. import math
  3. area = float(input("请输入圆的面积: "))
  4. t = area / math.pi
  5. r = math.sqrt(t)
  6. print('半径是:', r)
  1. #  输入一个圆的面积,打印出这个圆的半径
  2. import math as m  # m为math的新名字
  3. area = float(input("请输入圆的面积: "))
  4. t = area / m.pi
  5. r = m.sqrt(t)
  6. print('半径是:', r)

from import

语法:

  from 模块名 import 模块属性名1[as 属性新名1],模块属性名2[as 属性新名2],...

作用:

  将某模块的一个或多个属性导入到当前模块的作用域

示例:

  1. from math import factorial as fac
  2. from math import sin
  3. from math import pi
  4. print(fac(5))  # 120

from import * 语句

语法:

  from 模块名 import * 

作用:

  将某模块的所有的属性导入到当前模块

示例:

  1. from math import *
  2. print(sin(pi/2)) 
  3. print(factorial(5))

dir 函数

  dir([对象])返回一个字符串的列表

说明:

  如果没有给参数调用,则返回当前作用域内的所有变量的列表

  如果给定一个对象为作参数,则返回这个对象的所有变量的列表

  1)对于一个模块,返回这个模块的全部属性

  2)对于一个类,返回这个类的所有变量,并递归基类对象的所有变量

  3)对于其它的对象,返回所有类变量和基类变量

内建模块

math模块

  模块名 math

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  

import time
# 或
from time import xxx
# 或
from time import *

变量 描述
time.altzone 夏令时时间与UTC时间差(秒为单位)
time.daylight 夏令时校正时间
time.timezone 本地区时间与UTC时间差(秒为单位)
time.tzname 时区名字的元组, 第一个名字为未经夏令时修正的时区名,
第一个名字为经夏令时修正后的时区名
函数名 描述
time.time() 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
time.sleep(secs) 让程序按给定秒数的浮点数睡眠一段时间
time.gmtime([secs]) 用给定秒数转换为用UTC表达的时间元组
(缺省返回当前时间元组)
time.asctime([tuple]) 将时间元组转换为日期时间字符串
time.mktime(tuple) 将本地日期时间元组转换为新纪元秒数时间(UTC为准)
time.localtime([secs]) 将UTC秒数时间转换为日期元组(以本地时间为准)

练习:

  写一个程序,输入你的出生日期,

 1)算出你已经出生了多少天

 2)算出你出生的那天是星期几

  1. import time
  2. year=int(input('请输入年 '))
  3. month=int(input('请输入月 '))
  4. day=int(input('请输入日 '))
  5. tuple_birth=(year,month,day,0,0,0,0,0,0)
  6. birth_second=time.mktime(tuple_birth)#出生计算机内部秒数
  7. second=time.time()-birth_second#一共活了多少秒
  8. print('你已经出生',second/60/60//24,'天')
  9.  
  10. # 算出生日那天是星期几
  11. t = time.localtime(birth_second)
  12. # print(t)
  13. weeks = {
  14.     0: "星期一",
  15.     1: "星期二",
  16.     2: "星期三",
  17.     3: "星期四",
  18.     4: "星期五",
  19.     5: "星期六",
  20.     6: "星期日"
  21. }
  22. print("您出生的那天是:", weeks[t[6]])

系统模块 sys

运行时系统相关的信息

sys模块的属性

属性 描述
sys.path 模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 ''
sys.modules 已加载模块的字典
sys.version 版本信息字符串
sys.version_info 版本信息的命名元组
sys.platform 操作系统平台名称信息
sys.argv 命令行参数 argv[0] 代表当前脚本程序路径名
sys.copyright 获得Python版权相关的信息
sys.builtin_module_names 获得Python内建模块的名称(字符串元组)

sys模块的函数

函数名 描述
sys.exit([arg]) 退出程序,正常退出时sys.exit(0)
sys.getrecursionlimit() 得到递归嵌套层次限制(栈的深度)
sys.setrecursionlimit(n) 得到和修改递归嵌套层次限制(栈的深度)

练习:

1,请编写函数fun,其功能是计算下列多项式的和:

  fn =1+1/1!+1/2!+1/3!+1/4!+....+1/n!

  (建议用数学模块的factorial实现)

求当n等于100时,fn的值

看一下fn(100)的值是什么

 2,写一个程序,以电子时钟格式:

 HH:MM:SS格式显示时间

 要求每隔一秒变化一次

 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的值,看看是什么

猜你喜欢

转载自blog.csdn.net/qq_42584444/article/details/81074999