一.函数名的运⽤, 第⼀类对象
函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量
1. 函数名的内存地址
def func(fn):
print(fn)
print(func) #结果:打印函数的内存地址 <function func at 0x0000028AA22F2EA0>
2.函数名可以赋值给其他变量
def func1():
print("端午节")
b=func1 #将函数名func1赋值给b ,
b() #执行结果和 func1的执行结果一样 "端午节"
3. 函数名可以当做容器类的元素
def func2():
print("贝贝")
def func3():
print("京京")
def func4():
print("欢欢")
lst=[func2,func3,func4] #如果加括号打印 e ,结果是三个None. 因为没有返回值.
for e in lst:
e() #结果是 贝贝 京京 欢欢;
4.函数名可以当做函数的参数
def func5():
print("端午节要放假,哈哈哈")
def func6(fn): # fn= func5
print("下周就是端午节") #第一步
fn() #第二步 相当于执行func5() 结果是:端午节要放假,哈哈哈
print("真的吗") #第三步
func6(func5) #func5 作为参数,
5.函数名可以作为函数的返回值
def func7():
print("函数一")
def func8():
print("函数二")
print("函数一")
return func8
ret=func7() #func7()反悔的结果是func8,并赋值给ret
ret() #ret() 就相当于func8() 结果是"函数二"
⼆.闭包就是内层函数, 对外层函数(非全局)的变量的引⽤.
闭包的作用 让⼀个变量能够常驻内存. 供后⾯的程序使⽤.
def func():
name="mary"
def func1():
print(name) #闭包 如果是 # name = "alex" 则返回None.
func1()
print(func1.__closure__) #_ _closure_ _来检测函数是否是闭包,返回 cell 就是闭包,(<cell at 0x000002AF8F9475B8: str object at 0x000002AF8F9D89D0>,)
# 返回 None就不是闭包.
func()
#多层嵌套:
def func1():
def func2():
def func3():
print("嘿嘿")
return func3
return func2
func1( )( )( )
三.装饰器初识
开闭原则, ⼜被成为开放封闭原则,你的代码对功能的扩展是开放的, 你的程序对修改源代码是封闭的. 这样的软件设计思路可以
更好的维护和开发.
1.定义一个函数
def creat_people():
print("抟泥土,捏泥人")
creat_people()
2.添加功能
def creat_people():
print("浇水") #增加功能 (但是改变代码了,不符合开放封闭原则)
print("抟泥土,捏泥人")
creat_people()
""" 装饰器执行流程
1. ⾸先访问warter(create_people).
2. 把你的⽬标函数传递给warter的形参fn. 那么后⾯如果执⾏了fn意味着执⾏了你的⽬标函数create_people
3. warter()执⾏就⼀句话. 返回inner函数. 这个时候. 程序认为warter()函数执⾏完. 那么前⾯的create_people函数名
被重新覆盖成inner函数
4 执⾏create_people函数. 实际上执⾏的是inner函数. ⽽inner中访问的恰恰使我们最开
始传递进去的原始的create_people函数
"""
3.装饰器雏形 用语法糖简化代码 语法糖语法( @装饰器 )
def water(fn):
def inner():
print("浇水")
fn()
print("吹仙气")
return inner
@water
def creat_people():
print("抟泥土,捏泥人")
creat_people()
4.装饰器的完整模型代码
def wrapper(func):
def inner(*args,**kwargs): # * 聚合
print("快放假了")
#目标函数之前的内容
ret=func(*args,**kwargs) # * 打散
print("好开心")
#目标函数后面的内容
return ret
return inner
@wrapper #target_func=wrapper(func)
def target_func():
print("我是目标函数,你们都让路")
target_func()
作业讲解:

1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码(升级题)

flag=False
def wrapper(fn):
def inner(*args, **kwargs):
global flag
if flag==True:
ret=fn(*args,**kwargs)
return ret
else:
n=0
while n<3:
user=input("用户名:")
password=input("密码:")
if user=='alex'and password=="123":
flag=True
ret=fn(*args,**kwargs)
return ret
else:
print("请重新输入")
n=n+1
else:
return
return inner
@wrapper
def target_func(*args,**kwargs):
print("我是函数体1")
target_func()
@wrapper
def func1(*args,**kwargs):
print("我是函数体2")
func1()
@wrapper
def func2(*args,**kwargs):
print("我是函数体3")
func2()
												

python全栈开发 * 11知识点汇总 * 1806011的更多相关文章

  1. python全栈开发 * 09知识点汇总 * 1806011

    09 函数初识一 函数的的定义# 函数: 对代码块和功能的封装和定义# 引入 回家过程 未用函数# print("步行")# print("坐地铁")# pri ...

  2. python全栈开发 * 10知识点汇总 * 180612

    10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...

  3. python全栈开发 * 32知识点汇总 * 180717

    32 网络编程 (一)一.架构 定义:程序员开发的一种模式. 分类: C/S 架构 C/S即:Client与Server , 客户端/ 服务器模式 . 缺点 : 冗余 B/S 架构 Browser与S ...

  4. python全栈开发 * 26知识点汇总 * 180709

    26 logging collections random 模块 一.logging低配:日志不能写入文件与显示同时进行 import logging logging.basicConfig(leve ...

  5. python全栈开发 * 01知识点汇总 * 180530

    一 python简介. 1.创始人:  吉多 .范罗苏姆  \   (Guido van Rossum). 2.时间  :  1989年. 3.主要应用领域  :  云计算 \  WEB开发  \   ...

  6. python全栈开发 * 14 知识点汇总 * 180530

    14 生成器表达式 内置函数# 一.迭代器 (补充)# 1.如何判断迭代对象,迭代器# (1).dir(obj)检测对象有没有iter方法,然后it=obj.__iter__() 获取迭代器 , it ...

  7. python全栈开发 * 12 知识点汇总 * 180530

    12 知识点总结 装饰器进阶 ⼀. 通⽤装饰器的回顾1.开闭原则: 对增加功能开放. 对修改代码封闭2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能3.通⽤装饰器的写法:def wrap ...

  8. python全栈开发 * 36知识点汇总 * 180721

    36 操作系统的发展史 进程一.手工操作--穿孔卡片 1.内容: 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制 台开关启动程序针对 ...

  9. python全栈开发 * 31知识点汇总 * 180716

    31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...

随机推荐

  1. SpringBoot项目接口第一次访问慢的问题

    SpringBoot的接口第一次访问都很慢,通过日志可以发现,dispatcherServlet不是一开始就加载的,有访问才开始加载的,即懒加载. 2019-01-25 15:23:46.264 IN ...

  2. C# 图解视频教程 全集200多集

    观看地址 https://www.bilibili.com/video/av21896829/?spm_id_from=333.23.home_video_list.3 学习交流地址 http://w ...

  3. 多线程处理N维度topk问题demo--[c++]

    问题 -对多维度特征进行topk排序,使用c++ 优先队列模拟最大堆. /* ---------------------------------- Version : ?? File Name : d ...

  4. 使用h5py操作hdf5文件

    HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件.HDF 最早由美国国家超级计算应用中心 NCSA 开发,目前在非盈利组织 HDF ...

  5. 系统管理员需知的 16 个 iptables 使用技巧

    现代 Linux 内核带有一个叫 Netfilter[1] 的数据包过滤框架.Netfilter 提供了允许.丢弃以及修改等操作来控制进出系统的流量数据包.基于 Netfilter 框架的用户层命令行 ...

  6. 【C语言天天练(三)】typedef具体解释

    引言: typedef能够看作type define的缩写,顾名思义就是类型定义,也就是说它仅仅是给已有的类型又一次定义了一个方便使用的别名.并没有产生新的数据类型. typedef与define的不 ...

  7. Linux Shell 运算符

    Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 ...

  8. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  9. MySQL数据库的安装教程及相关问题

    MySQL数据库的安装教程及相关问题 2018-07-13 MySQL数据库的下载及安装教程 问题1:Authentication plugin 'caching_sha2_password' can ...

  10. xorm中的几个坑

    项目中使用的是xorm,虽然用了很顺手了,可是还是会遇到一些坑,这里纪录一些. 结构体自动忽略空字段 在xorm中,结构体会自动忽略空字段(或则说默认值,比如int 的0 ,string的" ...