python的函数---python入门学习(三)
2016-12-08 11:00
232 查看
从实用角度出发,根据数据挖掘中最长使用的语法和数据类型出发,对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]
函数
有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]
相关文章推荐
- python的函数---python入门学习(三)
- python-ironicclient使用
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python的文件系统---python入门学习(二)
- python 删除重复元素字典并在字典中加入重复元素次数
- Python简单爬取蚂蚁窝首页的图片
- 安装python 以及pip
- python-vegetables bird 1
- python常见问题解决方案
- 多版本Python共存,以及pip对应
- 基于python的七种经典排序算法(推荐)