Python自定义函数的创建、调用和函数的参数详解


Posted in Python onMarch 11, 2014

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创见函数,这被叫做用户自定义函数。
一、定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:

1.函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
2.任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法

def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。

实例

以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

def printme( str ):
   "打印传入的字符串到标准显示设备上"
   print str
   return

二、函数调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了printme()函数:

#!/usr/bin/python# Function definition is here
def printme( str ):
   "打印任何传入的字符串"
   print str;
   return;
# Now you can call printme function
printme("我要调用用户自定义函数!");
printme("再次调用同一函数");
#以上实例输出结果:

#我要调用用户自定义函数!
#再次调用同一函数

三、按值传递参数和按引用传递参数
所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

#!/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]]

四、函数的参数
Python函数可以使用的参数类型:

1.必备参数
2.命名参数
3.缺省参数
4.不定长参数

1、必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用printme()函数,你必须传入一个参数,不然会出现语法错误:

#!/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)

2、命名参数

命名参数和函数调用关系紧密,调用方用参数的命名确定传入的参数值。你可以跳过不传的参数或者乱序传参,因为Python解释器能够用参数名匹配参数值。用命名参数调用printme()函数:

#!/usr/bin/python#可写函数说明
def printme( str ):
   "打印任何传入的字符串"
   print str;
   return;
#调用printme函数
printme( str = "My string");
#以上实例输出结果:

#My string

下例能将命名参数顺序不重要展示得更清楚:
#!/usr/bin/python#可写函数说明
def printinfo( name, age ):
   "打印任何传入的字符串"
   print "Name: ", name;
   print "Age ", age;
   return;
#调用printinfo函数
printinfo( age=50, name="miki" );
#以上实例输出结果:

#Name:  miki
#Age  50

3、缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:

#!/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:  miki
#Age  50
#Name:  miki
#Age  35

4、不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:

def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]

加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:
#!/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
#输出:
#70
#60
#50

五、匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

Lambda函数能接收任何数量的参数但只能返回一个表达式的值,同时只能不能包含命令或多个表达式。
匿名函数不能直接调用print,因为lambda需要一个表达式。
lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法

lambda函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

如下实例:
#!/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 :  30
#Value of total :  40

六、关于return语句
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:

#!/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 :  30
#Outside the function :  30

七、变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
1.全局变量
2.局部变量

八、变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

#!/usr/bin/pythontotal = 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 :  30
#Outside the function global total :  0
Python 相关文章推荐
Python的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
Python中的os.path路径模块中的操作方法总结
Jul 07 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
django初始化数据库的实例
May 27 Python
Pycharm更换python解释器的方法
Oct 29 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
解决django FileFIELD的编码问题
Mar 30 Python
Python reversed反转序列并生成可迭代对象
Oct 22 Python
python中添加模块导入路径的方法
Feb 03 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 Python
Python 字典(Dictionary)操作详解
Mar 11 #Python
Python 元组(Tuple)操作详解
Mar 11 #Python
Python 列表(List)操作方法详解
Mar 11 #Python
Python基本数据类型详细介绍
Mar 11 #Python
常用python数据类型转换函数总结
Mar 11 #Python
python读取csv文件示例(python操作csv)
Mar 11 #Python
Python help()函数用法详解
Mar 11 #Python
You might like
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
第十五节--Zend引擎的发展
2006/11/16 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
php去除数组中重复数据
2014/11/18 PHP
php获取远程文件内容的函数
2015/11/02 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
jquery实现图片按比例缩放示例
2014/07/01 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
Python CSV模块使用实例
2015/04/09 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
django框架两个使用模板实例
2019/12/11 Python
使用Tkinter制作信息提示框
2020/02/18 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
中学学校门卫岗位职责
2014/08/15 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
财务部岗位职责范本
2015/04/14 职场文书
农村党员干部承诺书
2015/05/04 职场文书
Java Spring Lifecycle的使用
2022/05/06 Java/Android