本节内容
1.函数
1.1定义以及特性
1.2参数
1.3局部变量
1.4返回值
2.递归函数
3.匿名函数
4.高阶函数
5.内置函数
1.函数
1.1定义以及特性
函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。
特性:
1、减少重复代码
2、使程序变得可扩展
3、使程序变得易维护
语法:
1 def f(): #函数名
2 print(‘Hello AV8D‘)
3
4
5 f() #调用函数
6 # Hello AV8D
也可以带参数
1 # 下面这段代码
2 a ,b = 5 ,8
3 c = a** b
4 print(c)
5
6
7 # 改成用函数写
8 def calc(x, y):
9 res = x ** y
10 return res # 返回函数执行结果
11
12
13 c = calc(a, b) #结果赋值给c变量
14 print(c)
1.2参数
形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
必须参数
在定义函数无其他参数形式时,形参与实参的数量需要一致且位置对应,否则会报错或赋值错误。
1 def stu_register(name,age,country):
2 print(‘姓名:‘,name)
3 print(‘年龄:‘,age)
4 print(‘居住地:‘,country)
5
6
7 stu_register(‘Acool‘,‘22‘,‘广州‘)
8 #输出:
9 # 姓名: Acool
10 # 年龄: 22
11 # 居住地: 广州
12
13 stu_register(‘Asue‘,21)
14 # TypeError: stu_register() missing 1 required positional argument: ‘country‘
默认参数
可在定义函数时,直接赋予形参一个实参,此时为默认参数,调用时可再赋予实参。
注意,使用默认参数时,需要在非固定参数之前,在必须参数后;若无其他参数则必须在最后位。
1 def stu_register(name,age,country=‘广州‘):
2 print(‘姓名:‘,name)
3 print(‘年龄:‘,age)
4 print(‘居住地:‘,country)
5
6
7 stu_register(‘Acool‘,‘22‘,‘北京‘)
8 #输出:
9 # 姓名: Acool
10 # 年龄: 22
11 # 居住地: 北京
12
13 stu_register(‘Asue‘,21)
14 #输出:
15 # 姓名: Asue
16 # 年龄: 21
17 # 居住地: 广州
关键字参数
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
1 stu_register(country=‘北京‘,name=‘Acool‘,age=‘22‘)
2 #输出:
3 # 姓名: Acool
4 # 年龄: 22
5 # 居住地: 北京
非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
1 def stu_register(name, age, *args): # *args 会把多传入的参数变成一个元组形式
2 print(name, age, args)
3
4
5 stu_register("Alex", 22)
6 # 输出
7 # Alex 22 () #后面这个()就是args,只是因为没传值,所以为空
8
9 stu_register("Jack", 32, "CN", "Python")
10 # 输出
11 # Jack 32 (‘CN‘, ‘Python‘)
还可以有一个**kwargs
1 def stu_register(name, age, *args, **kwargs): # *kwargs 会把多传入的参数变成一个dict形式
2 print(name, age, args, kwargs)
3
4
5 stu_register("Alex", 22)
6 # 输出
7 # Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空
8
9 stu_register("Jack", 32, "CN", "Python", sex="Male", province="ShanDong")
10 # 输出
11 # Jack 32 (‘CN‘, ‘Python‘) {‘province‘: ‘ShanDong‘, ‘sex‘: ‘Male‘}
可混合使用,但非必要则不用。
1.3局部变量
全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
1 #变量的作用域 2 3 count = 10 4 def outer(): 5 print(count) #报错,检查作用域内变量count在执行后面。不执行全局变量count,与全局变量count无关系 6 count = 5 #报错内容:应将后面定义count放到前面去。如果无定义,则会说明:无定义变量。 7 8 outer() 9 10 count = 10 11 def outer(): 12 count = 5 #此count是新建的一个局部变量,不是上面的全局变量 13 print(count) #不报错,执行打印局部变量count 14 15 print(count) #打印的是全局变量count 16 outer() #执行的是函数内部的局部变量count 17 18 19 count =10 20 def outer(): 21 global count #声明全局变量count 22 count=5 #修改全局变量count 23 print(count) 24 print(count) #还未调用函数,打印的是等于10的count 25 outer() #调用函数,打印已修改的count
1.4返回值
要想获取函数的执行结果,就可以用return语句把结果返回。
注意:
1、函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so也可以理解为return语句代表着函数的结束
2、如果未在函数中指定return,那这个函数的返回值为None
1 def f(n): 2 if n==1: 3 return 1 4 return n * f(n-1) 5 6 print(f(5)) 7 # 120
递归特性:
1、调用自身函数
2、有一个结束条件
3、但凡是递归可以写的,循环都可以写
4、递归的效率在很多时候会很低
斐波那契数列
1 def feibo(n): 2 if n<=2: 3 return n-1 4 # if n==1: 5 # return 0 6 # elif n==2: 7 # return 1 8 return feibo(n-1)+feibo(n-2) 9 10 print(feibo(8)) #从头为1开始,第8项 11 # 13
3.匿名函数
匿名函数就是不需要显式的指定函数
1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10))
匿名函数主要是和其它函数搭配使用的呢,如下
1 res = map(lambda x:x**2,[1,5,7,4,8]) 2 for i in res: 3 print(i) 4 5 #输出 6 1 7 25 8 49 9 16 10 64
4.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1 def add(x, y, f): 2 return f(x) + f(y) 3 4 5 res = add(3, -6, abs) # abs为内置函数 6 print(res) 7 # 9
5.内置函数
1 #内置函数----filter(只可过滤) 2 str = [‘a‘,‘b‘,‘c‘,‘d‘] 3 4 def fun1(s): 5 if s != ‘a‘: 6 return s 7 8 ret= filter(fun1,str) #(‘b‘,‘c‘,‘d‘) 9 print(ret) #<filter object at 0x00000168F58FEB00> 10 print(list(ret)) #ret是一个迭代器对象 11 12 #内置函数----map(可添加) 13 str = [‘d‘,‘v‘‘a‘,‘b‘] 14 def fun2(s): 15 return s + ‘alvin‘ 16 17 ret = map(fun2,str) #filter与map的区别 18 print(ret) #map object的迭代器 19 print(list(ret)) #[‘dalvin‘, ‘vaalvin‘, ‘balvin‘] 20 21 #内置函数----reduce 22 from functools import reduce 23 24 def add1(x,y): 25 return x + y 26 27 print(reduce(add1,range(1,10))) #从1至9相加,x=1 y=2得出来的3重新赋值于x y=3,再相加 28 # 45 29 30 #内置函数----lambda 31 from functools import reduce 32 33 print(reduce(lambda x,y:x+y,range(1,10))) 34 # 45 35 36 squares = map(lambda x :x*x,range(9)) 37 print(squares) # <map object at 0x0000020A8CFF3B00> 38 print(list(squares)) # [0, 1, 4, 9, 16, 25, 36, 49, 64]
原文:https://www.cnblogs.com/Yan-night/p/11204452.html