python的函数---python入门学习(三)

来源:互联网 发布:马重阳 知乎 编辑:程序博客网 时间:2024/06/07 05:11

    从实用角度出发,根据数据挖掘中最长使用的语法和数据类型出发,对python进行学习,主要包含一下几个模块:数据类型、文件系统、函数、类和对象。学习了一段时间python之后,python相较于matlab最大的区别是编程思想和BIF。由原来的面向过程到现在的面向对象,python无处不对象,这句话体会会随着对python的了解而更加深刻。初学难免有疏漏或者错误,欢迎大家指正。

函数  

有C语言或者其他编程语言基础,对函数都不会陌生,这里只是关注一些和C语言不一样的点


1. 关键字参数
调用的时候添加上关键字,python就不会按照顺序去索引参数了,而是用关键字去索引
def add(num_1,num_2):
    return num_1+num_2
add(num_1 = a,num_2 = b) 
 
2. 默认参数 
def add(num_1 = 1,num_2 = 0):
    return num_1+num_2 
add(num_2 = 5)  得到的结果是 6  
  
3. 全局变量与局部变量  
全局变量是存在堆区,作用域是整个代码段,代码段的任意函数都可以访问到全局变量,但是,在函数内部仅仅去访问全局变量就好,不要试图去改变它,因为那样的话,python会使用屏蔽的方式“保护”全局变量,程序会在栈内重新创建一个同样名称的局部变量来代替。对变量进行修改,只是栈区的局部变量,对全局变量没影响。
如何改变这种情况?在函数内用global关键字来声明变量,强制声明这是全局变量,此时函数内部操作的变量就是全局变量。

4. 内嵌函数和闭包
python的函数定义允许嵌套,即在函数内部创建另一个函数
def fun1():
    print(fun1正在被调用)
def fun2():
   print(fun2正在被调用)
fun2()  
闭包:内部函数只能对外部函数的变量进行引用,而不改变外部函数变量
def funx(x):
    def funy(y):
   return x*y
return funy()
i = funx(5)
i(8)
或者 funx(5)(8)
def fun1():
    x = 5
    def fun2():
        x *= x
return x
return fun2()
执行fun1()
上面的这个小程序会报错,错误是因为:fun2中使用x的时候会重新声明一个局部变量在栈里,
而这种操作是还没有声明直接使用了,所以会有错。解决方法是,声明这个变量是nonelocal的
即:
def fun1():
    x = 5
    def fun2():
   nonlocal x
        x *= x
return x
return fun2()
总结:只要是在一个新的函数里面使用到的变量都是在栈区里面定义的,跟全局变量在堆区是不一样的,栈区的代码不能使用堆区的变量,如果要是使用的话需要特别声明,比如上面需要使用到外部的变量则需要声明这个是nonlocal的。

5. lambda表达式
不用考虑命名问题:对于比较抽象并且执行下来只需要一两次的函数,有时候给函数起个名字是件头疼的事,使用lambda表达式不需要考虑命名的问题。

简化代码可读性:使用lambda表达式不需要看函数的定义跳到def的部分。

>>> g = lambda x:x*2+1
>>> g(5)
11


6.两个很有用的函数---filter()和map():
filter(function or none,iterable):
filter()有两个参数,第一个参数可以是一个函数,也可以是none,如果是一个函数的话,后面的可迭代数据中的元素会挨个作为前面函数的变量,进行计算,返回为true的元素留下。
>>> list(filter(lambda x:x%2,range(10)))
[1, 3, 5, 7, 9]
map(funtion,iterable):
map()有两个参数,第一个参数是一个函数,第二个参数是一个可迭代的对象(序列),将序列的每一个元素作为函数的参数进行计算,然后返回计算的结果所构成的新的序列。  
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]  
0 0