python自学笔记(5)--python函数基础
2017-12-04 16:08
337 查看
python自学笔记(5)--python函数基础python中可以创建4种函数全局函数:定义在模块中国局部函数:嵌套于其他函数中Lambda函数(匿名函数):表达式方法(定义在类中的函数):于特定数据类型关联的函数,并且只能与数据类型关联一起使用。一些相关的概念:def是一个可执行语句,因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,比如if或while中。def创建了一个对象并且将其赋值给一个变量名(即函数名)return用于返回结果,其为可选,无return则默认返回None对象。返回多个值时,彼此间使用分号分隔,且组合为元组形式返回一个对象。def语句运行之后,可以在程序中通过函数后附加括号进行调用。pass的作用:1. 空语句 do nothing2. 保证格式完整3. 保证语义完整。pass其实跟java中的注释TODO语句类似。函数的作用域:由内向外寻找变量声明,如果内部找到了就直接返回,没找到向外找,因此变量的作用域越小,优先级越高。首先是本地,接着是函数内,然后是全局变量,最后是内置变量。python能够改变变量作用域的代码段是def、class、lamda。if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的。作用域问题可参见:http://python.jobbole.com/86465/
x = y = 43#全局变量 def testFunc(): global x #x = 32#本地声明了x,因此可以生效 y = 23#此为本地变量,全局变量中的y在此处没有声明,修改无效,但是读取可以生效 print(x)#43 print(y)#打印的只是本地的y的值23 testFunc() print(y)#全局的y的值没有被修改成功43*************************************************************************
z = 'global' def f1(): x = "from f1"; y = 3 print(x,z) def f2(): x = 'from f2'; print(x , y) f2() f1() #from f1 global#由内向外寻找变量声明,如果内部找到了就直接返回,没找到向外找,因此作用域越小,优先级越高 #from f2 3python的闭包:闭包就是根据不同的配置信息得到不同的结果。
def outer(x): def inner(): print(x) return inner print1 = outer(1) print2 = outer(2) print1() print2()每次函数outer被调用的时候,函数inner都会被重新定义。被函数记住的封闭作用域 – 能够被用来创建自定义的函数,本质上来说是一个硬编码的参数。事实上我们并不是传递参数1或者2给函数inner,我们实际上是创建了能够打印各种数字的各种自定义版本。闭包单独拿出来就是一个非常强大的功能, 在某些方面,你也许会把它当做一个类似于面向对象的技术:outer像是给inner服务的构造器,x像一个私有变量。具体参考网站: https://www.cnblogs.com/ma6174/archive/2013/04/15/3022548.html http://python.jobbole.com/81683/ P.S.当传入不可变对象的时候,在函数内部进行修改是不会改变原变量的值的,但是当传入是可变对象的时候,在函数内部进行修改是可以改变原变量的值的,比如int型传入是不会改变的,相当于函数内部重新创建了一个2,然后让函数内部的x指向了2,但是外部的m仍然指向3;而list是会改变的,list相当于浅复制了一个list传入函数,此时函数内部的l1指向的列表跟函数外部指向的列表是一个地址空间,所以pop之后会影响函数外部的列表结构。不可变对象可以看成是值传递,可变对象可以看成是引用传递。
m = 3 n = 4 def f1(x, y): x -= 1 print(x, y) f1(m, n)#2 4 print(m, n)#3 4 l1 = [1, 2, 3, 4] def f2(x): x.pop() print(x) f2(l1)#[1, 2, 3] print(l1)#[1, 2, 3]函数参数及其匹配模型为了保证在函数内部没有修改外部的变量,可以传入形参为变量的副本,这样就不会改变函数外部的变量了。
l1 = [1, 2, 3, 4] def f1(x): x.pop() print(x) f1(l1[:]) # [1, 2, 3] f1(l1.copy()) # [1, 2, 3] print(l1) # [1, 2, 3, 4]参数传递形式: 位置参数:从左向右 关键字参数:按关键字名称匹配,混用上面两种方式时,位置参数必须写在关键字参数前面。 默认参数:在定义函数的时候就传一个默认值,未知的放左边,有默认值的放右面(后面) 可变参数:在定义函数时,使用星号*开头的参数,可用于收集任意多给予位置或关键字的参数。使用*为收集位置参数,使用**为收集关键字参数。 可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打散,从而传递任意多基于位置或关键字的参数。输入列表,输出元组。python中函数参数传递的几种方法:https://www.cnblogs.com/or2-/archive/2014/02/01/3537104.html匿名函数lambda运算符(是一个语句,不是函数)lambda arg:expression#’:’后面是一个表达式,不能是一个语句,lambda可以支持默认参数值,lambda运算符起到函数速写的作用。
f1 = lambda x, y: x + yprint(f1(2, 3)) # 5l3 = [lambda x: x * 2, lambda y: y * 3, lambda z: z * 4]for i in range(0, len(l3)):print(l3[i](i)) # 0,3,8;注意l3是列表,而l3[i]是函数类型
相关文章推荐
- python自学笔记6之库函数
- Python学习笔记【基础函数篇】
- python学习笔记——基础篇(3):函数的定义
- 【Python自学】09.函数基础(中)
- 学习笔记☞ python 基础(python3)【四】(函数 function,None,return,列表-2,random模块)
- python自学笔记之7编写函数、print、版本差距
- [Python入门及进阶笔记]Python-基础-函数小结
- 【Python自学】10.函数基础(下)
- 【笔记】Python 3自学笔记之函数
- Python基础函数学习笔记(一)
- Python自学笔记之函数2——定义函数以及函数的参数
- Python基础函数学习笔记(三)
- Python自学笔记之函数1——调用函数
- 我的python3基础笔记之 【定义函数】 03
- python基础笔记2-字符串处理函数
- python-基础笔记3-函数的参数类型
- [python自学笔记]python基础
- python自学笔记(一) 基础入门
- Python自学笔记之基础内容回顾
- Python入门笔记(18):Python函数(1):基础部分