函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
你可以定义一个由自己想要功能的函数,以下是简单的规则:
def functionname( parameters ): '函数_文档字符串' function_suite return [expression]
默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。
以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。
def printme( str ): '打印传入的字符串到标准显示设备上' print str return
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。
如下实例调用了printme()函数:
#coding=utf-8#!/usr/bin/python # Function definition is heredef printme( str ): '打印任何传入的字符串' print str; return; # Now you can call printme functionprintme('我要调用用户自定义函数!');printme('再次调用同一函数');
以上实例输出结果:
我要调用用户自定义函数!再次调用同一函数
所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:
#coding=utf-8#!/usr/bin/python # 可写函数说明def changeme( mylist ): '修改传入的列表' mylist.append([1,2,3,4]); print '函数内取值: ', mylist return # 调用changeme函数mylist = [10,20,30];changeme( mylist );print '函数外取值: ', mylist
传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:
函数内取值: [10, 20, 30, [1, 2, 3, 4]]函数外取值: [10, 20, 30, [1, 2, 3, 4]]
以下是调用函数时可使用的正式参数类型:
必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用printme()函数,你必须传入一个参数,不然会出现语法错误:
#coding=utf-8#!/usr/bin/python #可写函数说明def printme( str ): '打印任何传入的字符串' print str; return; #调用printme函数printme();
以上实例输出结果:
Traceback (most recent call last): File 'test.py', line 11, in <module> printme();TypeError: printme() takes exactly 1 argument (0 given)
命名参数和函数调用关系紧密,调用方用参数的命名确定传入的参数值。你可以跳过不传的参数或者乱序传参,因为Python解释器能够用参数名匹配参数值。用命名参数调用printme()函数:
#coding=utf-8#!/usr/bin/python #可写函数说明def printme( str ): '打印任何传入的字符串' print str; return; #调用printme函数printme( str = 'My string');
以上实例输出结果:
My string
下例能将命名参数顺序不重要展示得更清楚:
#coding=utf-8#!/usr/bin/python #可写函数说明def printinfo( name, age ): '打印任何传入的字符串' print 'Name: ', name; print 'Age ', age; return; #调用printinfo函数printinfo( age=50, name='miki' );
以上实例输出结果:
Name: mikiAge 50
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:
#coding=utf-8#!/usr/bin/python #可写函数说明def printinfo( name, age = 35 ): '打印任何传入的字符串' print 'Name: ', name; print 'Age ', age; return; #调用printinfo函数printinfo( age=50, name='miki' );printinfo( name='miki' );
以上实例输出结果:
Name: mikiAge 50Name: mikiAge 35
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
def functionname([formal_args,] *var_args_tuple ): '函数_文档字符串' function_suite return [expression]
加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:
#coding=utf-8#!/usr/bin/python # 可写函数说明def printinfo( arg1, *vartuple ): '打印任何传入的参数' print '输出: ' print arg1 for var in vartuple: print var return; # 调用printinfo 函数printinfo( 10 );printinfo( 70, 60, 50 );
以上实例输出结果:
输出:10输出:706050
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下实例:
#coding=utf-8#!/usr/bin/python #可写函数说明sum = lambda arg1, arg2: arg1 arg2; #调用sum函数print 'Value of total : ', sum( 10, 20 )print 'Value of total : ', sum( 20, 20 )
以上实例输出结果:
Value of total : 30Value of total : 40
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:
#coding=utf-8#!/usr/bin/python # 可写函数说明def sum( arg1, arg2 ): # 返回2个参数的和.' total = arg1 arg2 print 'Inside the function : ', total return total; # 调用sum函数total = sum( 10, 20 );print 'Outside the function : ', total
以上实例输出结果:
Inside the function : 30Outside the function : 30
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
#coding=utf-8#!/usr/bin/python total = 0; # This is global variable.# 可写函数说明def sum( arg1, arg2 ): #返回2个参数的和.' total = arg1 arg2; # total在这里是局部变量. print 'Inside the function local total : ', total return total; #调用sum函数sum( 10, 20 );print 'Outside the function global total : ', total
以上实例输出结果:
Inside the function local total : 30Outside the function global total : 0
联系客服