python中函数
1 我们可以将重复的代码抽取定义成函数,这样可以直接调用函数,避免代码重复。python中的函数与其他语言有些不同,参数可以有默认值,如果没有传入对应参数的值,就使用默认值,参数也可以是可变参数。所以Python并不需要像其他语言一样支持函数的重载.
def add(a,b):
return a+b
#调用
add(2,3)
#参数有默认值
def add(a=0,b=0):
return a+b
#调用
add()
add(1)
add(1,3)
add(b=1,a=3)
#可变参数
#在参数面前加个*,表示该参数是可变参数
def add(*args):
total = 0
for val in args:
total += val
return total
#调用
add()
add(2)
add(2,4)
2 由于python不存在函数重载,同一个.py文件,如果用同名的函数,后面的函数会覆盖前面的函数,所以只有一个函数是真是存在的。
def foo():
print('hello, world!')
def foo():
print('goodbye, world!')
# 下面的代码会输出什么呢?
foo()
goodbye, world!
3 python中每个.py文件代表一个模块(moudle),不同模块可以有相同名字的函数,然后用import关键字引入模块来区分究竟是哪个模块的函数。
module1.py
def foo():
print('hello, world!')
module2.py
def foo():
print('goodbye, world!')
#
test.py
import module1
import module2
module1.foo()
# 输出hello, world!
module2.foo()
# 输出goodbye, world!
4 如果用下面的调用方式,后面的同名函数也会覆盖前面的函数
from moudle1 import foo
from moudle2 import foo
#调用
foo()
# 输出goodbye, world!
5 我们习惯在.py文件中加入if name == ‘main’:,因为如果没有这句话,在用import moudle的时候,就会调用该moudle的可执行代码,我们不希望如此。加入这个if语句,import moudle时,name__的名字是moudle,而不是__main,只有被直接调用的.py 文件__name__==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__
6 变量作用域
def foo():
a = 200 #局部变量
print(a) # 200
if __name__ == '__main__':
a = 100 #全局变量
foo()
print(a) # 100
调用foo函数后,变量a的值并没有改变,函数外的a是全局变量,函数内的a是局部变量,函数内a = 100,是重新定义了一个变量a,函数foo调用a是搜索最近的变量,也就是局部变量a。如果需要在函数内修改全局变量,需要在函数内定义变量是,加上关键字global。如果全局作用域中没有a,那么下面一行的代码就会定义变量a并将其置于全局作用域。
def foo():
global a
a = 200
print(a) # 200
if __name__ == '__main__':
a = 100
foo()
print(a) # 200