大多数高级语言都提供了函数这个概念,Python也不例外,有过其他语言学习经验
的都或多或少了解什么是函数,使用函数有哪些好处。下面首先简要叙述我们为什
么需要函数,以及使用函数有哪些好处?
的都或多或少了解什么是函数,使用函数有哪些好处。下面首先简要叙述我们为什
么需要函数,以及使用函数有哪些好处?
函数之所以被创建出来,我想最根本的原因是程序员的"惰性"。与平常生活一样,
我们总是需要重复去做一件有意见的事情。而在我们的程序中,我们也需要在许多
不同的地方实现同一个功能,如果每次都需要将之前的代码重新再写一遍,这不仅
增加了我们的工作量,同时也使代码变得臃肿。而如果我们将这些功能做成一个个
独立工具,在需要时之间调用,这不仅减轻了工作量,而且使代码更加简洁,更加
的易于维护。而我们一般将这些独立工具称作函数。
我们总是需要重复去做一件有意见的事情。而在我们的程序中,我们也需要在许多
不同的地方实现同一个功能,如果每次都需要将之前的代码重新再写一遍,这不仅
增加了我们的工作量,同时也使代码变得臃肿。而如果我们将这些功能做成一个个
独立工具,在需要时之间调用,这不仅减轻了工作量,而且使代码更加简洁,更加
的易于维护。而我们一般将这些独立工具称作函数。
函数可以看做是一种代码抽象的方式,借助抽象,我们可以不关心函数的具体实现
过程,而直接在更高层面上思考问题。
过程,而直接在更高层面上思考问题。
了解了函数的基本概念后,我们来具体了解一下Python的函数:
在Python中,可以将函数分为Python内置的函数的与用户自定义的函数。下文主要
叙述用户如何定义一个函数,以及在定义一个函数时需要注意什么。而对于众多的
Python内置函数,如果读者希望了解它们的用途,可以使用函数help(函数名)来
Python内置函数,如果读者希望了解它们的用途,可以使用函数help(函数名)来
查询某个函数的作用。
如何定义一个函数?
定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然
后,在缩进中编写函数体,函数的返回值用return语句返回。
后,在缩进中编写函数体,函数的返回值用return语句返回。
def FunctionName(参数): ... 函数体 ... return #
下面给出一个函数示例,用于计算 n!:
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 expf.py temp = 6 [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat expf.py def countN(n): result = 1 for i in range(1, n+1): result *= i return result temp = countN(3) print('temp = ', temp)
从上述的如何定义一个函数中,我们可以看到,函数名与参数的选取、函数体的构
建都与该函数需要实现的具体功能相关,没有统一标准。但Python对函数参数的设
置却有着很大的灵活性。除了正常定义的必选参数外,还可以使用默认参数、可变
参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简
化调用者的代码。下面我们就来具体看一下这些不同的参数。
建都与该函数需要实现的具体功能相关,没有统一标准。但Python对函数参数的设
置却有着很大的灵活性。除了正常定义的必选参数外,还可以使用默认参数、可变
参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简
化调用者的代码。下面我们就来具体看一下这些不同的参数。
位置参数:就是我们正常定义函数时的必选参数,也是我们平时一般意义上的函数
参数。上述例子中的函数 countN(n) 中的 n 就是位置参数。当我们定义的某个函
数有多个位置参数,在调用该函数时,传入的值按定义时的顺序从左到右赋给各个
位置参数。
参数。上述例子中的函数 countN(n) 中的 n 就是位置参数。当我们定义的某个函
数有多个位置参数,在调用该函数时,传入的值按定义时的顺序从左到右赋给各个
位置参数。
默认参数:在我们定义某个函数时,预先给某个函数参数一个初值,这个参数就叫
做默认参数,当用户调用此函数时,如果没有给此函数的默认参数一个传入值,函
数运行时,默认参数就会使用定义时给定的初始值,如果调用时用户给定了默认参
数传入值,函数运行时就使用用户的给定值。
做默认参数,当用户调用此函数时,如果没有给此函数的默认参数一个传入值,函
数运行时,默认参数就会使用定义时给定的初始值,如果调用时用户给定了默认参
数传入值,函数运行时就使用用户的给定值。
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 myPrint.py Happy! Hello, World! [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat myPrint.py def myPrint(str = 'Hello, World!'): print(str) return myPrint('Happy!') myPrint()
在使用默认参数时需要注意:
1.必选参数在前,默认参数在后,否则Python的解释器会报错。因为如果默认参数
在前,当用户调用此函数时,仅给定了必选参数,函数在将用户给定值传给函数参
数时,无法判定用户是希望使用默认参数的默认值还是调用式错误,丢失了数值。
1.必选参数在前,默认参数在后,否则Python的解释器会报错。因为如果默认参数
在前,当用户调用此函数时,仅给定了必选参数,函数在将用户给定值传给函数参
数时,无法判定用户是希望使用默认参数的默认值还是调用式错误,丢失了数值。
2.在设置默认参数时,如果函数有多个参数,把变化大的参数放前面,变化小的参
数放后面。变化小的参数就可以作为默认参数。
数放后面。变化小的参数就可以作为默认参数。
3.当调用者希望使用默认参数中的某几个默认参数时,调用时不按顺序提供部分默
认参数,需要把参数名写上。
认参数,需要把参数名写上。
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 somevalue.py Hurry in LemonTree ,he is 18 years old and graduated from GreedApple [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat somevalue.py def myPrint(name, school = 'GreedApple', age = 18, hometown = 'Pecato'): print(name, 'in', hometown, ',he is', age, 'years old and graduated from', school) return myPrint('Hurry', hometown = 'LemonTree')
4.定义默认参数时,默认参数必须指向不变对象,否则在多次调用函数时可能产生
错误的结果。因为,Python函数在定义的时候,默认参数的值就被计算出来了,在
每次调用该函数时,如果改变了默认参数的内容,则下次调用时,默认参数的内容
就变了,不再是函数定义时的值了。
可变参数:调用函数时,可变参数的传入值数量是可变的,类似于传入一个list或
tuple。只是,定义可变参数和定义一个list或tuple参数相比,仅仅在参数名前面
加了一个*号。并且Python允许你在list或tuple前面加一个*号,把list或tuple的
元素变成可变参数用来作为调用函数时的传入值。
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 sum.py 10 10 10 10 [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat sum.py def sum_one(value): sum = 0 for i in value: sum += i return sum def sum_two(*value): sum = 0 for i in value: sum += i return sum value = [1, 2, 3, 4] print(sum_one([1, 2, 3, 4])) print(sum_one(value)) print(sum_two(1, 2, 3, 4)) print(sum_two(*value))
关键字参数:与可变参数相比,关键字参数允许你传入0个或任意个含参数名的参
数,这些关键字参数在函数内部自动组装为一个dict。 只是,定义关键字参数和
定义一个dict参数相比,仅仅在参数名前面加了两个*号。在调用函数时,Python
允许dict前加两个*号,将其转换为关键字参数传进去
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 myPrint2.py Name: Hurry age: 18 {'Number': 12345, 'SchoolID': 54321} Name: Hurry age: 18 {'Number': 12345, 'SchoolID': 54321} [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat myPrint2.py def myPrint(name, age, **other): print('Name: ', name, 'age:', age, other) return temp = {'Number': 12345, 'SchoolID': 54321} myPrint('Hurry', 18, **temp) myPrint('Hurry', 18, Number = 12345, SchoolID = 54321)
命名关键字参数:可以限制传入值KEY的关键字参数,定义时和关键字参数**kw不
同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
[wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 myPrint3.py Name: Hurry age: 18 Number 12345 SchoolID 54321 Traceback (most recent call last): File "myPrint3.py", line 8, in <module> myPrint('Hurry', 18, Number = 12345, CardID = 54321) TypeError: myPrint() got an unexpected keyword argument 'CardID' [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat myPrint3.py def myPrint(name, age, *, Number, SchoolID): print('Name: ', name, 'age:', age, 'Number', Number, 'SchoolID', SchoolID) return temp = {'Number': 12345, 'SchoolID': 54321} myPrint('Hurry', 18, **temp) myPrint('Hurry', 18, Number = 12345, CardID = 54321)
注意:如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再
需要一个特殊分隔符*了
例如:def myPrint(name, age, args*, Number, SchoolID):
需要一个特殊分隔符*了
例如:def myPrint(name, age, args*, Number, SchoolID):
Tips:
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名
关键字参数,这5种参数都可以组合使用。但是请注意:函数定义时参数定义的顺
序必须按照:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名
关键字参数,这5种参数都可以组合使用。但是请注意:函数定义时参数定义的顺
序必须按照:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
如果我们想定义一个什么都不做的空函数,我们可以使用 pass语言 作为函数体。
实际上pass可以用来作为占位符,假如现在还没想好怎么写函数的代码,则可以先
放一个pass,让代码能运行起来。
实际上pass可以用来作为占位符,假如现在还没想好怎么写函数的代码,则可以先
放一个pass,让代码能运行起来。