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

Python学习(一)函数定义、使用与嵌套

2016-01-16 11:58 543 查看

一.函数的定义

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

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

def function (parameters):
block
return vlue


在这里说明几点:

  (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)


二.函数的使用

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

print printname()
def printname():
return way


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

三.函数的嵌套

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()


四.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();


从上述代码可见,由于在类的初始化(实例化)的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();


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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 python class