函数补充
命名关键词参数:在定义函数时,在*args与**kwargs之间的参数就称为命名关键词参数,这种参数的特点就是必须要按照key=value的形式去传值,否则会报错。
函数对象
1.函数是第一类对象,指的就是函数的内存地址可以像一个变量值一样去引用
def foo(): print('from foo') f=foo 将foo赋值给f print(f) 内存地址与foo是一样的 f() 可直接调用f
2.变量值可以当做一个参数传给另外一个函数
def bar(x): print(x) x=11111 bar(x) 此处将x的值传递给函数bar
3.变量值可以当做函数的返回值
def func(x): return x f=func(12345) f后的变量值可以直接当做函数func的返回值 print(f)
4.变量值可以当做容器类型的元素
即变量值可以是以元组、列表、字典类型的元素
使用函数对象的特性,可以取代多分支的if判断
def register(): print('注册....') def login(): print('登录....') def pay(): (定义函数功能) print('支付....') def transfer(): print('转账....') func_dic={ '1':register, '2':login, 将函数对象以字典形式存放 不能加括号,加括号代表直接调用函数的功能 '3':pay, '4':transfer } while True: print(""" 0 退出 1 注册 2 登录 3 支付 4 转账 """) choice=input('请输入你的操作: ').strip() if choice == '0':
break if choice not in func_dic: print(‘输入的指令不存在') continue func_dic[choice]() 因为字典中的value就是一个个函数对象,所以此处取到value就是取到了函数体所以要加括号
choice是用户要选择的数字,数字就是字典中的key
函数的嵌套与调用
函数的嵌套与调用:顾名思义就是在一个函数中又调用了其他的函数
def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1=max2(a,b) 调用函数中max2的返回值进行函数max4的操作 res2=max2(res1,c) res3=max2(res2,d) return res3
函数的嵌套定义:即在函数定义的过程中又在函数体内定义了另外一个函数
def func(): def foo(): 在函数体类定义新的函数 print('from foo') print(foo) foo() 要单纯调用foo函数只能在函数foo平级下调用 x=1 print(x) func() 要调用函数体内的函数先调用最外层函数
名称空间与作用域(zzzz)
在了解名称空间之前我们需要回顾之前的一个遗留问题,就是我们的变量。我们使用变量的时候都知道的是,在内存中开辟了一个空间将变量值放了进去,而这个值就与变量名形成了绑定关系,那么我们的变量名呢?究竟放在了哪里?
一.名称空间相关
1.名称空间(Namespaces):指的就是存放名字与值的内存地址绑定关系的地方 (x = 内存地址,再通过内存地址找到值本身)
2.名称空间的分类:
内置名称空间:存放的是python解释器自带的名字
由python解释器的启动产生,也由python解释器的关闭而销毁
全局名称空间:即在顶级(行首)定义的名字
执行python程序时产生,python程序执行完毕后自动销毁
局部名称空间:在函数内定义的名字
在函数调用时临时产生,在函数调用完毕后自动销毁
三种名称空间产生的先后顺序是 内置名称空间----->全局名称空间----->局部名称空间
x=0 def f1(): x=1 def f2(): x=2 def f3(): x=3 print(x) 查找名字则会首先在当前所在的位置一层层的向上查找,即若上一层没有就再上一层,直至全局名称空间 f3() f2() f1()
二.作用域相关
作用域指的就是作用范围,作用域也分为两大类
全局作用域:包含内置与全局名称空间的名字,特点是:全局存活,全局有效
局部作用域:包含局部名称空间的名字,特点是临时存活,局部有效
强调!!!!:作用域关系是在函数定义阶段就固定死的,与调用位置无关
def f1(): print(xxx) xxx=111 函数f1的返回值就是xxx=111 def f2(): xxx=222 尽管在此处更改的xxx的值 但是在定义xxx的时候就已经固定死了 f1() 在此处调用函数f1不会影响xxx的值 f2()
闭包函数
闭包函数的定义:闭包函数指的就是定义在一个函数内部的函数,并且该内部函数包含对外层函数名字的引用
def outter(): x=1 def inner(): print('from inner',x) x在此处就引用了外层的x=1的值 return inner 返回的值就是x=1 f=outter() 若有其他函数需要调用inner的值不可以直接调用,只能调用outter,所以在此处给outter赋了一个变量名f def foo(): x=111111111111111111111111111111111111 f() 在此处虽然调用了inner也更改了x的值,但是根据作用域关系x已经固定了所以不可改变 foo()
为函数体传值的两种方式
1.直接以参数的形式传入
def foo(name): print('hello %s' %name) 使用%s用于接收用户要传入的值 foo('egon') foo('egon') 用户输入的参数会传到函数foo里 foo('egon')
2.使用闭包函数形式传入
def outter(name): name='egon' 定义name def foo(): print('hello %s' %name)从上层name取值赋值给%s return foo f=outter('egon') 转换后直接调用新的变量名f f() f() f()
扩展:爬虫
pip3 install requests 问题 实现爬虫功能 import requests 导入系统 def get(): response=requests.get(url) if response.status_code == 200: 条件 print(response.text) 解决方案一: def get(url): response=requests.get(url) if response.status_code == 200: print(response.text) get('https://www.baidu.com') get('https://www.baidu.com') 需要重复输入网址 get('https://www.baidu.com') 解决方案二: def outter(url): url='https://www.baidu.com' 定义好网址 def get(): response=requests.get(url) if response.status_code == 200: print(response.text) return get baidu=outter('https://www.baidu.com') 给函数名传参 cnblogs=outter('https://www.cnblogs.com') baidu() 简化调用 cnblogs()