函数 - 总结
当python遇到 def 语句时候 ,会在内存中生成一个函数对象,并且这个函数是靠将函数名来引用,但是这个函数体
内部的语句只有在函数的调用的时候才会被执行,而函数调用结束了,就是函数返回时,函数执行完后内部变量
将会被回收
函数是第一类对象 URL
1.函数可以被传递 2.函数可以被当做参数传入, 3.函数可以被反坐返回值返回 4.函数可以被引用
函数名称空间 URL
1.查找:局部 -> 全局 -> 内置 2.函数名称空间的查找顺序在定义阶段就确定了,不会因为调用的位置而改变 3.函数在定义时还没有生产函数的名称空间,只有调用时才会生产 4.函数在定义阶段只检测语法
闭包
1.定义在函数内部的函数,该函数引用了外部函数名称空间的名字,通常将闭包函数用return返回,然后可以在任意位置使用
2.闭包也是给函数传参的一种方式
装饰器 URL
迭代器 URL
1.迭代就是重复的过程,每一次重复称为一次迭代,并且没次重复的结果是下一次重复的初始值 2.python必须要提供一种不依赖索引取值的迭代方式 -> 迭代器 优点: 1.迭代器对象在内存中只是一个内存地址,不占空间 2.迭代器同一时刻在内存中只有一个值 ->更节省内存 缺点: 1.只能往后取,并且是一次性的(索引取值更灵活) 2.无法统计迭代器的长度
-
可迭代对象
1.容器类型的数据都可以称为可迭代对象 2.obj.__iter__ 3.可迭代对象调用__iter__方法变成迭代器对象
-
迭代器对象
1.obj.__iter__, obj__next__ 2.文件 3.迭代器对象一定是可迭代对象 4.迭代器对象.__iter__得到的还是本身
-
for循环原理
1.调用in后面的obj里的__iter__方法 ->迭代器 2.调用迭代器里的__next__方法取值 3.捕捉StopIteration异常,结束迭代 for循环in后面的对象一定要是可迭代对象
生成器
1.只要在函数体内出现yield关键字,那么再执行函数就不会执行函数体代码,会得到一个结果,这个结果就是生成器
2.生成器就是迭代器(有iter和next方法)
yield
1.yield为我们提供了一种自定义迭代器对象的方法,yield所在的函数加括号执行就得到迭代器
2.yield类似return,但yield可以返回多次值,函数暂停与在继续状态是有yield帮我们保存的
三元表达式
三元: 条件, 成立的结果, 不成立的结果
递归 URL
在调用一个函数的过程中,直接或间接又调用该函数本身称之为递归调用 1.递推 : 一层层进入深度的过程,里结果越来越近 2.回溯 : 一层层结束函数返回结果的过程 注意: python递归效率低,因为在一层层的开辟函数名称空间,占内存
匿名函数
匿名函数就是没有变量名绑定的函数,在内存中只是一个内存地址(垃圾回收)
匿名函数通常配合内置函数使用
内置函数
-
max
max(容器类型, key=比较依据)
-
sorted
sorted( 容器类型, key=排序依据, # key=lambda k:dict[k] reverse, # 反转:大到小 ) 返回值是列表
-
map
map(func, 容器类型) map会for循环这个容器类型数据,将拿到的值传给func,这个func的返回值被map放入一个列表中,这个列表就是map的结果 map(lambda i:'%s_NB', list)
-
filter
filter(func, 容器类型) filter会for循环这个容器类型数据,将拿到的值传给func,这个func要进行判断,filter将结果为真的值拿出来放入到一个列表中,这个列表就是filter的结果 filter(lambda i:i==True, list)
-
reduce
from functools import reduce reduce(lambda x,y:x+y, range(1,101) >>>: 5050
-
eval
执行字符串型形式的代码,返回值就是这串代码 print(eval('[1,2,3]')) >>>: [1,2,3] 注:exec类似,但没有返回值
-
forzenset
不可变集合
-
pow
print(pow(2,3,3)) # (2**3)%3 >>>: 2
-
reversed
单纯的将可迭代对象反转,不排序
补充 : python函数传参时值类型和引用类型的区别
(可变类型为引用类型,不可变类型为值类型)
值类型当做参数时,是复制了一份传入函数, 所以在函数内部改变这个值类型数据时不影响全局的
引用类型当做参数时,也是复制了一份,单复制的是引用类型的内存地址,所以还函数内部改变这个引用类型的数据时,全局的也改变