函数:
一、什么是函数
很多时候,Python程序中的语句都会组织成函数的形式。通俗地说,函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字,这样,我们就可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句。另外,每次使用函数时可以提供不同的参数作为输入,以便对不同的数据进行处理;函数处理后,还可以将相应的结果反馈给我们。
有些函数是用户自己编写的,通常我们称之为自定义函数;此外,系统也自带了一些函数,还有一些第三方编写的函数,如其他程序员编写的一些函数,我们称为预定义的Python函数,对于这些现成的函数用户可以直接拿来使用。
二、为什么使用函数
我们之所以使用函数,主要是出于两个方面的考虑:一是为了降低编程的难度,通常将一个复杂的大问题分解成一系列更简单的小问题,然后将小问题继续划分成更小的问题,当问题细化为足够简单时,我们就可以分而治之。这时,我们可以使用函数来处理特定的问题,各个小问题解决了,大问题也就迎刃而解了。二是代码重用。我们定义的函数可以在一个程序的多个位置使用,也可以用于多个程序。此外,我们还可以把函数放到一个模块中供其他程序员使用,同时,我们也可以使用其他程序员定义的函数。这就避免了重复劳动,提供了工作效率。
基本语法
def fun(n,m,...)
....
....
....
(return n)
关于return
1,return可以有,可以没有,
2,没有return的方法返回None,
3,return后面没有表达式也是返回None,
4,函数无法到达结尾也返回None。
关于变量与方法
1,定义的方法名会在“当前符号表”中注册,这样系统就知道这个方法名为一个方法,将
方法赋值给一个变量,这个变量则变成了对应的方法。
2,与我们以前学习的程序层次一样的,每个层次都有自己的符号表。内层符号表是可以
使用外层符号表中的东西,但是已经不是一个层次的,所以没有什么关系,意思是说,
上层联系下层只能通过参数,下层联系上层只能是返回值。并且到现在为止,我们只知
道有值传递。也就是说,函数内部与外部完全没有什么关系。
3,也就是说,到现在为止,函数层与上层之间没有任何关系,它有自己的符号表,参数
只能从上层得到值,却不能改变上层的内容,一切在函数内部使用的变量都是函数本身
的与上层无关。也就是说函数基本不能主动改变上层的东西。
函数是重用的程序段。它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为调用函数。我们已经使用了许多内建的函数,比如len和range。
函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。
1、定义函数:
例如:
[python]
<span style="font-family:Microsoft YaHei;font-size:18px;"># Filename: function1.py
def sayHello():
print('Hello World!') # block belonging to the function
# End of function
sayHello() # call the function
sayHello() # call the function again
</span>
输出:
C:\Users\Administrator>python D:\python\function1.py
Hello World!
Hello World!
工作原理:
我们使用上面解释的语法定义了一个称为sayHello的函数。这个函数不使用任何参数,因此在圆括号中没有声明任何变量。参数对于函数而言,只是给函数的输入,以便于我们可以传递不同的值给函数,然后得到相应的结果。我们在上程序中调用了两次相同的函数从而避免了对同一程序段写两次。
2、函数形参:
函数取得的参数是你提供给函数的值,这样函数就可以利用这些值做一些事情。这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值。
参数在函数定义的圆括号对内指定,用逗号分割。当我们调用函数的时候,我们以同样的方式提供值。注意我们使用过的术语——函数中的参数名称为形参而你提供给函数调用的值称为实参。
使用函数形参:
例如:
[python]
<span style="font-family:Microsoft YaHei;font-size:18px;"># Filename: func_param.py
def printMax(a, b):
if a > b:
print(a, 'is maximum')
elif a == b:
print(a, 'is equal to', b)
else:
print(b, 'is maximum')
printMax(3, 4) # directly give literal values
x = 5
y = 7
printMax(x, y) # give variables as arguments
</span>
输出:
C:\Users\Administrator>python D:\python\func_param.py
4 is maximum
7 is maximum
工作原理:
这里,我们定义了一个称为printMax的函数,这个函数需要两个形参,a和b。我们使用if..else语句找出两者之中较大的一个数,并且打印较大的那个数。
在第一个printMax使用中,我们直接把数,即实参,提供给函数。在第二个使用中,我们使用变量调用函数。printMax(x, y)使实参x的值赋给形参a,实参y的值赋给形参b。在两次调用中,printMax函数的工作完全相同。
3、局部变量:
当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。
例如:
[python]
<span style="font-family:Microsoft YaHei;font-size:18px;"># Filename: func_local.py
x = 50
def func(x):
print('x is', x)
x = 2
print('Changed local x to', x)
func(x)
print('x is still', x)
</span>
输出:
C:\Users\Administrator>python D:\python\func_local.py
x is 50
Changed local x to 2
x is still 50
工作原理:
在函数中,我们第一次使用x的 值 的时候,Python使用函数声明的形参的值。
接下来,我们把值2赋给x。x是函数的局部变量。所以,当我们在函数内改变x的值的时候,在主块中定义的x不受影响。
在最后一个print语句中,我们证明了主块中的x的值确实没有受到影响。
4、全局变量:
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是全局的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。
你可以使用定义在函数外的变量的值(假设在函数内没有同名的变量)。然而,并不推荐这样做,并且我们应该尽量避免这样做,因为这使得程序的读者会不清楚这个变量是在哪里定义的。使用global语句可以清楚地表明变量是在外面的块定义的。
我们可以这样使用:
[python]
<span style="font-family:Microsoft YaHei;font-size:18px;"># Filename: func_global.py
x = 50
def func():
global x
print('x is', x)
x = 2