函数是什么?

函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在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