首页 > 编程语言 >【Python】函数和模块的使用

【Python】函数和模块的使用

时间:2022-12-05 19:46:38浏览次数:40  
标签:__ 函数 Python add 模块 print foo def

1.引入函数

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

\[x_1+x_2+x_3+x_4 = 8 \]

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

排列组合对应公式为

\[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()

打印结果
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)

标签:__,函数,Python,add,模块,print,foo,def
From: https://www.cnblogs.com/zhishu/p/16913843.html

相关文章