day 12

    xiaoxiao2022-07-07  241

    day12 闭包 closure 将内嵌函数的语句和这些语句的执行环境打包在一起后,得到的函数对象称为闭包(closure) 闭包必须满足以下三个条件:

    必须有一个内嵌函数内嵌函数必须引用外部函数中的变量外部函数返回值必须是内嵌函数

    示例:

    # 此程序示意闭包的用法 # 1. fn为内嵌函数 # 2. fn 用到了fn外部的变量y # 3. make_power将 fn绑定的函数对象返回给调用者 def make_power(y): def fn(x): return x ** y return fn pow2 = make_power(2) #pow2 等同于: # def pow2(x): # return x ** 2 print("5的平方是:", pow2(5)) # 25 print("9的平方是:", pow2(9)) # 81 # def pow4(x): # return x**4 pow4 = make_power(4) print('5的四次方是:', pow4(5)) 结果: 5的平方是: 25 9的平方是: 81 5的四次方是: 625

    说明: 如果一个内嵌函数访问了外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包

    装饰器 decorators(专业提高篇) 什么是装饰器: 装饰器是一个函数,这个函数的主要作用是包装别一个函数或类(后在才讲) 包装的目的是在不改变原函数名的情况下改变被包装对象的行为 实质: 是一个函数

    参数:是你要装饰的函数名(并非函数调用)

    返回:是装饰完的函数名(也非函数调用)

    作用:为已经存在的对象添加额外的功能

    特点:不需要对对象做任何的代码上的变动

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

    示例: 见deco1.py

    def mydeco(fn): # <<==装饰器函数 def fx(): print("hello world!") return fx @mydeco def hello(): # <<== 被装饰函数 print("hello tarena!") # 此时将hello 变量绑定在了mydeco返回的函数上 # hello = mydeco(hello) # 此种做法可以用装饰器@语法解决 hello() # 调用者

    见deco2.py

    def mydeco(fn): # <<==装饰器函数 def fx(): print("++++++++++++") fn() print('------------') return fx @mydeco def hello(): # <<== 被装饰函数 print("hello tarena!") hello() # 调用者 结果: ++++++++++++ hello tarena! ------------

    见deco3.py

    # 以下是一个装饰器函数,在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) 结果: 正在权限验证... 小张 存钱 200 元 正在权限验证... 小赵 存钱 500 元 正在权限验证... 小李 正在办理取钱 300 元的业务

    见deco4.py

    函数的文档字符串: 语法: def 函数名(参数列表): “”“函数的文档字符串”"" 函数语句块 说明:   文档字符串通常来用说明本函数的功能和使用方法 在交互模式下,输入help(函数名) 可以查看函数的"文档字符串"

    函数的__doc__属性: 函数内第一次末赋值给任何变量的字符串是此函数的文档字符串 此字符串会自动赋值给函数的__doc__属性

    示例:

    def cba(): '这是一个文档字符串' pass print(cba.__doc__) # 这是一个文档字符串

    函数定义语句的完整语法:   [@装饰器1]   [@装饰器2]   […] def 函数名([位置形参], [*元组形参], [命名关键字形参], [**字典形参]): “文档字符串” 语句块

    模块 module 什么是模块: 模块是一个包含有一系列变量,函数,类等组成的程序组 模块是一个文件,模块文件通常以.py结尾 作用:   1. 让一些相关的变量,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰 2. 模块中的变量,函数和类可提供给其它模块使用

    模块的分类: 内置模块(biultins), 在解释器的内部可以直接使用 标准库模块,安装python时已安装且可直接使用 第三方模块(通常为开源), 需要自己安装 用户自己编写的模块(可以作为其它人的第三方模块)

    模块的导入 import import 语句 语法: import 模块名1 [as 模块新名1][,模块名2 [as 模块新名2], …]

    作用:   将某模块整体导入到当前模块中 用法: 模块名.属性名 help(模块名) 查看模块内的变量,函数,类等 示例: import math # 导入数学模块 import sys, os # 导入 sys,os模块 练习:

    输入一个圆的半径,打印出这个圆的面积输入一个圆的面积,打印出这个圆的半径 面积 = pi * 半径的平方 (要求用math模块内的函数和变量) from import 语句 语法: from 模块名 import 模块属性名1 [as 属性新名1], 模块属性名2 [as 属性新名2], … 作用: 将某模块内的一个或多个属性导入到当前模块的作用域 示例: from math import pi, sqrt from math import factorial as fac from math import sin area = pi * 10 ** 2 # 可以直接使用导入的函数名或变量名

    from import *语句 语法: from 模块名 import * 作用: 将某模块的所有属性导入到当前模块 dir 函数 格式: dir([对象]) -> 返回一个字符串列表 说明: 如果没有参数调用,则返回当前作用域内的所有变量的列表 如果给定一个对象作为参数,则返回这个对象的所有变量的列表 1. 对于模块,返回这个模块的全部属性 2. 对于一个类对象,返回类对象的所有变量,并递归基类对象的所有属性 3. 对于其它对象返回所有变量,类变量和基类变量

    数学模块 math 模块名math 常用函数见: python_base_docs_html/数学模块math_???.html 练习: 请编写函数 fun(n) 其功能是计算并输出下列多项式的和 Sn = 1 + 1/1! + 1/2! + 1/3! + 1/4! +… +1/n!

    import math def fun(n): """求和""" s = 0 for i in range(n+1): s = s + 1 / math.factorial(i) return s print(fun(20)) 结果: 2.7182818284590455 from math import factorial as fac # 方法2 def fun(n): s = sum(map(lambda i: 1 / fac(i), range(n + 1))) print(s) fun(20)

    练习:

    已知有五位朋友在一起 第五位朋友比第四个人大2岁 第四位朋友比第三个人大2岁 第三位朋友比第二个人大2岁 第二位朋友比第一个人大2岁 第一个人说他今年10岁, 编写程序算出第5个人几岁改写之前的学生信息管理项目源码,要求带有操作界面: ±-----------------------------+ | 1) 添加学生信息 | | 2) 显示所有学生的信息 | | 3) 删除学生信息 | | 4) 修改学生成绩 | | 5) 按学生成绩高-低显示学生信息 | | 6) 按学生成绩低-高显示学生信息 | | 7) 按学生年龄高-低显示学生信息 | | 8) 按学生年龄低-高显示学生信息 | | q) 退出 | ±-----------------------------+ 请选择: 要求,每个功能至少写一个函数与之相对应
    最新回复(0)