个性化阅读
专注于IT技术分析

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/python

total = 0; # 全局变量
# 函数定义
def sum( arg1, arg2 ):
   # 返回两个参数的和
   total = arg1 + arg2; 
   print "函数内部total : ", total
   return total;

# 调用sum函数
sum( 10, 20 );
print "函数外部total : ", total 

赞(0)
未经允许不得转载:srcmini » python函数定义和操作详解介绍 – Python入门开发教程

评论 抢沙发

评论前必须登录!