day12笔记:
装饰器 decorators(专业提高往篇)
问题:
函数名是变量,它绑定一个函数
函数名 / 函数名() 区别
什么是装饰器
装饰器是一个函数,主要作用是用来包装另一个函数或类(后面会讲)
作用:
是在不改变原函数名(或类名)的情况下改变被包装对象的行为
函数装饰器:
函数装饰器是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数
语法:
def 装饰器函数名(参数):
语句块
return 函数对象
@装饰器函数名<换行>
def 函数名(形参列表):
语句块
示例见:
mydeco1.py
mydeco2.py
mydeco3.py
# mydeco1.py
def mydeco(fn):
def fx():
print("fx函数被调用")
return fx
# myfunc加了mydeco装饰器,等同于在myfunc创建之后调用
# myfunc = mydeco(myfunc)
@mydeco
def myfunc():
print("函数myfunc被调用")
# 这样的写法可以用装饰器来代替
# 等同于
# @mydeco
# def myfunc()....
# myfunc = mydeco(myfunc)
myfunc() # 这里调用谁?
# mydeco2.py
def mydeco(fn):
def fx():
print("++++++++这是myfunc调用之前++++++++")
# 要想在此处调用被装饰的函数myfunc怎么办?
fn() # 调用被装饰函数
print("--------这是myfunc调用之后--------")
return fx
@mydeco
def myfunc():
print("函数myfunc被调用")
myfunc() # 这里调用谁?
# mydeco3.py
def myfunc():
print("++++++++这是myfunc调用之前++++++++")
print("函数myfunc被调用")
print("--------这是myfunc调用之后--------")
myfunc() # 这里调用谁?
看懂下面代码的调用关系及打印结果
def mydeco(fn):
print('装饰器函数被调用了....')
def fx():
print('fx被调用')
return fx
@ mydeco # 这里加装饰器和不加装饰器结果一样吗?为什么?
def myfunc():
print('函数myfunc被调用')
myfunc()
myfunc() # 调用第二次
myfunc() # 调用第三次
函数的文档字符串
函数内第一次未赋值给任何变量的字符串是此函数的文档字符串
语法:
def 函数名(形参列表):
'''函数的文档字符串'''
函数语句块
示例:
def hello():
'''此函数用来打招呼...
这是函数的文档字符串
'''
pass
>>> help(hello)
说明:
1. 文档字符串通常用来说明本函数的功能和使用方法
2. 在交互模式下,输入:help(函数名) 可以查看函数的文档字符串
函数的 __doc__ 属性
__doc__ 属性用于记录文档字符串
函数的 __name__ 属性
__name__ 用于记录函数的名称
函数的定义语法:
@装饰器1
@装饰器2
...
def 函数名(位置形参, *元组形参(或*), 命名关键字形参, **字典形参):
'''文档字符串'''
语句块
面试题,思考?
L = [1, 2, 3]
def f(n=0, lst=[]):
lst.append(n)
print(lst)
f(4, L) # 打印结果是什么?·[1, 2, 3, 4]
f(5, L) # 打印结果是什么? [1, 2, 3, 4, 5]
f(100) [100]
f(200) # 打印结果是什么?为什么? [100, 200]
如下代码的打印结果是什么?
L = [1, 2, 3]
def f(n=0, lst=None):
if lst is None:
lst = []
lst.append(n)
print(lst)
f(4, L) # 打印结果是什么?·[1, 2, 3, 4]
f(5, L) # 打印结果是什么? [1, 2, 3, 4, 5]
f(100) #[100]
f(200) # 打印结果是什么?为什么? [200]
模块 Module
什么是模块
模块是一个包含有一系列数据,函数,类等组成的程序组
模块是一个文件,模块文件名通常以'.py'结尾
模块的作用:
1. 让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
2. 模块中的变量,函数和类等可提供给其它模块或程序使用
模块的分类:
1. 内置模块(builtins) 在解析器的内部可以直接使用
2. 标准库模块,安装python时已安装具可直接使用
3. 第三方模块(通常为开源), 需要自己安装
4. 用户自己编定的模块(可以作为其它人的第三方模块)
模块的导入 import
import 语句
语法:
import 模块名1 [as 模块新名1], 模块名2[as 模块新名2], ....
示例:
import math # 导入数学模块
import sys, os # 导入sys和os模块
import copy as cp
作用:
将一个模块整体导入到当前模块中
属性用法:
模块名.属性名
help(obj) 可以查看模块的文档字符串
练习:
1. 输入一个圆的半径,打印出这个圆的面积
2. 输入一个圆的面积,打印出这个圆的半径
(要求用math模块内的函数和变量)
from import 语句
语法:
from 模块名 import 模块属性名 [as 属性新名1], 模块属性名2 [as 属性新名2]
作用:
将某模块的一个或多个属性导入到当前模块的作用域
示例:
from math import pi
from math import sin
from math import factorial as fac
from import * 语句
语法:
from 模块名 import *
作用:
将某模块的所有属性导入到当前的模块
示例:
from math import *
s = sin(pi/2)
print(factorial(10))
dir 函数
dir([对象]) 返回一个字符串列表
作用:
1. 如果没有参数调用,则返回当前作用域内所有变量的列表
2. 如果给定一个对象作为参数,则返回这个对象的所在变量(属性)列表
1) 对于一个模块,返回这个模块的全部变量
2) 对于一个类对象,返回类对象的所有变量,并递归基类对象的所有变量
3) 对于其它对象,返回所有变量、类变量和基类变量
数学模块 math