上一章Python教程请查看:python日期和时间介绍处理及其操作
函数是一组有组织的、可重用的代码,用于执行单个相关操作,函数为你的应用程序提供了更好的模块化和高度的代码重用。
如你所知Python为你提供了许多内置函数如print()等,但你也可以创建自己的函数,这些函数称为用户定义函数。
1、定义一个函数
你可以定义函数来提供所需的功能,下面是在Python中定义函数的简单规则。
- 函数块以关键字def开头,然后是函数名和括号(())。
- 任何输入参数或参数都应该放在这些括号内,你还可以在这些括号中定义参数。
- 函数的第一个语句可以是可选语句——函数的文档字符串或文档字符串。
- 每个函数中的代码块都以冒号(:)开头,并且是缩进的。
- 语句return [expression]退出一个函数,可选地将一个表达式返回给调用者,没有参数的return语句等同于没有参数的return语句。
def functionname( parameters ):
"function_docstring"
function_suite
return [expression]
默认情况下参数具有位置行为,你需要按照定义它们的相同顺序通知它们。
下面的函数接受一个字符串作为输入参数,并在标准屏幕上打印它。
def printme( str ):
"打印函数的参数字符串"
print str
return
2、调用一个函数
定义一个函数只给它一个名称,指定函数中包含的参数和代码块的结构。
一旦确定了函数的基本结构,就可以通过从另一个函数或直接从Python提示符调用它来执行它,下面是调用printme()函数的例子
#!/usr/bin/python
# 函数定义
def printme( str ):
"打印函数的参数字符串"
print str
return;
# 调用printme函数
printme("第一次调用函数")
printme("第二次调用")
3、通过引用传递和值传递
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
这里我们维护传递的对象的引用,并在同一对象中附加值。
还有一个例子:参数通过引用传递,而引用在被调用的函数中被覆盖。
#!/usr/bin/python
# 函数定义
def changeme( mylist ):
"这将把传递的列表更改为这个函数"
mylist = [1,2,3,4]; # 这将在我的列表中增加新的引用
print "函数内部的值: ", mylist
return
# 现在你可以调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print "函数外的值: ", mylist
参数mylist是changeme函数的本地参数,在函数中更改mylist不会影响mylist,该函数没有完成任何操作。
4、函数参数
可以使用以下形式参数调用函数
- 所需的参数
- 关键字参数
- 默认参数
- 变长参数
5、所需的参数
必需的参数是按正确的位置顺序传递给函数的参数,这里函数调用中的参数数量应该与函数定义完全匹配。
要调用printme()函数,你肯定需要传递一个参数,否则它将给出如下语法错误:
#!/usr/bin/python
# 函数定义
def printme( str ):
"打印函数的参数字符串"
print str
return;
# 调用printme函数
printme()
6、关键字参数
关键字参数与函数调用相关,当你在函数调用中使用关键字参数时,调用者将通过参数名称标识参数。
这允许你跳过参数或将它们打乱顺序,因为Python解释器能够使用提供的关键字将值与参数匹配,你还可以通过以下方式对printme()函数进行关键字调用
#!/usr/bin/python
# 函数定义
def printme( str ):
"打印函数的参数字符串"
print str
return;
# 调用printme函数
printme( str = "My string")
下面的示例给出了更清晰的描述,注意参数的顺序并不重要。
#!/usr/bin/python
# 函数定义
def printinfo( name, age ):
"打印函数参数"
print "Name: ", name
print "Age ", age
return;
# 调用printinfo函数
printinfo( age=50, name="miki" )
7、默认参数
默认参数是这样一种参数,如果在该参数的函数调用中没有提供值,则该参数将假定为默认值。下面的例子给出了一个关于默认参数的概念,如果没有传递默认参数,它将输出默认年龄
#!/usr/bin/python
# 函数定义
def printinfo( name, age = 35 ):
"打印函数参数"
print "Name: ", name
print "Age ", age
return;
# 调用printinfo函数
printinfo( age=50, name="miki" )
printinfo( name="miki" )
8、变长参数
在定义函数时,可能需要处理比指定的参数更多的函数,这些参数称为可变长度参数,在函数定义中没有命名,这与required和default参数不同。
非关键字变量参数函数的语法是这样的:
def functionname([formal_args,] *var_args_tuple ):
"function_docstring"
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 )
9、匿名函数
这些函数被称为匿名函数,因为它们没有使用def关键字以标准方式声明,可以使用lambda关键字创建小型匿名函数。
- Lambda形式可以接受任意数量的参数,但仅以表达式的形式返回一个值,它们不能包含命令或多个表达式。
- 匿名函数不能直接调用print,因为lambda需要一个表达式
- Lambda函数有自己的本地名称空间,除了参数列表中的变量和全局名称空间中的变量外,不能访问其他变量。
- 尽管lambda看起来是一个函数的单行版本,但它们并不等同于C或c++中的内联语句,后者的目的是在调用期间传递函数堆栈分配,以提高性能。
lambda函数的语法只包含一条语句,如下所示
lambda [arg1 [,arg2,.....argn]]:expression
下面的示例展示了lambda形式的函数是如何工作的
#!/usr/bin/python
# 函数定义
sum = lambda arg1, arg2: arg1 + arg2;
# 将sum作为一个函数调用
print "Total的值 : ", sum( 10, 20 )
print "Total的值 : ", sum( 20, 20 )
10、返回语句
语句return [ expression ]退出一个函数,可选地将一个表达式返回给调用者,没有参数的return语句等同于没有参数的return语句。
上面所有的例子都没有返回任何值,你可以从一个函数返回一个值如下所示:
#!/usr/bin/python
# 函数定义
def sum( arg1, arg2 ):
# 添加两个参数并返回它们
total = arg1 + arg2
print "函数内部 : ", total
return total;
# 调用sum函数
total = sum( 10, 20 );
print "函数外部 : ", total
11、变量的范围
程序中的所有变量可能在该程序中的所有位置都不可访问,这取决于你在哪里声明了一个变量。
变量的范围决定了程序中可以访问特定标识符的部分,在Python中有两种基本的变量作用域
- 全局变量
- 局部变量
12、全局变量和局部变量
在函数体内部定义的变量具有局部作用域,而在外部定义的变量具有全局作用域。
这意味着局部变量只能在声明它们的函数内部访问,而全局变量可以被所有函数在整个程序体中访问。当你调用一个函数时,在函数内部声明的变量将进入作用域,下面是一个简单的例子:
#!/usr/bin/python
total = 0; # 全局变量
# 函数定义
def sum( arg1, arg2 ):
# 返回两个参数的和
total = arg1 + arg2;
print "函数内部total : ", total
return total;
# 调用sum函数
sum( 10, 20 );
print "函数外部total : ", total
评论前必须登录!
注册