在说函数先给大家举个例子,求M和N的阶乘(C(M,N)):
m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1):
fm *= num
fn = 1
for num in range(1, n + 1):
fn *= num
fm_n = 1
for num in range(1, m - n + 1):
fm_n *= num
print(fm // fn // fm_n)
从上面的代码中,我们可以看出代码的重复很高,这样写的代码质量是很坏的。为了解决高重复代码的问题,python提供了一个功能,即我们将常用的代码以固定的格式封装成一个独立的模块,我们可以调用这个模块就能完成相应的功能,这个模块就叫做函数(Function)
函数定义
定义函数,就是创建一个具有某种功能的模块。定义函数使用的关键字 def,具体用法如下:
def 函数名(参数列表):
//实现特定功能的代码
[return [返回值]]
其中,用 [] 括起来的为可选择部分,即可以使用,也可以省略。
此格式中,各部分参数的含义如下:
- 函数名:就是一个响亮的名字,而且命名规则跟变量的命名规则是一致的。但建议取名字时,最好能够体现出该函数的功能
- 形参列表:该函数可以接收的多少个参数,多个参数之间用逗号( , )分隔。如果该函数不需要参数,则保留一对空的“()”
- [return [返回值] ]:就是为该函数设置可选的返回值。也就是说,函数可以有返回值,也可以没有返回值,根据实际功能情况而定
函数的调用
调用函数就是执行该函数,语法如下:
[返回值] = 函数名([形参值])
语法说明,函数名就是要调用的函数名称。形参值就是创建函数时要传入的参数,即创建函数时有多少参数就传入多少参数,而且顺序保持一致,如果不需要参数小括号也不能省略。返回值就是该函数执行完返回的值,我们可以是使用一个变量接收它,也可以省略,看具体情况而定。
通过上面函数定义和调用的介绍,那么我们对文章求阶乘的问题,可以使用函数来重构,如下:
# 函数定义,名为fac
def fac(num):
ret = 1
for n in range(1, num + 1):
ret *= n
return ret
m = int(input('m = '))
n = int(input('n = '))
# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
print(fac(m) // fac(n) // fac(m - n))
这样写的代码看起来是不是即美观又好维护,哈哈哈哈哈哈哈~
python模块
模块概念
模块也叫库,每个模块中都内置了大量的功能函数、类和变量
模块就是程序,每个模块就是一个后缀为.py的Python程序
Python的模块分为标准模块、第三方模块和自定义模块,标准模块就是python内置的,第三方模块则需要安装之后才能使用
可以通过help命令了解一个模块的基本帮助信息,如:help(‘sys’)
模块导入
1.无论标准模块、第三方模块和自定义模块都需要导入
2.导入方法:直接调用模块:import 模块名
从模块中调用某个函数:from 模块名 import 函数名
import os,应采用“模块名.方法名”的形式使用模块中的方法。如:os.system()
from os import * ,可以直接使用system()方法,无需加上模块名作为前缀
用模块管理函数
对于任何一种编程语言来说,给变量、函数这样的标识符起名字都是一个让人头疼的问题,因为我们会遇到命名冲突这种尴尬的情况。最简单的场景就是在同一个.py文件中定义了两个同名函数,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的
def f():
print('python!')
def f():
print('goodbye, python!')
# 下面的代码会输出什么呢?
f()
当然上面的这种情况我们很容易就能避免,但是如果项目是由多人协作进行团队开发的时候,团队中可能有多个程序员都定义了名为`f`的函数,那么怎么解决这种命名冲突呢?答案其实很简单,Python中每个文件就代表了一个模块(module),我们在不同的模块中可以有同名的函数,在使用函数的时候我们通过import关键字导入指定的模块就可以区分到底要使用的是哪个模块中的`f`函数,代码如下所示:
#module1.py
def f():
print('python!')
#module2.py
def f():
print('goodbye, python!')
可以按照如下所示的方式来区分到底要使用哪一个`f`函数
#test.py
import module1 as m1
import module2 as m2
m1.f() #输出python!
m2.f() #输出goodbye, python!
需要说明的是,如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是“main”
#module3.py
import module1 as m1
import module2 as m2
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
m1.f() #输出python!
m2.f() #输出goodbye, python!