目录


一、函数对象

1.函数是第一类对象

#第一类对象的特性:
# 可以被引用
# 可以当做参数传递
# 返回值是函数
# 可以当做容器类型的元素
# def func():
# print('from func')
#可以被引用
# f=func()
#可以被当做参数
# def bar(x):
# print(x)#func内存地址
# x()
# bar(func) #当做返回值
# def bar(x):#x=func
# return x #return func
#
# res=bar(func)#res=func
# print(res)
# res()

2.取代多分支if

用多分支if时

 def auth():
print('登陆。。。') def register():
print('注册。。。') def search():
print('查看。。。') def interactive():
while True:
print('''
1.登陆
2.注册
3.查看''')
choice=input('>>>').strip()
if choice=='':
auth()
elif choice=='':
register()
elif choice=='':
search()
else:
print('输入非法') l=[auth,register,search,interactive,]
l[3]()

取代多分支if时

 def auth():
print('登陆。。。') def register():
print('注册。。。') def search():
print('查看。。。') def transfer():
print('转账。。。') def interactive():
while True:
print('''
1.登陆
2.注册
3.查看
4.转账
''')
choice=input('>>>').strip()
dic={
'':auth,
'':register,
'':search,
'':transfer,
}
if choice in dic:
dic[choice]()
else:
print('输入非法') interactive()

二、函数的嵌套

1.函数的嵌套调用

def max(x,y):
return x if x > y else y def max4(a,b,c,d):
res1=max(a,b)
res2=max(res1,c)
res3=max(res2,d)
return res3
print(max4(1,2,3,4))

2.函数的嵌套定义

def func1():
print(1)
def func2():
print(2)
def func3():
print(3)
func3()
func2()
func1()

    函数嵌套调用的应用:

db_path='db.txt'
def uname():
while True:
uname = input('username>>>').strip()
if not uname.isalnum():continue
with open(r'%s'%db_path,'r',encoding='utf-8')as f:
for line in f:
if line.startswith(uname):
print('该用户已注册,请重新输入')
break
else:
return uname def upwd():
while True:
upwd1=input('password>>>').strip()
upwd2=input('confirm password>>>').strip()
if upwd1==upwd2:
return upwd1
else:
print('输入不一致,请重新输入') def balance():
balance=input('请输入充值金额>>>').strip()
if balance.isdigit():
return balance def db_handle(*args):
info=':'.join(args)
with open(r'%s'%db_path,'a',encoding='utf-8') as f:
f.write('%s\n' %(info)) def interactive():
username=uname()
password=upwd()
user_balance=balance()
return username,password,user_balance username,password,user_balance=interactive()
print(username)
print(password)
print(user_balance) db_handle(username,password,user_balance)

三、名称空间与作用域

名称空间

1.什么是名称空间,名称空间的分类及其各自特点

'''
名称空间是用于存放名字与值绑定关系的地方(内存地址)。
名称空间可分为三类:
1.内置名称空间(python解释器自带名字)
具有全局性、解释器启动生效,关闭则失效
2.全局名称空间(顶头写的,没有任何缩进、文件级别的,名称在文件执行时就生效,文件结束或名称引用计数为0的时候就失效)
不是内置的,也不是在函数内的
3.局部名称空间
函数的参数以及函数内的名字都存放在局部名称空间,在函数调用时临时生效
'''

2.名称空间的加载顺序

#1、python解释器先启动,因而首先加载的是:内置名称空间
#2、执行test.py文件,然后以文件为基础,加载全局名称空间
#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间

3.名字查找的顺序

'''
查找名字(以局部为开始):
局部》全局》内置
'''
x=2
def f1():
x=3
def f2():
# x=4
def f3():
print(x)
f3()
# x=5
f2()
f1()#打印x=4

作用域

'''
作用域分为两类:
1.全局作用域:
包含:内置、全局
特点:在任何位置都能访问到、伴随程序整个生存周期
2.局部范围
包含:局部
特点:只能在函数内使用、调用函数时生效,结束调用就失效
'''

四、闭包函数

'''
闭包函数就是定义在函数内的函数,并且该函数包含对外部函数作用域中名字的引用。
闭包函数打破了原本函数嵌套的层级限制,能在外面或其它函数里用。闭包函数的作用域关系是在函数定义阶段就被规定死了,与其调用位置无关。接下来我们就来试一下:
'''
def outter():
x=3
def inner():
print('from inner',x)
return inner
x=4
f=outter()
f()#返回from inner 3

五、装饰器

为什么要用装饰器?

开放封闭原则:
对修改源代码封闭,对扩展功能开放

什么是装饰器?

装饰器就是在不修改源代码与调用方式的前提下,为被装饰对象增加新功能。
装饰器与被装饰对象均可以是任意调用的对象。

装饰器的使用:

 import time

 def timmer(func):#专门用来接收最原始的被装饰函数
#func=index
def inner(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)#调用最原始的被装饰函数
stop_time=time.time()
print('run time is %s'%(stop_time-start_time))
return res
return inner @timmer#index=timmer(index)将被装饰函数当作参数传给timmer
def index():
time.sleep(2)
print('welcome to index page')
return 789 @timmer#home=timmer(home)将被装饰函数当作参数传给timmer
def home(name):
time.sleep(4)
print('welcome <%s> to home page'%name)
return name
@timmer#about=timmer(about)将被装饰函数当作参数传给timmer
def about():
time.sleep(5)
print('this is a detail page')
return 456 index()
home(input('username>>>').strip())
about()

无参

 import time
userinfo={
'username':None,
}
file_path=r'db.txt'
def timmer(func):
def inner(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('run time is %s'%(stop_time-start_time))
return res
return inner def wauth(engine):
def auth(func):
def inner(*args,**kwargs):
if engine=='file':
if userinfo['username']:
print('用户已登陆')
res = func(*args, **kwargs)
return res
while True:
uname=input('username>>>').strip()
pwd=input('password>>>').strip()
with open(file_path,'r',encoding='utf-8') as f:
for line in f:
user=line.strip('\n').split(',')
if uname==user[0] and pwd==user[1]:
print('登陆成功')
userinfo['username']=uname
res=func(*args,**kwargs)
return res,uname
else:
print('用户名或密码错误')
elif engine=='mysql':
print('基于MySQL认证')
elif engine=='ldap':
print('基于LDAP认证')
else:
print('认证失败')
return inner
return auth @timmer
@wauth('file')
def index():
time.sleep(3)
print('welcome to index page') @timmer
@wauth('file')
def home():
time.sleep(1)
print('welcome to home page') index()
home()

有参

Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器的更多相关文章

  1. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  2. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  3. python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

    今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): y=func() print(y) def foo( ...

  4. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  5. Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)

    今日主要内容 1.  函数默认值细节(*) 2.  数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3.  函数对象:函数名的各种应用场景 (*****) 4.  名称空间与作用域:解释 ...

  6. day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义

    复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 # 函数的参数 # 1)实参与形参: # -- 形参:在函数定义时()中出现的参数 # -- 实参:在函 ...

  7. 【0809 | Day 12】可变长参数/函数的对象/函数的嵌套/名称空间与作用域

    可变长参数 一.形参 位置形参 默认形参 二.实参 位置实参 关键字实参 三.可变长参数之* def func(name,pwd,*args): print('name:',name,'pwd:',p ...

  8. day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)

    一,复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascll进行比较 # print('a' > 'A') #True # print('ac' > 'ab' ...

  9. python函数篇:名称空间、作用域和函数的嵌套

    一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...

  10. Python之路【第五篇】: 函数、闭包、装饰器、迭代器、生成器

    目录 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之可迭代对象 函数之迭代器 函数之生成器 面向过程的程序设计思想 一.函数进阶之函数对象 1. 函数对象 秉承着 ...

随机推荐

  1. BizTalk Server 如何处理大消息

    什么是大消息? 遗憾的是,此问题的答案不而直接与特定的消息大小,绑定,取决于你的 Microsoft 的特定瓶颈 BizTalk Server 系统. 与大消息关联的问题可分为以下几类: 内存不足错误 ...

  2. codeforces493B

    Vasya and Wrestling CodeForces - 493B Vasya has become interested in wrestling. In wrestling wrestle ...

  3. Codeforces997C Sky Full of Stars 【FMT】【组合数】

    题目大意: 一个$n*n$的格子,每个格子由你填色,有三种允许填色的方法,问有一行或者一列相同的方案数. 题目分析: 标题的FMT是我吓人用的. 一行或一列的问题不好解决,转成它的反面,没有一行和一列 ...

  4. 洛谷P1501 Tree II

    LCT 还是LCT的板子,下放标记和那道线段树2一样,先放乘..之前用char忘记getchar,调了好久... 注意开long long!! #include <bits/stdc++.h&g ...

  5. 【XSY2732】Decalcomania 可持久化线段树 分治

    题目描述 有一个陶瓷瓶周围有\(n\)个可以印花的位置.第\(i\)个与第\(i+1\)个位置之间的距离为\(d_i\),在第\(i\)个位置印图案要\(t_i\)秒. 机器刚开始在\(0\)号位置, ...

  6. word 2013 题注、图注、插入图片自动修改大小、批量更新题注编号

    1 .题注 图片下面的文字说明,如  图 1.1.1 2.图注 图的标题格式,可以右键修改段落为居中,选中图片,点下此格式快捷居中等其他格式 3. 题注插入 效果 如下 4.题注自动居中对齐 先点击图 ...

  7. 「CodeForces 581D」Three Logos

    BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...

  8. 【CF891C】Envy(最小生成树)

    [CF891C]Envy(最小生成树) 题面 Codeforces 洛谷 题解 考虑\(MST\)的构建过程,对于所有权值相同的边一起考虑. 显然最终他们连出来的结果是固定的. 把连边改为把联通块联通 ...

  9. html内嵌框架

    html内嵌框架 <iframe>标签会创建包含另外一个html文件的内联框架(即行内框架),src属性来定义另一个html文件的引用地址,frameborder属性定义边框,scroll ...

  10. 「SCOI2014」方伯伯的商场之旅 解题报告

    「SCOI2014」方伯伯的商场之旅 我一开始的想法会被两个相同的集合位置去重给搞死,不过应该还是可以写的,讨论起来老麻烦. 可以先钦定在\(1\)号点集合,然后往后调整一部分. 具体一点,通过前缀和 ...