【Python】函数和模块的使用

1.引入函数

有如下函数,问有多少组正整数解。

x1+x2+x3+x4=8

相当于把8个苹果分给4个人,每人至少一个,问有多少种分法。
进一步等价于在分隔8个苹果的7个空隙之间插入3三个隔板将苹果分成四组有多少种方案,也就是从7个空隙中选出3个放入隔板,C73=35
image

排列组合对应公式为

CMN=M!N!(MN)!,(M=7, N=3)

m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1): #m的阶乘
fm *= num
fn = 1
for num in range(1, n + 1): #n的阶乘
fn *= num
fm_n = 1
for num in range(1, m - n + 1): #m-n的阶乘
fm_n *= num
print(fm // fn // fm_n)

2.定义函数

上面的代码中做了3次求阶乘,只有参数不一样,代码重复,那么我们可以把计算阶乘的功能封装到函数中,再调用来计算阶乘。
def定义函数,括号为传递给函数的参数,return返回值。

def fac(num):
result = 1
for n in range(1, num + 1):
result *= n
return result
m = int(input('m = '))
n = int(input('n = '))
# 直接调用函数
print(fac(m) // fac(n) // fac(m - n))

3.函数的参数

python中函数的参数可以有默认值,也支持使用可变参数,因此python并不需要像其他语言一样支持函数的重载。

from random import randint
def roll_dice(n=2):
total = 0
for _ in range(n):
total += randint(1, 6)
return total
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))

可变参数,参数前面使用星号,参数的个数由调用者决定

def add(*args):
total = 0
for val in args:
total+=val
return total
print(add())
print(add(1))
print(add(1,2))
print(add(1,2,3))
print(add(1,3,5,7,9))

4.用模块管理函数

如果在同一个.py文件中定义了两个同名函数,由于python没有函数重载的概念,那么后面的定义会覆盖之前的定义。

def foo():
print('hello,world')
def foo():
print('goodbye,world')
foo() #goodbye,world

python中每个文件就代表了一个模块(module),不同的模块中可以有同名的函数,通过import关键字导入指定的模块来区分foo函数
module1.py

def foo():
print('hello,world')

module2.py

def foo():
print('goodbye,world')

test.py

from module1 import foo
foo() #hello,world!
from module2 import foo
foo() #goodbye,world!

也可以给模块起别名来区分
test.py

import module1 as m1
import module2 as m2
m1.foo()
m2.foo()

但如果写成了这样,则会调用模块2的方法,因为后导入的覆盖了之前导入的foo。

from module1 import foo
from module2 import foo
foo() #goodbye,world!

导入模块import module3时不希望执行其中的代码那么可以用if判断模块名,__name__表示模块名。

if __name__ =='__main__':
print('当前正在执行')

练习:【python】求最大公约数、最小公倍数、回文数、素数

5.变量的作用域

def foo():
b = 'hello'
def bar():
c = True
print(a)
print(b)
print(c)
bar()
if __name__ == '__main__':
a = 100
foo()

打印结果
image

python中在函数内部还可以定义函数,变量a为全局变量,变量b作用域范围为foo()函数,可在bar()函数中访问,变量c作用域范围为bar()函数。


以下代码中,想要通过函数修改全局变量a的值,无法修改,foo()函数中重新定义了一个局部变量a

def foo():
a = 200
print(a)
if __name__ == '__main__':
a = 100
foo()
print(a) # 100

在变量前加上global就可以了,指定该变量来自全局变量。nonlocal关键字表示变量来自嵌套作用域。

def foo():
global a = 200
print(a)
posted @   植树chen  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示