1,什么是函数?
函数是基于封装思想的将大量重复的代码封装到一个箱子里 就是一个工具,函数的核心思想就是减少代码的耦合性 提高代码的可读性 复用性
函数声明方式:由def声明 后紧跟函数名参数 函数体
def foo(x):
x+=1
return x
2,基本的函数
其中函数的返回值也可以返回多个值,例如 return 1,2,3 其中多个值用逗号分隔 返回的值的形式会用元组的形式来表示
函数的函数体代码可以任意 决定取决于需求
其中函数的参数分为实参和形参
形参:函数需要接收的值
形参分为 位置形参,默认形参,可变长位置形参,命名关键字形参,可变长关键字形参
位置形参:在调用函数时必须为其传值,不传值则程序会抛出异常
默认形参:在生命的时候就已经为其赋值 在调用函数时可以不用为其传值 但是默认形参的默认值在函数定义后就不可再改变
可变长位置型参:*变量名 用于接受溢出的位置实参用元组的形式存储
命名关键字形参:在可变长参数之后声明 调用函数传参时必须使用关键字参数来传参 而且使用的关键字必须是指定的形式,
可变长位置形参:在命名关键字之后来声明 **变量名来表示 用于接收溢出的关键字实参 并用字典的形式来表示
实参:调用函数时需要向函数传递的值
实参分为关键字实参,位置实参,可变长位置实参,可变长关键字实参,
位置实参:与函数的形参位置一 一对应,
关键字实参:指定为某个形参传值,但是关键字实参必须使用在位置实参的后边
可变长位置实参:使用* 来表示 但是可变长位置实参 *后跟的的值必须是可被for循环遍历的可以是列表 元组 字典 等等类型 当然也可以是字符串 例如*[1,2,3,4]
可变长位置实参:用**来表示 但是**后跟着的值必须是字典类型 例如**{“name”:“long”。。。。。}
ps:可变长位置实参和可变长关键字实参本质上还是位置实参和关键字实参 还是要遵循基本的位置原则即(位置参数,关键字参数,可变长位置参数,可变长关键字参数)
3,函数的嵌套:
函数的嵌套分为调用嵌套和声明嵌套
声明嵌套:即在声明时函数套用函数
调用嵌套:在调用时函数使用了另外一个函数的返回值
4,函数的对象:函数是第一类对象,可以当做常量来引用,可以当做参数,可以当做返回值,可以当做容器内的元素
4,名称空间:存放变量与字面变量值绑定关系的地方
名称空间分为 内置名称空间,全局名称空间,局部名称空间,
内置空间 存放python内置函数等的名称空间
全局空间:存放全局变量的地方,也就是函数之外的变量的绑定值
局部名称空间:存放函数内部的变量与变量值绑定关系,在调用函数时加载,函数结束时释放
变量的查找顺序 局部全局内置
5,作用域:指的是变量在程序中存活的和作用范围 一种由名称空间的延伸出来的一种概念
6,闭包函数:
什么是闭包函数,闭包函数是根据函数对象 作用域 名称空间这些的综合运用 ,将一个内部函数 打破层级限制将内部函数与其所引用的变量值提取出来 就像是函数外部包裹了一层数据被提取了出来 如下代码
def f1(num):
def f2():
num+=1
print(num)
return f2
这时代码不单单是返回了一个函数的地址值 还包括了num这个变量 可以理解为将f2和其相关的东西连根拔了出来
7装饰器:
装饰器就是扩展函数的工具 实际上装饰器本身也是函数
装饰器的核心思想就是 对扩展开放对修改封闭 是函数的综合运用
以下是一个简单的装饰器:
def outter(value1 = 2):
def plugin(func):
def intter(*args,**kwargs):
print(value1*3)
func(*args,**kwargs)
return intter
return plugin
@outter()
def hello(value2):
print(value2)
@装饰器名 python解释器会自动覆盖被装饰函数的全局引用 等同于以下代码的效果
res = outter()
#此时调用outter函数时返回的是plugin函数的引用和包裹的所传递的value1变量的值
hello = res(hello)
#调用res(也就是plugin函数)得到intter函数的引用和其外层包裹的值 将全局hello函数的地址替换为intter函数
1.有参数装饰器无法以传递参数的形式从外部来获取实参 所以必须再在外部包裹一层值提取出来从而获得为装饰器提供参数的需求
2.装饰器原理是将被装饰函数的执行再次封装到另外一个函数内部在另外一个函数内部为其增加功能由外部的函数为被装饰函数提供参数
def plugin(func):
def intter(*args,**kwargs):
print(value1*3)
func(*args,**kwargs)
return intter
迭代器:
1,什么是迭代器 :迭代器是一种循环取值的一种工具
2,啥是迭代?
一种循环 但又不是单纯的循环 每次循环都要基于上次的结果
3,迭代器只能对可迭代对象来进行迭代取值 那么什么是可迭代对象?
在python中内置有__iter__方法的都是可迭代对象
python中还有一种迭代器对象,迭代器对象的概念就是python内置函数中有__next__方法的就是迭代器对象
4,迭代器的使用方式:
迭代器只能向后读取数据,不能向前重复读取,可迭代对象时 使用iter() 方法来获取一个该对象的迭代器对象
使用该迭代器的next()方法来读取下一个数据 在读取到读取对象末尾时如果在读取则会抛出异常(StopItertion)
3,迭代器的优势在于可以适用于任何可迭代对象 但是不能重复读取,同时也无法得知读取对象的数据长度,读取数据也比较慢需要一步步读取需要的值再取值,另外迭代器在内存中所占用的空间也非常小,每次迭代器取值时在内存空间中只有一个值存在
4,在字符串元组等可迭代对象的类型转换中就采用了迭代的方式来对类型强制转换 详情不再列出
迭代器生成器:
python中提供了内置方法来提供迭代器 ,那如何自定义一个迭代器?
1.使用yield关键字 在函数内部使用yield关键字并调用函数时pytho解释器会自动的将函数转换成一个生成器 生成器下也会有__next__与__iter__方法,生成器本身就是一个迭代器
2.使用生成器表达式 it= (a for a in 可迭代对象) 同样可以获得一个生成器,获取生成器的同时并不会执行读取可迭代对象只有当你使用next来获取数据时才会读取可迭代对象中的数据
3.在函数内部使用yield并执行函数时会得到一个返回值,这个返回值就是生成器即迭代器,yield关键字和return关键字相似也可以返回值,都可以中断函数的运行,但是return是直接退出结束了函数,yield是暂停,等待下一次的next操作
4.yield关键字也可以在外部对其传值 使用send方法来对函数内部传值也可以返回一个值两者可以混合使用
表达式:python提供了很多表达式来简化代码的
三元表达式:条件为True时执行的代码 if 条件 else 当条件不成立的时候执行的代码
列表表达式:快速的造出一个列表 格式如下 mylist = [value for value in 可迭代对象 if 条件]
zip:将两个可迭代对象一个个配对组合得到一对元组,但是返回的是一个可以遍历元素的迭代器,并不会再产生一个新的对象占用元素
字典表达式:dic = {x,y for x,y in zip(可迭代对象1,可迭代对象2)}