函数嵌套
嵌套调用是在函数内又调用其他函数
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))
嵌套定义是在函数内又定义其他函数
# def f1(): # print(‘f1‘) # def f2(): # print(‘f2‘) # def f3(): # print(‘f3‘) # f3() # f2() # f1()
名称空间
名称空间分为三类:
1、内置名称空间
python解释器自带的名字,解释器启动的时候生效,关闭的的时候失效。
2、全局名称空间
文件级别的名字,在执行文件时生效,在文件结束或者文件执行期间被删除则失效
# x=1 # def func(): # name=‘egon‘ # # del func # # print(‘===‘) # print(‘===‘) # print(‘===‘) # print(‘===‘) # print(‘===‘)
3、局部名称空间
存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部名称空间)
在函数调用时临时生效,函数结束时则失效
# def func(x): # y=2 # # func(1)
加载顺序:内置名称空间>全局名称空间>局部名称空间
查找顺序:局部名称空间>全局名称空间>内置名称空间
# len=‘global‘ # 第三查找目标 # def f1(): # # len=1 # 第二查找目标 # def f2(): # # len=2 # 第一查找目标 # print(len) # f2() # # f1()
作用域
全局作用域:包含内置名称空间与全局名称空间的名字
特点:
1、在任何位置都可以访问的到
2、该范围会伴随这个生命周期
局部作用域:包含局部名称空间的名字
特点:
1、只能在函数内使用
2、调用函数时生效,调用结束时失效
函数对象
因为函数是第一类的对象,函数我们可以像变量一样引用,当做数据传递
1、可以被引用
# x=1 # y=x # def bar(): # print(‘from bar‘) # # f=bar # f()
2、可以当做参数传入
# def bar():# print(‘from bar‘)## def wrapper(func): #func=bar# func() #bar()## wrapper(bar)
3、可以当做函数当中的返回值
# def bar():# print(‘from bar‘)# def foo(func): #func=<function bar at 0x00000225AF631E18># return func #return <function bar at 0x00000225AF631E18># f=foo(bar) #f=<function bar at 0x00000225AF631E18># # print(f)# f()
4、可以当做容器类型的元素
# def get(): # print(‘from get‘) # def put(): # print(‘from put‘) # l=[get,put] # # print(l) # l[0]()
def auth(): print(‘登陆。。。。。‘) def reigster(): print(‘注册。。。。。‘) def search(): print(‘查看。。。。‘) def transfer(): print(‘转账。。。。‘) def pay(): print(‘支付。。。。‘) dic={ ‘1‘:auth, ‘2‘:reigster, ‘3‘:search, ‘4‘:transfer, ‘5‘:pay } def interactive(): while True: print(""" 1 认证 2 注册 3 查看 4 转账 5 支付 """) choice=input(‘>>: ‘).strip() if choice in dic: dic[choice]() else: print(‘非法操作‘) interactive()
小例子
闭包函数
定义在函数内部的函数,并且该函数包含对外部函数用域中名字的作用,该函数就成为闭包函数
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
# def outter(): # name=‘egon‘ # def inner(): # print(‘my name is %s‘ %name) # return inner # f=outter()
作用域关系:在函数定义阶段就规定死勒,与调用位置无关
# def outter(): # x=2 # def inner(): # x=1 # f在定义时固定死了 # print(‘from inner‘,x) # return inner # f=outter # def foo(): # x=1111 # 在此处调用也不会改变x的值 # f() # foo()
1 db_path=‘db.txt‘ 2 def get_uname(): 3 while True: 4 uname=input(‘用户名>>:‘).strip() 5 if not uname.isalpha(): 6 print(‘\033[45m用户名必须为英文字母...\033[0m‘) 7 continue 8 with open(r‘%s‘ %db_path,‘r‘,encoding=‘utf-8‘) as f: 9 for line in f: 10 uinfo=line.strip(‘\n‘).split(‘,‘) 11 if uname == uinfo[0]: 12 print(‘\033[45m用户名已存在...\033[0m‘) 13 break 14 else: 15 return uname 16 def get_pwd(): 17 while True: 18 pwd1=input(‘请输入密码>>: ‘).strip() 19 pwd2=input(‘再次输入密码>>: ‘).strip() 20 if pwd1 == pwd2: 21 return pwd1 22 else: 23 print(‘\033[45m两次输入的密码不一致,请重新输入...\033[0m‘) 24 def get_bal(): 25 while True: 26 bal=input(‘请输入余额: ‘).strip() 27 if bal.isdigit(): 28 # bal=int(bal) 29 return bal 30 else: 31 print(‘\033[45m钱必须是数字,傻叉...\033[0m‘) 32 def file_hanle(uname,pwd,bal): 33 with open(r‘%s‘ %db_path,‘a‘,encoding=‘utf-8‘) as f: 34 f.write(‘%s,%s,%s\n‘ %(uname,pwd,bal)) 35 def register(): 36 uname=get_uname() #拿到合法的用户名 37 pwd=get_pwd() #拿到合法的密码 38 bal=get_bal() #拿到合法的余额 39 file_hanle(uname,pwd,bal) #写入文件 40 register()
注册功能
原文地址:https://www.cnblogs.com/Yang-Sen/p/8665520.html
时间: 2024-11-07 07:44:45