python函数定义和操作详解介绍 – Python入门开发教程

上一章Python教程请查看:python日期和时间介绍处理及其操作
函数是一组有组织的、可重用的代码,用于执行单个相关操作,函数为你的应用程序提供了更好的模块化和高度的代码重用。
【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/pythontotal = 0; # 全局变量 # 函数定义 def sum( arg1, arg2 ): # 返回两个参数的和 total = arg1 + arg2; print "函数内部total : ", total return total; # 调用sum函数 sum( 10, 20 ); print "函数外部total : ", total

    推荐阅读