一、函数的作用
“代码有很多种坏味道,重复是最坏的一种”
为了解决重复代码的问题,我们可以封装重复的代码到“函数”的功能模块中,在需用使用该功能的地方,我们只需要“调用”这个“函数”就可以了。
二、定义函数
在Python中可以使用def关键词来定义函数,和变量一样每个函数都有自己的名字,命名规则与变量的命名规则一致,在函数后面的园括号中可以放置传递给函数的参数,程序中函数的参数就相当于数学中提到的自变量,而函数执行完成后我们可以通过return来返回一个值
三、函数的参数
函数是绝大多数编程语言中都支持的一个代码的"构建块",但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式,下面是两个小例子。
代码语言:javascript复制from random import randint
# roll dice
def roll_dice(n = 2):
total = 0
for _ in range(n):
total = randint(1,6)
return total
#sum of 3 num
def add(a = 0, b = 0, c = 0):
return a b c
# 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
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个或者多个参数进行加法运算,而具体由多少个参数是由调用者来决定的,我们作为函数的设计者对这一点是一无所知的,因此不确定参数个数时,我们可以使用可变参数。
代码语言:javascript复制# * indicates this parameter is a variable paramber
def add(*args):
total = 0
for _ in args:
total = _
return total
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
四、用模块管理函数
同名函数问题,由于python中没有函数重载概念,为了避免后面定义的函数覆盖之前的函数,所以我们要使用模块对函数进行管理,例如下面的情况
代码语言:javascript复制def foo():
print('hello world')
def foo()
print('goodbye world')
foo()
解决方式:Python中每个文件代表了一个module,在不同module中可以有同名的函数,在使用函数时我们通过import导入指定module即可。
module1.py
def foo():
print('hello, world!')
module2.py
def foo():
print('goodbye, world!')
test.py
from module1 import foo
# 输出hello, world!
foo()
from module2 import foo
# 输出goodbye, world!
foo()
也可以按照如下所示的方式来区分到底要使用哪一个foo
函数。
test.py
import module1 as m1
import module2 as m2
m1.foo()
m2.foo()
但是如果将代码写成了下面的样子,那么程序中调用的是最后导入的那个foo
,因为后导入的foo覆盖了之前导入的foo
。
test.py
from module1 import foo
from module2 import foo
# 输出goodbye, world!
foo()
我们在导入的module中除了定义的函数可能还有其它可执行代码,当我们import时会执行这些代码,当我们不需要执行这些代码时,就需要将它们放入if条件
module3.py
def foo():
pass
def bar():
pass
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
print('call foo()')
foo()
print('call bar()')
bar()
test.py
import module3
# 导入module3时 不会执行模块中if条件成立时的代码 因为模块的名字是module3而不是__main__
五、练习
(一)实现计算最大公约数和最小公倍数的函数
代码语言:javascript复制'''最大公约数 greatest common divisor
最小公倍数 least common multiple'''
def gcd_lcm(a, b):
# 计算最大公约数
gcd = abs(a) % abs(b)
while gcd!= 0:
a, b = b, gcd
gcd = abs(a) % abs(b)
# 计算最小公倍数
lcm = abs(a) * abs(b) // gcd
return gcd, lcm
在上述代码中,定义了一个名为 gcd_lcm
的函数,它接受两个整数 a
和 b
作为参数。函数内部使用循环计算出两个数的最大公约数 gcd
,然后根据最大公约数计算出最小公倍数 lcm
,最后返回最大公约数和最小公倍数。你可以根据实际需求调用这个函数来计算最大公约数和最小公倍数。
(二)、实现判断一个数是不是回文数的函数
代码语言:javascript复制def is_palindrome(n):
# 将数字转换为字符串
str_n = str(n)
# 反转字符串
reverse_str = str_n[::-1]
# 比较原字符串和反转后的字符串是否相等
return str_n == reverse_str
在上述代码中,定义了一个名为 is_palindrome
的函数,它接受一个整数 n
作为参数。首先,将整数转换为字符串,然后通过切片操作 [::-1]
反转字符串,最后比较原字符串和反转后的字符串是否相等,如果相等则返回 True
,表示是回文数,否则返回 False
。你可以根据需要调用这个函数来判断一个数是否为回文数。
(三)、实现判断一个数是不是素数的函数
代码语言:javascript复制def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i 2) == 0:
return False
i = 6
return True
在上述代码中,定义了一个名为 is_prime
的函数,它接受一个整数 n
作为参数。首先判断 n
是否小于等于 1,如果是,则返回 False
,表示不是素数。接着判断 n
是否小于等于 3,如果是,则返回 True
,因为 2 和 3 都是素数。然后判断 n
是否能被 2 或 3 整除,如果能,则返回 False
。接下来,从 5 开始,每次增加 6,直到 i
的平方大于 n
为止。在循环中,如果 n
能被 i
或 i 2
整除,则返回 False
。如果循环结束后都没有返回 False
,则说明 n
是素数,返回 True
。
(四)、写一个程序判断输入的正整数是不是回文素数
代码语言:javascript复制def is_palindromic_prime(n):
# 先判断是否为素数
if not is_prime(n):
return False
# 再判断是否为回文数
str_n = str(n)
reverse_str = str_n[::-1]
if str_n!= reverse_str:
return False
return True
def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i 2) == 0:
return False
i = 6
return True
num = int(input("请输入一个正整数:"))
if is_palindromic_prime(num):
print(f"{num} 是回文素数。")
else:
print(f"{num} 不是回文素数。")
这段代码首先定义了两个函数 is_prime
和 is_palindromic_prime
。is_prime
函数用于判断一个数是否为素数,is_palindromic_prime
函数用于判断一个数是否为回文素数。
然后,程序通过 input
函数获取用户输入的正整数,并将其存储在变量 num
中。最后,调用 is_palindromic_prime
函数判断 num
是否为回文素数,并输出相应的结果。