一丶函数对象
函数对象指的是可以吧函数当做变量去使用,有4种使用方法
1.函数可以赋值
def func(): print('from func') f=func # print(f,func) f()
2.可以当做参数传给另外一个函数
def func(): print('from func') def foo(x): # x = func的内存地址 x() foo(func) # foo(func的内存地址)
3.可以当做另外一个函数的返回值
def func(): print('from func') def foo(x): # x=func的内存地址 return x # return func的内存地址 res=foo(func) # foo(func的内存地址) print(res) # res=func的内存地址 res()
4.可以当做容器类型的一个元素
def func(): print('from func') l=[func,] print(l) l[0]() dic={'k1':func} print(dic) dic['k1']()

def login(): '''登入功能''' while True: inp_name = input('输入账号:').strip() with open('a.txt','rt',encoding='utf-8')as f: for i in f: name,pwd = i.strip().split(':') if name == inp_name: while True: inp_pwd = input('输入密码:').strip() if inp_pwd == pwd: print('登入成功') return inp_name else: print('密码错误') else: print('无此用户') def aaa(): pass def pay_money(username): '''充值''' dic = {} with open('b.txt','rt',encoding='utf-8')as f: for i in f: name,money = i.strip().split(':') dic[name] = int(money) while True: inp_money = input('输入要充值的金额:').strip() if not inp_money.isdigit(): print('充值的钱必须是10的倍数') continue dic[username] += int(inp_money) with open('b.txt','w',encoding='utf-8')as w: for name,money in dic.items(): w.write(f'{name}:{money} ') print('充值成功') break def cut_money(username): '''提现''' dic = {} with open('b.txt','rt',encoding='utf-8')as f: for i in f: name,money = i.strip().split(':') dic[name] = int(money) while True: inp_money = input('输入要提现的金额:').strip() if not inp_money.isdigit(): print('提现的钱必须是10的倍数') continue dic[username] -= int(inp_money) with open('b.txt','w',encoding='utf-8')as w: for name,money in dic.items(): w.write(f'{name}:{money} ') print('提现成功') break def check_money(username): '''余额查询''' with open('b.txt','rt', encoding='utf-8')as f: for i in f: name,money = i.strip().split(':') if username == name: print('您的余额为:{}'.format(money)) break dic = { '0':['退出',None], '1':['充值',pay_money], '2':['转账',aaa], '3':['提现',cut_money], '4':['查询余额',check_money], } def decide_cmd(name): '''判断输入的命令''' while True: for k in dic: print(k,dic[k][0]) cmd = input('请输入命令编号>>: ').strip() if not cmd.isdigit(): print('必须输入命令编号的数字,傻叉') continue if cmd == '0': break if cmd in dic: dic[cmd][1](name) else: print('没有此命令') if __name__ == '__main__': name = login() if name: decide_cmd(name)
二丶函数的嵌套
1.函数的嵌套定义:在函数内定义其他函数
def f1(): def f2(): pass
2.函数的嵌套调用:在调用一个函数的过程中又调用其他函数

def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): # 第一步:比较a,b得到res1 res1=max2(a,b) # 第二步:比较res1,c得到res2 res2=max2(res1,c) # 第三步:比较res2,d得到res3 res3=max2(res2,d) return res3 res=max4(1,2,3,4) print(res)

def circle(radius,action=0): from math import pi def perimiter(radius): return 2*pi*radius def area(radius): return pi*(radius**2) if action == 0: return perimiter(radius) elif action == 1: return area(radius) res = circle(33,action=0) print(res)
三丶函数闭包
1.大前提
闭包函数=名称空间与作用域+函数嵌套+函数对象
核心点:名字的查找关系是以函数定义阶段为准
2.什么是函数闭包
"闭"函数指的该函数是内嵌函数
"包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)
def f1(): x = 33333333333333333333 def f2(): print(x) f2() x=11111 def bar(): x=444444 f1() def foo(): x=2222 bar() foo()
3.为何要有闭包函数=>闭包函数的应用
两种为函数体传参的方式
方式一:直接把函数体需要的参数定义成形参
def f2(x): print(x) f2(1) f2(2) f2(3)
方式二:
def f1(): x=3 def f2(): print(x) return f2 x=f1() print(x) x()
闭包案例

import requests # 传参的方案一: def get(url): response=requests.get(url) print(len(response.text)) get('https://www.baidu.com') get('https://www.cnblogs.com/linhaifeng') get('https://zhuanlan.zhihu.com/p/109056932') # 传参的方案二: def outter(url): # url='https://www.baidu.com' def get(): response=requests.get(url) print(len(response.text)) return get baidu=outter('https://www.baidu.com') baidu() cnblogs=outter('https://www.cnblogs.com/linhaifeng') cnblogs() zhihu=outter('https://zhuanlan.zhihu.com/p/109056932') zhihu()