函数
一、函数的调用和定义
1. 函数名的定义规则
a.必须是数字、字母下划线组成,不能以数字开头,不能用关键字命名
b.函数名还是要有一定的意义来说明函数的功能
2.函数的调用:
函数名+()
3.定义函数的三种形式:
无参
有参
空函数
二、函数的参数
形参:变量名
实参:变量值
函数调用时将值绑定到名字上,调用结束解除绑定
1.形参:用来接收调用该函数时传递的参数,形式参数
种类和顺序
按照顺序依次为
a.位置参数
b.动态参数:*args:把散列的元素组成元组,没有的话则为()
c.默认参数:可以不传值,用默认的
如果传则覆盖默认值
不设置可变类型的默认参数
对于变化小的参数可以设置默认参数
d.动态参数**kwargs:接收多个关键字参数并且组成字典,如果没有则为{}
2.实参:实际参数
种类和顺序
a.按位置传参:按照从左到右的顺序定义的参数*() *[]可传多个位置参数
b.按关键字传参:按照key=value的形式定义**{}可传多个关键字参数
三、函数的返回值
1.没有返回值
a.什么都不写
b.只写return
c.return None
return作用:结束一个函数的执行,可以返回任意类型的值
2.只有一个返回值
return+要返回的内容
3.返回多个值
四、函数对象:函数是第一类对象,即函数可以当作数据传递
1.可以被引用
2.可以当作参数传递
3.返回值可以是函数
五、函数的嵌套
通俗点说就是一层套一层,有很多子函数
例如:
def f1(): def f2(): def f3(): print('form f3') print('form f2') f3() print('form f1') f2() f1()
函数对象
函数是第一类对象
特点:可以被引用
可以被当作参数传给其他函数
可以当作函数的返回值
可以当作容器类型的一个元素
六、名称空间和作用域
1. 名称空间:存放名字和值的绑定的关系的地方
2.名称空间分三种:
a.内置名称空间
Python解释器自带的名字,Python解释器启动就会生成
b.全局名称空间
文件级别定义的名字都会存放在全局名称空间,执行Python文件时会产生
文件级别定义的名字:顶头写、不缩进的就在全局名称空间存放
c.局部命名空间
定义在函数内部的名字,只有在调用函数时才会生效,结束则失效
三类名称空间的加载顺序:内置---------》全局---------》局部----------
查找名字的顺序:局部----------》全局------------》内置
3.作用域:作用范围
a.全局作用域:内置和全局名称空间属于全局作用域范围,在整那个文件的位置都能被引用,文件执行时有效,执行结束失效
全局存活:全局有效
b.局部作用域:局部名称空间属于局部范围,只在函数内部被引用,局部有效,只在函数调用时生效,函数调用结束失效
临时存活,临时有效
强调:作用域关系在函数定义阶段就已经固定了,与调用位置无关
4.查看作用域:globals(),locals()
七、闭包函数
1. 函数内部定义的函数,称为内部函数,该内部函数包含对外部作用域而不是对全局作用域名字的引用
2.闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,是的该函数无论在何处调用,优先使用自己外层包裹的作用域
例如:
from urllib.request import urlopen def index(urllib): def get(): return urlopen(url).read return get baidu=index('http://www.baidu.com') print(baidu().decode('utf-8'))
八、装饰器(闭包函数的一种引用场景)
1.装饰器的原则:
a.不修改被装饰对象的源代码
b.不修改被装饰对象的调用方式
2.装饰器的目标:
在它原则的前提下,为被装饰对象填上新的功能
3.带参数的装饰器
例如:
带参数的装饰器 开关 f=True f=False def outer(flag): def wrapper(func): def inner(*args,**kwargs): if flag: print('before') ret=func(*args,**kwargs) print('affter') else: ret=func(*args,**kwargs) return ret return inner return wrapper @outer(True) #@wrapper def hahaha(): print('hahaha') @outer(f) def shuanggww(): print(shuanggww) shuanggww() hahaha()
4.多个装饰器装饰一个函数
例如
def qqxing(func): def pipixia_inner(*args,**kwargs): print('in qqxing:before') ret=func(*args,**kwargs) print('in qqxing:after') return ret return pipixia_inner def pipixia(func): def inner(*args,**kwargs): print('in pipixia:before') ret=func(*args,**kwargs) print('in ppipixie:after') return ret return inner @pipixia @qqxing def dapangxie(): print('饿了么') dapangxie()