一.函数名的运⽤, 第⼀类对象
函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量
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. 移动应用开发技术选型:WebApp>HybridApp>NativeApp

    一:概念辨析 Web App:生存在浏览器里的应用,只能运行在浏览器里,宿主是浏览器,不是操作系统.资源一般都在网络上,就是一个触屏版的网站.如:微信公众号.不需要在设备上下载安装,只需通过浏览器即可 ...

  2. 每天一个linux命令:chmod

    1.命令简介 chmod(Change mode) 用来将每个文件的模式更改为指定值.Linux/Unix 的档案调用权限分为三级 : 档案拥有者.群组.其他. u :目录或者文件的当前的用户 g : ...

  3. 微软“小冰”识狗与人工神经网络(V)

    实际上.微软早在2014年7月14日首次透露了一项雄心勃勃的研究计划"亚当计划"("Projrct Adam"),该项目是有关计算机视觉方面的研究项目,也就是后 ...

  4. 华为ap3010DN-V2刷出胖AP并配置接入POE交换机实现上网

    配置FAT AP二层组网示例 组网图形 图1 配置二层网络WLAN基本业务示例组网图 组网需求 如图1所示,FAT AP通过有线方式接入Internet,通过无线方式连接终端.现某企业分支机构为了保证 ...

  5. 《深度探索C++对象模型》调用虚函数

    如果一个类有虚函数,那么这个类的虚函数会被放在一个虚函数表里面, 使用这个类声明的对象中,会有一个指向虚函数表的指针,当使用指向 这个对象的指针或者这个对象的引用调用一个虚函数的时候,就会从虚函数表中 ...

  6. linux下udev

    如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...

  7. mac关闭占用某个端口的进程

    在启动项目的时候有时候会提示端口被占用,但是怎么都找不到那个关闭进程的地方,可以直接通过命令行关闭这个进程: 比如要关闭:8000端口的进程: 1. 查找端口进程: lsof -i: 会把所有的占用8 ...

  8. Visual Studio 2015 msvsmon.exe crashed when c++ debugging with x64

    Completely uninstalling Astrill fixed the issue but this solution is not what I want. Astrill suppor ...

  9. 如何知道局域网内哪些ip被占用----工具法Free IP Scanner

    在局域网中,尤其是在工作室和公司中需要修改IP地址才能上网,通常我们在设置完ip地址后会提示[该ip地址已被占用],又得回头去修改ip地址.本篇经验就介绍一款很好用的免费软件——Free IP Sca ...

  10. .net Core 生产环境报错 MIME

    because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. 主要没 ...