在Python中可以使用'def'关键字来定义函数,和变量一样每个函数也有一个名字,而且命名规则跟变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数,这一点和数学上的函数非常相似,程序中函数的参数就相当于是数学上说的函数的自变量,而函数执行完成后我们通过'return'关键字来返回一个值,这相当于数学上说的函数的因变量。
eg.输入m,n计算排列组合C(m,n)
def factorial(num):
"""求阶乘"""
result = 1
for n in range(1, num + 1):
result *= n
return result
m = int(input('m = '))
n = int(input('n = '))
# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
print(factorial(m) // factorial(n) // factorial(m - n))
说明:Python的'math'模块中其实有一个'factorial'函数,可以直接使用,不需要定义。
在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数重载。
eg.函数参数给定默认值
def add(a=0, b=0, c=0):
"""三个数相加"""
return a + b + c
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))
说明:函数的参数设定了默认值,这也就意味着如果在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值,所以可以用各种不同的方法去调用'add'函数。
其实上面的'add'函数还有更好的方案,因为我们可能会对0个或多个参数进行运算,而具体有多少参数由调用者来决定,针对这一点,可以使用可变参数。
eg.函数参数使用可变参数
# 在参数名前面的*表示args是一个可变参数
def add(*args):
total = 0
for val in args:
total += val
return total
# 在调用add函数时可以传入0个或多个参数
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
对于任何一种编程语言,给变量和函数命名难免会遇到命名冲突问题,由于Python没有函数重载的概念,在同一个.py文件中定义了两个同名的函数,那么后面的定义会覆盖之前的定义,也就意味着两个同名函数实际只存在一个。那么怎么解决这个问题?Python每个文件代表一个模块(module),我们可以在不同的模块中可以有同名的函数,在使用函数的时候我们通过'import'关键字导入指定模块就可以区分到底要使用的是哪个模块的函数。
eg.模块区分同名函数
'module1.py'
def name():
print('我是小猪佩奇!')
'module2.py'
def name():
print('这是我的弟弟乔治!')
'test.py'
import module1 as m1
import module2 as m2
m1.name()
m2.name()
注意:如果代码写成下面的样子,那么程序调用的是最后导入的那个'name',因为后导入的'name'函数覆盖之前导入的'name'。
from module1 import name
from module2 import name
# 输出‘这是我的弟弟乔治!’
name()
如果我们导入的模块除了定义函数之外还有可执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入下面例子中的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的。
eg.导入模块不运行可执行代码
'module3.py'
def name():
pass
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
print('call name()')
foo()
'test.py'
import module3