pipe3 install request
函数是第一类对象的含义是函数可以被当作数据处理
1.引用
2.当参数传给一个函数
3.可以当作函数的返回值
4.可以当作容器类型的元素
def pay(): print('支付。。。') def withdraw(): print('取款。。。') def transfer(): print('转账。。。') def check_balance(): print('查看余额。。。') def shopping(): print('购物。。。') func_dic={ '1':pay, '2':withdraw, '3':transfer, '4':check_balance, '6':shopping } while True: msg=""" 1 支付 2 取款 3 转账 4 查看余额 5 退出 6 购物 """ print(msg) choice=input('>>: ').strip() if choice == '5':break if choice not in func_dic: print('输入的指令不存在傻叉') continue func_dic[choice]()
#函数的嵌套定义 def f1(): def f2(): print('from f2') f2() f1()
函数嵌套的应用
from math import pi def circle(radius,action='area'): #radius=10 def area(): return pi * (radius ** 2) def perimeter(): return 2 * pi * radius if action == 'area': return area() elif action == 'perimeter': return perimeter() circle(10) print(circle(10)) print(circle(10,action='perimeter'))
函数的嵌套调用
def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(1,2,3,4))
当作容器
def func(): #<function func at 0x00000000001F2E18> print('from func') print(func) def foo(func):#<function func at 0x00000000001F2E18> print(func) foo(func)
名称空间与作用域 LEGB 其中E指的是非内置非全局以及非局部名称空间的部分
1.名称空间namespaces
存放名字与值绑定关系的地方
2、名称空间分为三大类
内置名称空间
作用:存放python解释器自带的名字
生命周期
在解释器启动启动时生效,解释器关闭时失效
全局名称空间:
作用:除了内置的与局部的名字外,其余都是全局名字
生命周期
在文件执行时生效,在文件执行完毕时失效
例如:x,func,y,l,z都是 x=1 def func(): a=1 y=2 l=[1,2] if 3 > 2: if if if z=3#会立马执行
局部名称空间:
作用:用于存放函数调用期间函数体产生的名字
生命周期:
在文件执行过程
如果调用了某个函数才会临时生效,在函数执行完毕后失效
三种名称空间的加载顺序是:
内置-》全局-》局部
名称空间就是用来存放名字与值的绑定关系的,所以但凡要查找名字
一定是从三者之一找到,查找顺序:
从当前所在的位置倒着查找,如果当前所在的位置是局部名称空间,
则查找顺序是:
局部-》全局-》内置
作用域
作用域:
域指的是区域、范围,作用域即作用的范围
全局作用范围,全局作用域(内置名称空间与全局名称空间)
全局有效,全局存活
def f1(): def f2(): def f3(): print(len) f3() f2() f1()
局部作用范围,局部作用域(局部名称空间)
局部有效,临时存活
作用域关系是在函数定义阶段就固定死了,与函数的调用位置无关
x=1 def f1(): print(x) def f2(): # print(f1) x=11111111111111111111111111111 f1() f2() 最终得到1再次印证了作用域关系在函数定义阶段就固定死了,与函数的调用位置无关
函数对象+作用域:****** def f1(): x=1 def inner(): print('from inner',x) return inner f=f1() # print(f) def bar(): x=111111111111111111111111111111111111111111111 f() bar() ============================= from inner 1
globa的使用,明确改全局作用域
x=1 def foo(): x=2 foo() print(x) #这种情况下x=1 x=1 def foo(): global x #声明我虽然在foo内,但是我要操作x不是我自己的x我要操作的是全局的 x=2 foo() print(x) #这种情况下x=2
nonlocal 了解知识点
在局部如果想要修改全局的可变类型,不需要借助任何声明,可以直接修改
在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量就可以直接修改了
x=[] def f1(): x.append(1) f1() f1() print(x)