Python全栈工程师(装饰器、模块)

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 内建模块 直接导入就可以
Python全栈工程师(装饰器、模块)的更多相关文章
- Python全栈之路----常用模块----hashlib加密模块
加密算法介绍 HASH Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...
- python全栈开发之OS模块的总结
OS模块 1. os.name() 获取当前的系统 2.os.getcwd #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...
- Python全栈工程师(递归函数、闭包)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细 ...
- Python全栈工程师(Python3 所有基础内容 0-0)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python一个月的基础语法 基本就到这咯 接下来是数据 ...
- Python全栈工程师(Python3 所有基础内容 0-0)
转发:https://www.cnblogs.com/ParisGabriel/p/9388030.html statements 语句print 输出quit() 退出exit() 退出ct ...
- Python全栈工程师(每周总结:3)
ParisGabriel 每天坚持 一天一篇 点个订阅吧 灰常感谢 当个死 ...
- python全栈开发day22-常用模块二(hashlib、configparse、logging)
一.昨日内容回顾 1.钻石继承 #新式类,本身或父类显示继承object #找名字的时候是广度优先顺序 #有mro方法,super方法, # super并不是单纯的找父类,和mro顺序是完全对应的 # ...
- 【目录】python全栈工程师
第一阶段:Python 语言核心编程1. Python核心 -- 2048 游戏核心算法2. 面向对象 -- 天龙八部游戏技能系统3. Python高级 -- 集成操作框架项目:2048游 ...
- Python全栈工程师之从网页搭建入门到Flask全栈项目实战(3) - 入门Flask微框架
1.安装Flask 方式一:使用pip命令安装 pip install flask 方式二:源码安装 python setup.py install 验证 第一个Flask程序 程序解释 参数__na ...
随机推荐
- Linux高性能server编程——定时器
版权声明:本文为博主原创文章.未经博主允许不得转载. https://blog.csdn.net/walkerkalr/article/details/36869913 定时器 服务器程序通常管 ...
- 【转】Android BroadcastReceiver介绍
本文主要介绍BroadcastReceiver的概念.使用.生命周期.安全性.分类.特殊的BroadcastReceiver(本地.粘性.有序.粘性有序广播).示例代码见BroadcastReceiv ...
- 2017.11.10 web中URL和URI的区别
URI:Uniform Resource Identifier,统一资源标识符: •URL:Uniform Resource Locator,统一资源定位符: •URN:Uniform Resourc ...
- java读取pfx或P12格式的个人交换库公私钥
使用的是CFCA签发的用于银行间交换数据的证书,下载后直接添加到浏览器中 1.导出 从浏览器导出p12文件(包含私钥) 2.验证 两种方式: openssl 代码(请注意alias别名是如何获取的): ...
- 4、SpringBoot------邮件发送(2)
开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/Springboot/tree/0d6194d6ea2d7f4e19791a3d3f3167f861 ...
- javaWeb css图文混排
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- LeetCode700. Search in a Binary Search Tree
题目 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 例如, 给定二叉搜索树: 4 / \ 2 ...
- SAP标准导出功能 - 删除默认选定格式
我们经常会使用SAP系统的标准功能导出ALV显示的数据,一般会选择电子表格. 选择电子表格之后,需要选择电子表格的具体格式. 选择格式之后点击确定,会弹出保存对话框. 如果在使用这个功能的时候,选择了 ...
- Linux - 用户环境变量的查看与设置
1. 查看当前有哪些环境变量 直接输入命令:env 2. 设置用户环境变量 输入命令:vim ~/.bash_profile,打开文件,输入如下内容: 范例(设置maven环境变量): export ...
- .NET 客户IP地址捕捉
MVC模式下要获取客户IP可以在ActionFilterAttribute中进行拦截 filterContext.HttpContext.Request.UserHostAddress 同样,在Web ...