python函数定义与模块管理

函数

  编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种!”。
在编程中,我们经常会遇到一些问题,在解决他们时,我们会不止一次的重复他们。这样在一次次的重复中,既增加了代码的冗余度,也会花费很多无用的时间。
为了避免这样的问题,我们可以将重复的代码封装起来,把它变成一个功能模块,这样我们就可以通过使用这些功能模块来代替代码中重复的部分。不仅使得代码更整洁美观,而且提高了编写效率,并降低了代码的冗余度。

定义函数

  在Python中可以使用 def(define的缩写)关键字来定义函数,函数就是带名字的代码块
在定义函数时,必须要为该函数定义一个名称,以方便调用。命名规则:

  1. 可以由字母、下划线和数字组成
  2. 不能用数字开头
  3. 不能和任一关键字重名,也不能和已有函数名称重复。
  4. 函数名称最好有意义,能够表达被封装代码块的功能。这样做同样是方便后续的调用。
#代码举例,求阶乘
def fac(num):
   result = 1
   for n in range(1, num + 1):
       result *= n
   return result
  1. 形参与实参:
    形参:定义函数时,小括号中的参数。用来接收参数,可在封装函数时在内部作为变量使用。可以参数可以有初值(默认值),在调用函数却没有给实参时,函数就会使用已给的初值。
    实参:调用函数时,小括号中的参数,用来传递数据。
    参数的个数:(没有限制。参数可以被允许无限制的规定。)在规定参数时,每个参数用逗号分隔,在不确定传入参数的个数时,可以使用 “星号” 来表示该变量是一个可变参数,传入数量不确定。
def fac(*a)
	pass
  1. 函数的返回值
    在一些情况下,我们会使用函数并求得到一个需要使用结果,以便调用者针对具体的结果作出后续的处理。这时就需要设置一个返回值。
    如上面的代码,求完阶乘后,会用关键字 “return” 来返回所求的阶乘。
    调用函数一方,就可以使用变量来接收函数的返回结果。

用模块管理函数

对于任何一种编程语言来说,给变量、函数这样的标识符起名字都是一个让人头疼的问题,因为我们会遇到命名冲突这种尴尬的情况。最简单的场景就是在同一个.py文件中定义了两个同名函数,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。
而 “ 模块 ” 的存在就解决了这个问题。
Python中每个文件就代表了一个模块(module),我们在不同的模块中可以有同名的函数,在使用函数的时候我们通过import关键字导入指定的模块就可以区分到底要使用的是哪个模块中的foo函数,代码如下所示。
a1.py

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

a2.py

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

当引用时:
text.py

from a1 import foo

#输出hello, world!
foo()

from a2 import foo

#输出goodbye, world!
foo()

这样就不会出现问题了。

  • 当模块名过长时。例如将刚才的“a1.py”、“a2.py”改为“module1”、“module2”。
    可以使用语法糖,使代码变的简单。
    text.py
import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

注意:如果写成了这种形式:

from module1 import foo
from module2 import foo

foo()

则会调用最后一个被调用的模块。即输出:“goodbye, world!”

你可能感兴趣的:(#,Python,python)