您的位置:首页 > 编程语言 > Python开发

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 3
python的闭包:闭包就是根据不同的配置信息得到不同的结果。
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]是函数类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: