今天更新一下有关于函数的知识点~
函数是什么?
函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。
函数分为面向对象,面向过程和函数式编程。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
语法定义
def name() : #name 是函数名称 print("hello world") return 0 #返回值可有可无,可以是任何值或者函数或者表达式,可以是任何东西,不写的话返回NONE name()
当然,函数是可以传参数的,比如下面:
def asd(x,y): #xy都是形参 print(x,y) asd(1,2) #1,2是实参 asd(x=1,y=2) asd(1,y=2) 以上三种传参方法都是正确的,但需要注意的是第三种方法,位置参数是必须要优先的,如果写成asd(2,x=1)程序是不会把2传给y的。
还有一种方法是传默认参数,多用于设置默认值或者连接数据库端口号,这种相当于设定了初始值,如果想修改也能修改。
def test(x,y=8080): print(x,y) test (443) 结果是输出 443,8080 如果是 test(443,80) 那么输出就是 443,80
函数不光可以传单个参数,也可以传参数组,可以用元祖或者字典去传值,方法如下:
def test(*args): #*args将接收的N个数值转换成元祖,放在元祖中传值 print(args) test(1,2,3,4,5)
def test(**kwargs): #这是将字典传入函数
print(kwargs['name'])
test(name='xiaoming',age=22)
结果是xiaoming
不光可以传入单一类型的值,还能组合传入:
def test(name,age=18,*args,**kwargs): print(name,age,args,kwargs) test('xiaoming',24,1,2,3,4,sex='man')
局部变量和全局变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
简而言之,全局变量就是在程序顶部写的,局部变量
嵌套函数和递归
嵌套函数
name = "xiaoming" def change_name(): name = "xiaowang" def change_name2(): name = "xiaofang" print("第3层打印",name) change_name2() #调用内层函数 print("第2层打印",name) change_name() print("最外层打印",name)
递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
ef calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10) 输出: 10 5 2 1
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
匿名函数:
匿名函数就是不需要显式的指定函数,匿名函数主要是和其它函数搭配使用。如下面所示
def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10))
内置函数:
python中有很多已经写好的函数,可以直接调用。
具体操作方法请见:https://docs.python.org/3/library/functions.html?highlight=built#ascii