目录

  • Python 函数
  • 函数调用
  • 匿名函数
  • return语句
  • 变量作用域

Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。


定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

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

语法

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

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

实例

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

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

函数调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

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

  1. # 定义函数
  2. def printme( str ):
  3. "打印任何传入的字符串"
  4. print(str);
  5. return;
  6.  
  7. # 调用函数
  8. printme("我要调用用户自定义函数!");
  9. printme("再次调用同一函数");

以上实例输出结果:

  1. 我要调用用户自定义函数!
  2. 再次调用同一函数

按值传递参数和按引用传递参数

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

  1. # 可写函数说明
  2. def changeme( mylist ):
  3. "修改传入的列表"
  4. mylist.append([1,2,3,4]);
  5. print("函数内取值: ", mylist)
  6. return
  7.  
  8. # 调用changeme函数
  9. mylist = [10,20,30];
  10. changeme( mylist );
  11. print("函数外取值: ", mylist)

传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:

  1. 函数内取值: [10, 20, 30, [1, 2, 3, 4]]
  2. 函数外取值: [10, 20, 30, [1, 2, 3, 4]]

参数

以下是调用函数时可使用的正式参数类型:

  • 必备参数
  • 关键字参数
  • 默认参数
  • 不定长参数

必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用printme()函数,你必须传入一个参数,不然会出现语法错误:

  1. #可写函数说明
  2. def printme( str ):
  3. "打印任何传入的字符串"
  4. print(str)
  5. return;
  6.  
  7. #调用printme函数
  8. printme();

以上实例输出结果:

  1. Traceback (most recent call last):
  2. File "test.py", line 11, in <module>
  3. printme();
  4. TypeError: printme() takes exactly 1 argument (0 given)

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 printme() 调用时使用参数名:

  1. #可写函数说明
  2. def printme( str ):
  3. "打印任何传入的字符串"
  4. print(str);
  5. return;
  6.  
  7. #调用printme函数
  8. printme( str = "My string");

以上实例输出结果:

  1. My string

下例能将关键字参数顺序不重要展示得更清楚:

  1. #可写函数说明
  2. def printinfo( name, age ):
  3. "打印任何传入的字符串"
  4. print("Name: ", name)
  5. print("Age ", age)
  6. return;
  7.  
  8. #调用printinfo函数
  9. printinfo( age=50, name="miki" );

以上实例输出结果:

  1. Name: miki
  2. Age 50

缺省参数

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

  1. #可写函数说明
  2. def printinfo( name, age = 35 ):
  3. "打印任何传入的字符串"
  4. print("Name: ", name)
  5. print("Age ", age)
  6. return;
  7.  
  8. #调用printinfo函数
  9. printinfo( age=50, name="miki" );
  10. printinfo( name="miki" );

以上实例输出结果:

  1. Name: miki
  2. Age 50
  3. Name: miki
  4. Age 35

不定长参数

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

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

加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:

  1. # 可写函数说明
  2. def printinfo( arg1, *vartuple ):
  3. "打印任何传入的参数"
  4. print("输出: ")
  5. print(arg1)
  6. for var in vartuple:
  7. print var
  8. return;
  9.  
  10. # 调用printinfo 函数
  11. printinfo( 10 );
  12. printinfo( 70, 60, 50 );

以上实例输出结果:

  1. 输出:
  2. 10
  3. 输出:
  4. 70
  5. 60
  6. 50

匿名函数

python 使用 lambda 来创建匿名函数。

  • lambda只是一个表达式,函数体比def简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

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

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

如下实例:

  1. # 可写函数说明
  2. sum = lambda arg1, arg2: arg1 + arg2;
  3.  
  4. # 调用sum函数
  5. print "相加后的值为 : ", sum( 10, 20 )
  6. print "相加后的值为 : ", sum( 20, 20 )

以上实例输出结果:

  1. 相加后的值为 : 30
  2. 相加后的值为 : 40

return语句

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

  1. # 可写函数说明
  2. def sum( arg1, arg2 ):
  3. # 返回2个参数的和."
  4. total = arg1 + arg2
  5. print("函数内 : ", total)
  6. return total;
  7.  
  8. # 调用sum函数
  9. total = sum( 10, 20 );
  10. print "函数外 : ", total

以上实例输出结果:

  1. 函数内 : 30
  2. 函数外 : 30

变量作用域

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

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

  • 全局变量
  • 局部变量

全局变量和局部变量

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

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

  1. total = 0; # 这是一个全局变量
  2. # 可写函数说明
  3. def sum( arg1, arg2 ):
  4. #返回2个参数的和."
  5. total = arg1 + arg2; # total在这里是局部变量.
  6. print("函数内是局部变量 : ", total)
  7. return total;
  8.  
  9. #调用sum函数
  10. sum( 10, 20 );
  11. print("函数外是全局变量 : ", total )

以上实例输出结果:

  1. 函数内是局部变量 : 30
  2. 函数外是全局变量 : 0

Python学习(13)函数的更多相关文章

  1. python学习8—函数之高阶函数与内置函数

    python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...

  2. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  3. 从0开始的Python学习007函数&函数柯里化

    简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...

  4. python学习Day10 函数的介绍(定义、组成、使用)

    今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...

  5. Python学习之函数参数

    上一节,我们学习了Python中是如何定义和调用函数且如何得到返回值的.在调用函数时,有的函数需要参数来启动函数,有的则无需参数.这一节我们来介绍Python中有哪些参数类型. 位置参数 在调用函数时 ...

  6. Python学习笔记 - 函数参数

    >>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...

  7. Python学习笔记—函数

    函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = 73 ...

  8. Python学习之函数篇

    python查看对象,函数帮助文档:.__doc__,例:str.split.__doc__ 查看详细对象,函数文档:help(),例:help(str.split) 函数参数可设置默认值 如果不能提 ...

  9. python学习总结---函数使用 and 装饰器

    # 函数使用 ### 零碎知识 - 灵活的if-else ```python a = 3 if False else 5 print(a) ''' if False: a = 3 else: a = ...

  10. python学习笔记-函数与可变长参数

    一.函数 1. def test(x): y=x+1 return yprint(test) #这是打印函数在内存中的地址 过程:就是没有返回值的函数 在python中过程也是函数,就算没哟返回值,也 ...

随机推荐

  1. HDU 3487:Play with Chain(Splay)

    http://acm.hdu.edu.cn/showproblem.php?pid=3487 题意:有两种操作:1.Flip l r ,把 l 到 r 这段区间 reverse.2.Cut a b c ...

  2. Java实现批量修改文件名称

    import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** ...

  3. http://www.bejson.com/go.html?u=http://www.bejson.com/demo2.html

    json 解析工具http://www.bejson.com/go.html?u=http://www.bejson.com/demo2.html

  4. js笔记---封装一般运动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 20150626_Andriod_02_ListView2_列表与详细信息

    android listview 参考地址: http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html  http://xy ...

  6. 山东理工大学第七届ACM校赛-经济节约 分类: 比赛 2015-06-26 10:34 19人阅读 评论(0) 收藏

    经济节约 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 由于经济紧张,某国国王决定减少一部分多余的士兵,这些士兵在边界都有各自的 ...

  7. js查找出现次数最多的字母

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  8. 制作动画效果:《CSS3 Animation》

    在开始介绍Animation之前我们有必要先来了解一个特殊的东西,那就是"Keyframes",我们把他叫做“关键帧”,玩过flash的朋友可能对这个东西并不会陌生.下面我们就一起 ...

  9. MBB类似jquery.bxslider插件轮播效果

    首先,如图一:当打开页面是,产品出现了淡入淡出切换轮播状态,当鼠标点击左边的小图时,就会切换出相对应的大图,当鼠标移开的时候,这个轮播就会停止自动轮播,只有人工手动才能进行切换:是一个不错的体验! 如 ...

  10. shell脚本之间互相调用

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh 方法二: source ./subscript.sh 注意: .两个点之间,有空格 ...