闭包 closure
将内嵌函数的语句和这些语句的执行环境打包在一起后,得到的函数对象称为闭包(closure)。
闭包必须满足以下三个条件:
1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数中的变量
3.外部函数返回值必须是内嵌函数
示例:
def make_power(y):
def fn(x):
return x ** y
return fn
pow2 = make_power(2)
→→→→此处pow2获取到的是fn(且此时y=2),fn在函数内部创建,运行结束销毁,
但是绑定关系由 fn 转移到 pow2 留下了。
print('5的平方是',pow2(5))
【【【questions:闭包的优势在哪?】】】
答:可以不改变原有代码的情况下更改功能。
说明:
如果一个内嵌函数访问了外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包。
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
装饰器 decorators(专业提高篇)
什么是装饰器
装饰器是一个函数,这个函数的主要作用是包装一个函数或类。
包装的目的是在不改变原函数名的基础上改变被包装对象的行为。
函数装饰器 function decorators
函数装饰器是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数。
示例1:
def mydeco(fn): # <<装饰器函数>>
def fx():
print('hello world')
return fx
def hello(): # <<被装饰函数>>
print('Nice to meet you!')
@mydeco >>>相当于引用了mydeco,并带入以下函数
fs = mydeco(hello) # 相当于把hello绑定对象换成了mydeco返回的fx
fs() >>>hello world
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
示例2:
def save_money(name,x):
print(name,'存钱',x,'元')
def withdraw(name,x):
print(name,'正在办理取钱',x,'元的业务')
save_money('小张',200)
save_money('小赵',500)
withdraw('小李',300)
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
# 装饰器函数,在fn调用之前,加上权限验证功能
def priv_check(fn):
def fx(name,x):
print('正在权限验证...')
fn(name,x)
return fx
@priv_check
def save_money(name,x):
print(name,'存钱',x,'元')
@priv_check
def withdraw(name,x):
print(name,'正在办理取钱',x,'元的业务')
save_money('小张',200)
save_money('小赵',500)
withdraw('小李',300)
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
函数的文档字符串:
语法:
def 函数名(参数列表):
"""函数的文档字符串"""
函数语句块
说明:
文档字符串通常用来说明本函数的功能和使用方法
在交互模式下,输入help(函数名),可以查看函数的‘文档字符串’。
函数的__doc__属性:(文档字符串与__doc__属性不同在于 '' 的数量)
函数内第一行末尾赋值给任何变量的字符串是此函数的文档字符串,此字符串会自动
复制给函数的__doc__属性。
示例:
def cba():
'这是一个文档字符串'
pass
print(cba.__doc__) >>>这是一个文档字符串
函数定义语句的完整语法:
[@装饰器1]
[@装饰器2]
[@装饰器3]
...
def func([位置形参],[*tuple形参],[命名关键字参数],[**字典形参])
"文档字符串"
语句块
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
模块 module
什么是模块:
模块是一个包含有一系列变量,函数,类等组成的程序组
模块是个文件,模块文件通常以.py结尾
作用:
1.让一些相关的变量,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
2.模块中的变量,函数和类可以提供给其他的模块使用
模块的分类:
内置模块(built-in):在解释器内部可以直接使用标准库模块,安装python时已经安装且可以使用
第三方模块(通常为开源):需要自己安装
用户自己编写的模块(可以作为其他人的第三方模块)
模块的导入:
import语句:
语法:import 模块名1
import 模块名1 as 模块名2 【, 模块名3 as 模块名4】
示例:
import math
import sys,os 导入sys,os两个模块
作用:将某模块整体导入到当前模块中,可以调用其中的函数(属性)
用法:
‘模块名.属性名’
交互模式下,导入模块后,help(模块名)查看模块内的变量,函数,类等
from import 语句
示例:(此类下边的所有函数直接可用,不用 math.xxx )
from math import pi,sqrt
from math import factorial as fac
from math import sin
from math import * (导入math模块内所有属性,直接可用)
dir函数:
格式: dir([对象]) -> 返回一个字符串列表
说明:如果没有参数调用,则返回当前作用域内的所有变量的列表;
如果给定一个对象作为参数,则返回这个对象的所有变量的列表。
1.对于模块,返回这个模块的全部属性
2.对于一个类对象,返回类对象的所有变量,并递归基类对象的所有属性
3.对于其他对象返回所有变量,类变量和基类变量