一、概述

在编写脚本的过程中,对于要重复完成的工作,我们可以提取出来,将其编写为函数,在脚本中使用时,调用即可,在python中,函数必须先声明,然后才能在脚本中使用。使用函数时,只要按照函数定义形式向函数传递必须的参数,就可以调用函数完成所需的功能。

二、自定义函数

2.1 函数声明、调用

在python中使用def可以声明一个函数。完整的函数是由函数名、参数以及函数实现语句组成的,在函数中也用缩进来表示语句属于函数体。
如果函数有返回值,那么需要在函数中使用return语句返回计算结果,声明函数形式一般如下:

de f<函数名>  (参数列表):<函数语句>return <返回值>
# 其中参数和返回值不是必须的

简单示例

代码:
def hi ():    #定义一个hi()函数,这里没有参数,但是需要写一对圆括号。print('hello,word !')hi()   #调用函数
print(hi)  # 返回函数在内存中的地址
执行结果:
hello,word !
<function hi at 0x0390F7C8>

以下是一个完整的函数,实现了求一个列表所有整数之和的功能,其中L为所要求和的列表,result是列表中所有整数的和,最后使用return将result的值返回。

代码:
def ListSum(L):result = 0for i in L:result = result + ireturn resultList = [ 1, 2, 3,4 ]
Sum = ListSum( List )
print( Sum )执行结果:
10

Python的函数比较灵活。与C语言中函数的声明相比,在Python中声明一个函数时,不需要声明函数类型,也不需要声明参数的类型。Python 在实际调用函数的过程中也非常灵活,不需要为不同类型的参数声明多个函数,或在处理不同类型数据的时候调用相应的函数。大部分情况下都可以用同一个函数调用不同的数据类型。

如下所示的函数,其功能是打印参数对象中的所有成员:

代码:
def PrintAll(x):for i in x:print(i)l = [1, 2, 3, 4]   # 列表
PrintAll(l)
t = ('a', 'b', 'c')   # 元组
PrintAll(t)
d = {'tom': 1, 'anni': 2, 'susi': 3 }   # 字典
PrintAll(d)
执行结果:
1
2
3
4
a
b
c
tom
anni
susi

2.2 参数让函数更有价值

2.2.1 有默认值的参数

在python中,可以在声明函数的时候,预先为参数设置一个默认值。当调用函数时,如果某个参数具有默认值,则可以不向这个函数传递参数,这时,函数将使用事先声明默认的参数值。

def <函数名> (参数 = 默认值):<语句>

以下代码声明了一个函数,用来计算参数的立方值,默认参数为5

代码:
def Cube ( x = 5 ):return x ** 3
print(Cube())    # 为传递参数
print(Cube(2))  # 参数为2执行结果:
125
8

如果一个函数有多个参数,均声明的默认值,在传递参数时仅想向最后一个传递。

代码:
def Cube ( x = 1, y = 2, c = 3 ):return x * y +c
print(Cube())         # 结果为5
print(Cube(2))        # 结果为7,传递的是第一个参数
print(Cube(2,3))      #结果为9传递的第一二个参数
print(Cube( , , 5))   #这样执行结果是错的

这里我们要换一种函数定义的方式

代码:
def Cube ( x , y , c  ):if x == None:x = 1if y == None:y = 2if c == None:c = 3return x * y + cprint(Cube(None,None ,4))   # 加入判断执行结果:
6
2.2.2 参数传递方式

在Python中,参数值的传递不只是按照声明函数时参数的顺序进行传递的,实际上,Python还提供了另外一种传递参数的方法一按照参 数名传递值。以参数名传递参数时类似于设置参数的默认值。
    使用按参数名传递参数的方式调用函数时,要在调用函数名后的圆括号里为函数的所有参数赋值,赋值的顺序不必按照函数声明时的参数顺序,

代码:
def Cube ( x , y , c  ):if x == None:x = 1if y == None:y = 2if c == None:c = 3return x * y + cprint(Cube(y=3,c=3,x=3))   #赋值实现
执行结果:
12

在python中也可以同时使用按参数顺序传递与按参数名传递两种方式,但是需要注意的是,按顺序传递参数,要位于按参数名传递参数之前,而且不能有重复的情况,否则发生错误。

在有默认参数值的情况下,使用按参数名传递参数十分方便,上面的例子,我们就可以直接用参数名传递。

代码:
def Cube ( x = 1, y = 2, c = 3 ):return x * y + c
print (Cube(c=5) )   # 这里x与y使用默认值,c重新被传值
执行结果:
7
2.2.3 传递任意数量的值

在Python中,函数可以具有任意个参数,而不必在声明函数时对所有参数进行定义。使用可变长参数的函数时,其所有参数都保存在一个元组里, 在函数中可以使用for循环来处理。声明函数时,如果在参数名前加上一个星号“*",则表示该参数是一个可变长参数

代码:
def mylistappend(*list):l = []for i in list:l.extend(i)return la = [ 1, 2, 3]
b = [ 4, 5, 6]
c = [ 7, 8, 9]
x = mylistappend(a)
y = mylistappend(a,b)
z = mylistappend(a,b,c)
print(x)
print(y)
print(z)
执行结果:
[1, 2, 3]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
2.2.4 用参数返回计算结果

在C语言中,可以通过在参数中使用指针来达到改变参数值的作用,从而/达到从函数中返回结果的目的。其实,在Python中,还有更简单的实现方法,即在参数中使用可变对象(如列表等),使函数中的结果返回到参数中,从而达到从函数中返回计算结果的目的```

代码:
def ChangeValue1(x):x = x + 1
def ChangeValue2(x):x[0] = x[0] + 2
a = 1
b = [2]
c = ChangeValue1(a)
d = ChangeValue2(b)
for i in (a,b,c,d):print(i)
执行结果:
1           # a的值为改变,因为a为不可变对象
[4]         # b的值被改变
None        # 函数未设返回值,所以为空。
None

三、变量的作用域

在python中,不同的函数可以具有相同的参数名,在函数中已经声明过的函数名,在函数之外也可以使用,而在脚本运行过程中其值并不影响。

代码:
def fun1(x):a = [1]    # 在函数内定义一个名为a的列表a.append(x)print(a)a = [1,2,3,4]   # 在函数外定义一个名为a的列表
fun1(2)
print(a)
执行结果:
[1, 2]
[1, 2, 3, 4]
  • 上述代码中,两个同名的列表之所以值不同,是因为它们处于不同的作用域里。在Python中,作用域可以分为内置作用域、全局作用域和局部作用域。内置作用域是Python预先定义的,全局作用域是所编写的整个脚本,局部作用域是某个函数内部范围。
  • 上述代码中,函数中的列表a处于局部作用域中。而函数外的列表a处于全局作用域内。局部作用域内变量的改变并不影响全局作用域内的变量,除非通过引用的形式传递参数。

如果要在函数中使用函数外的变量,则可以在变量名前使用global关键字。

代码:
def fun (x):global areturn a + x
a = 5    # a为全局变量,在fun函数中声明的
print( fun(3) )
a = 2
print( fun(3) )
执行结果:
8           # 5+3
5           # 2+3

四、用lambda声明函数

用lambda表达式来声明函数,是Python中一类比较特殊的声明函数的方式,lambda来源于LISP语言。使用lambda可以声明一个匿名函数。所谓匿名函数是指所声明的函数没有函数名,lambda表达式就是一个简单的函数。使用lambda声明的函数可以返回一个值,在调用函数时,直接使用lambda表达式的返回值。使用lambda声明函数的一般形式如下。
lambda 参数列表:表达式

以下函数定义了一个lambda函数,并调用了这个函数.

代码:
fun = lambda x: x * x - x      # 使用lambda定义一个函数,并返回函数地址
print( fun(3) )    # 返回函数值
print(fun)      # 返回函数地址,fun实际指向了lambda定义的函数地址
执行结果:
6
<function <lambda> at 0x0067F7C8>

lambda适合定义小型函数,与def函数定义不同,使用lambda声明的函数,在函数中仅能包含单一的函数参数表达式,而不能包含其他语句,在lambda中也可以调用其他的函数。

代码:
def show():        # 使用def定义函数print('hello world')
f = lambda:show()   # 在lamdba中调用
f()def show1(n):print('hello'*n)
fn = lambda x : show1(x)    # 在lambda函数中向show传值
fn(2)                   # 调用lambda函数
def userreturn(x):return(x*2)
fun = lambda x:userreturn(x)*x   # 在 lambda函数中使用userreturn函数的返回值
print(fun(3))    # 3*2*3

python——自定义函数相关推荐

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

    这篇文章主要介绍了Python自定义函数的创建.调用和函数的参数.变量作用域等常见问题,需要的朋友可以参考下 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性 ...

  2. python自定义函数参数_python自定义函数的参数之四种表现形式

    (1)def a(x,y):print x,y 这是最常见的定义方式,调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错 (2)def a(x,y=3 ...

  3. vba里使用python自定义函数(xlwings)

    http://club.excelhome.net/thread-1452827-1-1.html 今天讲一下怎么在vba里面使用python的自定义函数.在vba板块提下python主要是pytho ...

  4. python 自定义函数

    python自定义函数 一.函数定义 二.函数参数 三.函数嵌套 四.函数变量作用域 五.闭包 一.函数定义 # 定义一个函数 def my_func(input_text):print(input_ ...

  5. Python 自定义函数的两种类型(wzl)

    python自定义函数 1.第一种自定义函数形式为: def function(x,y):return 'result' 2.第二种自定义函数形式为: y=lambda x:x+1 第一种自定义函数形 ...

  6. python使用什么关键字来定义,使用( )关键字来创建python自定义函数。

    相关题目与解析 使用下列哪种关键字来创建Python自定义函数? 使用()关键字创建自定义函数 使用()关键字创建自定义函数. Python中定义函数关键字为(). python中定义函数的关键字是( ...

  7. python自定义函数详解_Python自定义函数

    自定义函数 使用def定义函数,例如: def my_abs(x) : if x >= 0 : return x else : return -x 函数可以返回多个值,但是这是假象,实际上函数返 ...

  8. Python 自定义函数和参数类型

    目录 1. 自定义函数 2. 参数 (1)必备参数 (2)关键字参数 (3)默认参数 (4)不定长参数 1. 自定义函数 Python 提供了很多内置函数如 set(),  print() 等,用户也 ...

  9. 初学__Python——Python 自定义函数

    目录 一.函数声明 声明函数的一般形式: 示例:求一个列表中所有整数之和 二.函数调用 函数是一组语句的集合,用以实现某一特定的功能.函数可以简化脚本,Python 本身提供了许多内置函数,极大地方便 ...

  10. python自定义函数func_python自定义函数与面向对象

    前言 python的最大特点就是dynamically typed就是动态类型,不像java需要定义数据类型 引入 先从一段代码引入: 1 2 3 4 5 6 7 8 9 10class Dog(): ...

最新文章

  1. 和封神一起“深挖”Spark
  2. DPDK — IGB_UIO,与 UIO Framework 进行交互的内核模块
  3. python类继承的重写和super
  4. Delphi应用程序的调试(二)使用断点
  5. Linux基本命令(1)管理文件和目录的命令
  6. Linux系统下MySQL数据库的超级管理员root的密码忘记/忘记密码怎么办?
  7. 英国首相用华为P20 Pro自拍引热议,网友:真香,比炸鱼和薯条还香
  8. 【三边定位】 演示程序V0.1
  9. 戴尔PowerEdge-C服务器新成员:PowerEdge C5125和C5220
  10. Character的static方法
  11. 学以致用六---Centos7.2+python3.6.2+django2.1.1 --搭建一个网站
  12. 在java中转义符 n代表什么_在Java中,表示换行符的转义字符是()。 A.\nB.\fC.n D.\ddd...
  13. Android通过命令连接wifi(解决usb不能用+无屏幕情况)
  14. IE6下PNG背景透明的七种方法
  15. ai人工智能将替代人类_人类可以信任AI吗?
  16. webstorm界面主题
  17. Javascript设计模式-18-状态模式
  18. AUTOSAR基础篇之CanTsyn
  19. 广度优先搜索和深度优先搜索
  20. 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)

热门文章

  1. matlabnbsp;linprog函数nbsp;线…
  2. 统计思维(实例11)——时间序列分析
  3. 【JLOI2013合集】BZOJ3090 赛车 BZOJ3091 卡牌游戏 BZOJ3092 删除物品 BZOJ3093 地形生成...
  4. 一文搞定MySQL性能调优
  5. C/C++-----对C语言文件的学习
  6. 跟南桑做一下第一个springboot项目
  7. 新塘中学2021高考成绩查询,2021年广州高考最高分多少分,历年广州高考状元
  8. 料理机破壁技术是什么?
  9. 转载]复眼,Adobe光场相机(
  10. H5+CSS3实现简单表情包