一.函数名的运⽤, 第⼀类对象
函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量
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. python 内置&amp;&amp;递归

    lambda 优点: 1:可以简单使用一个脚本来替代我们的函数 2:不用考虑命名的问题 3:简化代码的可读性,不用跳转到def了,省去这样的步骤 内置函数:bif filter:过滤器 map:映射 ...

  2. Bower 自定义组件文件夹名称

    默认情况下, bower 会自动把文件安装在文件夹 bower_components 下面,如果希望自定义这个文件夹的名称为 components ,可以创建一个名称为 ".bowerrc& ...

  3. Ext 三级联动 及附值

    /// <reference path="../../ext.js" />Ext.define('Myview.Region', { extend: 'Ext.form ...

  4. log4net 使用教程

    1.下载log4net (Google log4net) //已有 2.unzip log4net 3.运行VS,新建 c# Windows应用程序. 4.添加引用Log4NET 5.新建一个应用程序 ...

  5. 转载C#函数式程序设计初探——基础理论篇

    转载网址:http://www.cnblogs.com/Hlia/archive/2013/04/20/3029701.html 个人认为,C#语言的某些设计并不非常适合函数式开发,比如它的类型推断并 ...

  6. ini文件解析c库(iniparser)

    一.交叉编译ini解析库 1.官方网站http://ndevilla.free.fr/iniparser 下载iniparser-3.1.tar.gz 2.解压 tar -zxvf iniparser ...

  7. Qt之等待提示框三(QLabel进行多图片切换)

    之前分享过的等待提示框有用QMovie播放gif图片实现的,也有纯代码实现的,今天再次分享另一种实现方式,如题目所示:QLabel进行图片的切换!     进行用户登录的时候,往往都需要后台线程进行用 ...

  8. extjs表单

      Ext.onReady(function(){ Ext.BLANK_IMAGE_URL = '../ext/resources/images/default/s.gif'; Ext.QuickTi ...

  9. el表达式 分页提交 中文乱码

    el表达式 分页提交 中文乱码 网上找了很多资料,没能解决我的问题.并不是说网上的那些资料不好.而是不适用于我的问题吧. 看看的的问题: 原始页面 单击下一页 , 乱码. 引起的原因则是因为自己的js ...

  10. Android Intent 其中一个分析

    Intent该架构由三个区域组成: Client.正在发送此Intent的activity. Server,那是,activityManagerService.java,它是主要负责这些分布Inten ...