函数 - 总结

函数

当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函数传参时值类型和引用类型的区别

(可变类型为引用类型,不可变类型为值类型)

值类型当做参数时,是复制了一份传入函数, 所以在函数内部改变这个值类型数据时不影响全局的

引用类型当做参数时,也是复制了一份,单复制的是引用类型的内存地址,所以还函数内部改变这个引用类型的数据时,全局的也改变

 

 

 

posted @ 2019-12-01 16:12  waller  阅读(109)  评论(0)    收藏  举报