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

简介: 本文介绍了Python中的函数和模块的使用。函数用于避免代码重复,通过`def`定义,参数可有默认值或可变参数。模块管理同名函数,通过`import`导入。示例包括计算最大公约数和最小公倍数、判断回文数和素数的函数,以及检测回文素数的程序。

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

项目链接:https://github.com/jackfrued/Python-100-Days

一、函数的作用

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

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

二、定义函数

在Python中可以使用def关键词来定义函数,和变量一样每个函数都有自己的名字,命名规则与变量的命名规则一致,在函数后面的园括号中可以放置传递给函数的参数,程序中函数的参数就相当于数学中提到的自变量,而函数执行完成后我们可以通过return来返回一个值

三、函数的参数

函数是绝大多数编程语言中都支持的一个代码的"构建块",但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式,下面是两个小例子。

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个或者多个参数进行加法运算,而具体由多少个参数是由调用者来决定的,我们作为函数的设计者对这一点是一无所知的,因此不确定参数个数时,我们可以使用可变参数。

# * 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中没有函数重载概念,为了避免后面定义的函数覆盖之前的函数,所以我们要使用模块对函数进行管理,例如下面的情况

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__

五、练习

(一)实现计算最大公约数和最小公倍数的函数

'''最大公约数 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,最后返回最大公约数和最小公倍数。你可以根据实际需求调用这个函数来计算最大公约数和最小公倍数。

(二)、实现判断一个数是不是回文数的函数

def is_palindrome(n):
    # 将数字转换为字符串
    str_n = str(n)
    # 反转字符串
    reverse_str = str_n[::-1]
    # 比较原字符串和反转后的字符串是否相等
    return str_n == reverse_str

在上述代码中,定义了一个名为 is_palindrome 的函数,它接受一个整数 n 作为参数。首先,将整数转换为字符串,然后通过切片操作 [::-1] 反转字符串,最后比较原字符串和反转后的字符串是否相等,如果相等则返回 True,表示是回文数,否则返回 False。你可以根据需要调用这个函数来判断一个数是否为回文数。

(三)、实现判断一个数是不是素数的函数

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

(四)、写一个程序判断输入的正整数是不是回文素数

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 是否为回文素数,并输出相应的结果。

相关文章
|
26天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
42 4
|
6天前
|
Python
Python Internet 模块
Python Internet 模块。
101 74
|
22天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
125 67
|
24天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
25天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
25天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
16天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
42 18
|
7天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
39 8
|
1月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
17天前
|
Python
Python中的函数
Python中的函数
31 8
下一篇
DataWorks