[重学Python]Day3 函数和模块的使用

2024-04-20 09:15:51 浏览数 (1)

一、函数的作用

“代码有很多种坏味道,重复是最坏的一种”

为了解决重复代码的问题,我们可以封装重复的代码到“函数”的功能模块中,在需用使用该功能的地方,我们只需要“调用”这个“函数”就可以了。

二、定义函数

在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

代码语言:javascript复制
def foo():
    print('hello, world!')

module2.py

代码语言:javascript复制
def foo():
    print('goodbye, world!')

test.py

代码语言:javascript复制
from module1 import foo

# 输出hello, world!
foo()

from module2 import foo

# 输出goodbye, world!
foo()

也可以按照如下所示的方式来区分到底要使用哪一个foo函数。

test.py

代码语言:javascript复制
import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

但是如果将代码写成了下面的样子,那么程序中调用的是最后导入的那个foo,因为后导入的foo覆盖了之前导入的foo

test.py

代码语言:javascript复制
from module1 import foo
from module2 import foo

# 输出goodbye, world!
foo()

我们在导入的module中除了定义的函数可能还有其它可执行代码,当我们import时会执行这些代码,当我们不需要执行这些代码时,就需要将它们放入if条件

module3.py

代码语言:javascript复制
def foo():
    pass


def bar():
    pass


# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
    print('call foo()')
    foo()
    print('call bar()')
    bar()

test.py

代码语言:javascript复制
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 的函数,它接受两个整数 ab 作为参数。函数内部使用循环计算出两个数的最大公约数 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 能被 ii 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_primeis_palindromic_primeis_prime 函数用于判断一个数是否为素数,is_palindromic_prime 函数用于判断一个数是否为回文素数。

然后,程序通过 input 函数获取用户输入的正整数,并将其存储在变量 num 中。最后,调用 is_palindromic_prime 函数判断 num 是否为回文素数,并输出相应的结果。

0 人点赞