Python学习笔记4——函数和模块

定义函数

 1 def add(a=0, b=0, c=0):
 2     """三个数相加"""
 3     return a + b + c
 4 
 5 print(add()) #add(0,0,0)
 6 print(add(1)) #add(1,0,0)
 7 print(add(1, 2)) #add(1,2,0)
 8 print(add(1, 2, 3))
 9 # 传递参数时可以不按照设定的顺序进行传递
10 print(add(c=50, a=100, b=200))

我们给上面两个函数的参数都设定了默认值,这也就意味着如果在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值,所以在上面的代码中我们可以用各种不同的方式去调用add函数,这跟其他很多语言中函数重载的效果是一致的。

其实上面的add函数还有更好的实现方案,因为我们可能会对0个或多个参数进行加法运算,而具体有多少个参数是由调用者来决定,我们作为函数的设计者对这一点是一无所知的,因此在不确定参数个数的时候,我们可以使用可变参数,代码如下所示。

 1 # 在参数名前面的*表示args是一个可变参数
 2 def add(*args):
 3     total = 0
 4     for val in args:
 5         total += val
 6     return total
 7 
 8 
 9 # 在调用add函数时可以传入0个或多个参数
10 print(add())
11 print(add(1))
12 print(add(1, 2))
13 print(add(1, 2, 3))
14 print(add(1, 3, 5, 7, 9))

用模块管理函数

对于任何一种编程语言来说,给变量、函数这样的标识符起名字都是一个让人头疼的问题,因为我们会遇到命名冲突这种尴尬的情况。最简单的场景就是在同一个.py文件中定义了两个同名函数,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。

1 def foo():
2     print('hello, world!')
3 
4 def foo():
5     print('goodbye, world!')
6 
7 # 下面的代码会调用第二个foo()方法
8 foo()

当然上面的这种情况我们很容易就能避免,但是如果项目是由多人协作进行团队开发的时候,团队中可能有多个程序员都定义了名为foo的函数,那么怎么解决这种命名冲突呢?答案其实很简单,Python中每个文件就代表了一个模块(module),我们在不同的模块中可以有同名的函数,在使用函数的时候我们通过import关键字导入指定的模块就可以区分到底要使用的是哪个模块中的foo函数,代码如下所示。

module1.py

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

module2.py

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

test.py

1 from module1 import foo
2 
3 # 输出hello, world!
4 foo()
5 
6 from module2 import foo
7 
8 # 输出goodbye, world!
9 foo()

也可以按照如下所示的方式来区分到底要使用哪一个foo函数。

test.py

1 import module1 as m1
2 import module2 as m2
3 
4 # 类似于Java代码中 m1 = new module1(); m1是对于类的对象
5 
6 m1.foo()
7 m2.foo()

需要说明的是,如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是"__main__"。

module3.py

def foo():
    pass

def bar():
    pass

# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
    print('call foo()')
    foo()
    print('call bar()')
    bar()

test.py

import module3

# 导入module3时 不会执行模块中if条件成立时的代码 因为模块的名字是module3而不是__main__

猜你喜欢

转载自www.cnblogs.com/yuanxixing/p/12321708.html