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))))

 

根据提供的函数对指定序列做映射。