5、函数、对象以及模块
5.1 函数
函数的实现原理、运行机制:
#先定义函数
def MyFirstFunction(name):
'函数定义过程中的name是形参'
#因为它只是个形式,表示占据一个参数的位置
print('传递进来的'+name+'叫做实参,因为它是具体的参数值')
MyFirstFunction('名字')
print(MyFirstFunction.__doc__)
#doc可以获取描述信息,它不能被继承

关键字参数和默认参数
关键字参数:给参数的名字下定义
默认参数:是在参数定义的时候为形参赋初值。
收集参数(可变参数):只要在参数前面加上(*)星号就可以。(传多少个参数都可以)
def test(*parms,exp):
print('参数长度是:',len(parms),exp)
print('第二个参数是:',parms[1])
test(1,'明安',3.1415,5,6,exp=6)

返回值
def hello():
print('HELLO!')
temp = hello()
print(temp)
print(type(temp))

结论:python总会返回某些东西,有值返回值,没有值返回None.
变量的作用域
局部变量:
作用范围只在它所在的函数中,也只在这一‘局部’生效。
函数外无法访问这一局部变量。
全局变量:
在函数外定义的,作用域在整个代码段。可以在函数内部访问它,但不要试图修改它!
注意:全局变量的使用需要小心。在函数内试图修改全局变量时,Python会创建一个新的局部变量代替,名字和这个全局变量是一模一样的(它们互不影响),所以结果和我们预期的会不一样。
global关键字
如果你有必要修改全局变量,可以使用global关键字。
只需要在函数中用global声明全局变量。
内嵌函数和闭包
内嵌函数(内部函数):
def fun1():
print('调用fun1')
def fun2():
print('调用fun2')
fun2()
fun1()

闭包:
是一种编程范式,不同的编程语言实现闭包的方式不同。Python中闭包从表现形式上定义为:如果在一个内部函数里对一个外部作用域(但不是在全局作用域的变量进行引用)那么内部函数就会被认为是闭包。
def FunX(x):
def FunY(y):
return x*y
return FunY
#这个内部函数FunY就是闭包
print(FunX(5)(8))
#结果输出为 40
nonlocal关键字
与global相似,nonlocal关键字可以将变量声明为局部变量。
lambda 表达式(匿名函数)
Lambda表达式,也可称为闭包。
怎么使用:
lambda x: 2 * x + 1
print(lambda x: 2 * x + 1)
g = lambda x: 2 * x + 1
g(5)
lambda表达式实际上是构建了一个函数对象。

作用:
Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,使用lambda就可以使代码更加简洁。
使用lambda就不需要考虑命名的问题了。
简化代码的可读性,可以省略开头def定义部分。
两个内置函数(BIF)
filter() #过滤器
保留关注的信息,摒弃无用的信息。
#filter(None,[1,0,False,True])
#过滤掉任何非true的内容
print(filter(None,[1,0,False,True]))
#list(filter(None,[1,0,False,True]))
print(list(filter(None,[1,0,False,True])))

我们可以自己定义过滤的函数:
#过滤奇数的过滤器
#list(filter(lambda x : x%2,range(10)))
print(list(filter(lambda x : x%2,range(10))))

map() #映射
#list(map(lambda x:x *2,range(10)))
print(list(map(lambda x:x *2,range(10))))
