python函数嵌套

本文转载自http://blog.csdn.net/u010402786/article/details/50527291

一.函数的定义

Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:

def 函数名(参数1, 参数2, ……, 参数N): 其代码形式如下面所示:

def function (parameters):
    block
    return vlue
    
    
    
    
  • 1
  • 2
  • 3

在这里说明几点:

  (1)在Python中采用def关键字进行函数的定义,不用指定返回值的类型。

  (2)函数参数parameters可以是零个、一个或者多个,同样的,函数参数也不用指定参数类型,因为在Python中变量都是弱类型的,Python会自动根据值来维护其类型。

  (3)return语句是可选的,它可以在函数体内任何地方出现,表示函数调用执行到此结束;如果没有return语句,会自动返回NONE,如果有return语句,但是return后面没有接表达式或者值的话也是返回NONE。下面看两个例子:
  

def printname():
    print 'way'

def printNum():
    for i in range(0,10):
        print i
    return

def add(a,b):
    return a+b

print printname()
print printNum()
print add(0,1)
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

二.函数的使用

在定义了函数之后,就可以使用该函数了,但是在Python中要注意一个问题,就是在Python中不允许前向引用,即在函数定义之前,不允许调用该函数。看个例子就明白了:

print printname()
def printname():
    return way
    
    
    
    
  • 1
  • 2
  • 3

结果自然是错误了,还未定义就先打印结果。这个就好比如去商场买衣服,先拿回去穿一阵,再付钱。结果自然而知吧。

三.函数的嵌套

1 python支持嵌套函数;
2 内层函数可以访问外层函数中定义的变量,但不能重新赋值(rebind);
3 内层函数的local namespace不包含外层函数定义的变量

def foo():         #定义函数foo(),
    m=3            #定义变量m=3;
    def bar():     #在foo内定义函数bar()
        n=4        #定义局部变量n=4
        print m+n  #m相当于函数bar()的全局变量
     bar()         #foo()函数内调用函数bar()
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四.python中self和init的含义

Python中的self

在Python中的类Class的代码中,常看到函数中的第一个参数,都是self。以及Class中的函数里面,访问对应的变量(读取或者写入),以及调用对应的函数时,都是

①self.valueName
valueName:表示self对象,即实例的变量。与其他的,Class的变量,全局的变量,局部的变量,是相对应的。

②self.function()的形式。
function:表示是调用的是self对象,即实例的函数。与其他的全局的函数,是相对应的。

Python中为何要有self

在类的代码(函数)中,需要访问当前的实例中的变量和函数的,即,访问Instance中的:

对应的变量(property):Instance.ProperyNam,去读取之前的值和写入新的值

调用对应函数(function):Instance.function(),即执行对应的动作

-> 而需要访问实例的变量和调用实例的函数,当然需要对应的实例Instance对象本身

-> 而Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self

-> 所以,我们需要self(需要用到self)

如下代码,完整的演示了,如果没有在类Class的最初的init函数中,正确的初始化实例变量,则会导致后续没有变量可用,因而出现AttributeError的错误:

name = "whole global name";

class Person:
    def __init__(self, newPersionName):
        #self.name = newPersionName;

        #1.如果此处不写成self.name
        #那么此处的name,只是__init__函数中的局部临时变量name而已
        #和全局中的name,没有半毛钱关系
        name = newPersionName;

        #此处只是为了代码演示,而使用了局部变量name,
        #不过需要注意的是,此处很明显,由于接下来的代码也没有利用到此处的局部变量name
        #则就导致了,此处的name变量,实际上被浪费了,根本没有利用到

    def sayYourName(self):
        #此处由于找不到实例中的name变量,所以会报错:
        #AttributeError: Person instance has no attribute 'name'
        print 'My name is %s'%(self.name);

def selfAndInitDemo():
    persionInstance = Person("crifan");
    persionInstance.sayYourName();

###############################################################################
if __name__=="__main__":
    selfAndInitDemo();
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

从上述代码可见,由于在类的初始化(实例化)的init函数中,没有给self.name设置值,使得实例中,根本没有name这个变量,导致后续再去访问self.name,就会出现AttributeError的错误了。

对应的,如果写成self.name,则意思就正确了,就是初始化的时候,给实例中新增加,并且正常设置了正确的值newPersionName了,所以后续再去通过self.name,就可以访问到,当前实例中正确的变量name了。

相应的正确写法的代码如下:

name = "whole global name";

class Person:
    def __init__(self, newPersionName):
        #此处正确的,通过访问self.name的形式,实现了:
        #1.给实例中,增加了name变量
        #2.并且给name赋了初值,为newPersionName
        self.name = newPersionName;

    def sayYourName(self):
        #此处由于开始正确的初始化了self对象,使得其中有了name变量,所以此处可以正确访问了name值了,可以正确的输出了:
        #My name is crifan
        print 'My name is %s'%(self.name);

def selfAndInitDemo():
    persionInstance = Person("crifan");
    persionInstance.sayYourName();

###############################################################################
if __name__=="__main__":
    selfAndInitDemo();
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Python中的_init_
Python中,常会看到,很多类中,都有一个init函数。其作用笔者认为:
1.支持带参数的类的初始化
2.实现类本身相关内容的初始化
具体的如下面所示:

class Person:
    def __init__(self, newPersionName):
        #在开始初始化新的类Class的示例Instance的时候,给对应的,不同的Instance,设置不同的人名(Person name)
        self.name = newPersionName;

    def sayYourName(self):
        #不同的Person的示例,调用同样的方法的时候,说出自己的名字,结果都是对应着自己的,各自不同的名字
        print 'My name is %s'%(self.name); #My name is crifan

def initDemo():
    persionInstance = Person("crifan");
    persionInstance.sayYourName();

###############################################################################
if __name__=="__main__":
    initDemo();
    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

你可能感兴趣的:(python,函数)