python自学笔记(5)--python函数基础

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 + y
print(f1(2, 3))  # 5

l3 = [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]是函数类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值