函数是什么?
函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method.
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
1 减少重复代码
2 使程序变的可扩展
3 使程序变得易维护
语法定义
1.1 不带参数的函数
def my_function():
print(' this is a test function')
my_function()
1.2 带参数的函数
def my_add(a,b): # a b 为形式参数
return a+b #返回值
a = my_add(50,100) # 50 ,100 实际参数
print(a)
1.3 关键参数
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
#指定参数传递
def my_add1(a,b,c="cn"): # 为参数c指定缺省值
print("a",a)
print("b",b)
print("c",c)
return a+b
b = my_add1(b=50,a=10,c='111') # 若c 不给值,则为缺省值
1.4 非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
# args
def my_args(name, age, *args): # *args 会把多传入的参数变成一个元组形式
print(type(args))
print(name, age, args)
my_args("lqlkxk",26,"man","IT")
# kwargs
def my_kwargs(name, age, *args, **kwargs): # **kwargs 会把多传入的参数变成一个dict形式
print(type(kwargs))
print(name, age, args, kwargs)
my_kwargs("lqlkxk",26,"man","IT",salary=2000,hobby="book")
2.函数作用域
2.1 块级作用域
# 块级作用域
if 1 == 1:
name = "test"
print(name)
for i in range(10):
age = i
print(age)
代码执行成功,没有问题;在Java/C#中,执行上面的代码会提示name,age没有定义,而在Python中可以执行成功,这是因为在Python中是没有块级作用域的,代码块里的
变量,外部可以调用,所以可运行成功;
2.2 局部作用域
#局部作用域
def func():
name = "test"
print(name)
NameError: name 'name' is not defined
运行报错,name变量只在func()函数内部中生效,所以在全局中是没法调用的;对上面代码做个简单调整,再看看结果如何?
#局部作用域
def func():
name = "test"
func() #执行函数
print(name)
NameError: name 'name' is not defined
执行依然报错,还是回到刚才那句话:即使执行了一下函数,name的作用域也只是在函数内部,外部依然无法进行调用
name = "test"
def f1():
name = "test1"
def f2():
name = "test2"
print(name)
f2()
f1()
输出结果
test2
name = "test"
def f1():
print(name)
def f2():
name = "test1"
f1()
f2()
输出结果
test