1.引入函数
有如下函数,问有多少组正整数解。
\[x_1+x_2+x_3+x_4 = 8 \]相当于把8个苹果分给4个人,每人至少一个,问有多少种分法。
进一步等价于在分隔8个苹果的7个空隙之间插入3三个隔板将苹果分成四组有多少种方案,也就是从7个空隙中选出3个放入隔板,\(C_7^3 = 35\)。
排列组合对应公式为
\[C_M^N =\frac{M!}{N!(M-N)!}, \text{(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('当前正在执行')
5.变量的作用域
def foo():
b = 'hello'
def bar():
c = True
print(a)
print(b)
print(c)
bar()
if __name__ == '__main__':
a = 100
foo()
打印结果
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)
标签:__,函数,Python,add,模块,print,foo,def
From: https://www.cnblogs.com/zhishu/p/16913843.html