Python学习-函数
函数
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
1.减少代码重复
2.使程序有可扩展性
3.使程序变得统一
语法:
def 函数名():
函数体
函数名() #调用函数
#可以有参数
def add(a,b): #带参数
c = a + b
print(c)
add(1,2)
函数参数:
1.形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
2.实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
1 def add(a,b): #形参 2 c = a + b 3 return c 4 5 sum = add(1,2) #实参 6 print(sum)
默认参数
先看以下代码
1 def person_info(name,age,sex): 2 print('姓名:',name) 3 print('年龄:',age) 4 print('性别:',sex) 5 person_info('张一',20,'男') 6 person_info('张二',22,'男') 7 person_info('张三',18,'男')
上面代码的sex参数传入的值都是 男,我们可以通过默认参数来实现,把sex变成默认参数
1 def person_info(name,age,sex = '男')
如果调用函数时,sex参数不指定,就会默认为男,如果想要修改的话,可以指定值
1 def person_info(name,age,sex='男'): 2 print('姓名:', name) 3 print('年龄:', age) 4 print('性别:', sex) 5 6 person_info('张一',20) 7 person_info('张二',22) 8 person_info('张三',18,'女')
同时需要注意的是:sex变成默认参数后要放在最后面,放在位置参数后面。
否则会产生 SyntaxError: non-default argument follows default argument 错误
关键参数
正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
1 person_info(name='张三',sex = '女',age = 18)
非定长参数
函数在定义时不确定用户想传入多少个参数,就可以使用非定长参数
如果我们想实现多个数相加的功能
1 def add(*args): #*args会把传入的参数转成一个元组形式 2 print(args) # (1,2,4) 3 num = 0 4 for i in args: 5 num += i 6 print(num) 7 8 add(1,2,4)
9 add(1,2,3,4,5)
当要输入多个具有名字的变量时,可以使用**kwargs
1 def person_info(**kwargs): #**kwargs 将输入的参数转换成字典 2 for i in kwargs: 3 print('%s:%s' % (i, kwargs[i])) #name:abc 4 #age:18 5 print(kwargs) #{'name': 'abc', 'age': 18} 6 7 person_info(name='abc',age=18)
局部变量
1 a = 10 # 全局变量 2 3 def foo(): 4 a = 5 #局部变量 5 print(a) 6 7 foo() 8
输出 5
返回值
return 语句可以得到程序的执行结果
1 def f(): 2 a = 10 3 return a 4 print(f())
函数在执行过程中只要遇到return语句,就会停止执行并返回结果,return 语句代表着函数的结束
如果未在函数中指定return,那这个函数就会有一个默认返回值None
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
1 def factorial(n): 2 if n <= 0: 3 return 1 4 return n * factorial(n - 1) 5 6 print(factorial(4))
输出第n个斐波那契数列
def fibo(n): if n == 1: return 0 if n == 2: return 1 return fibo(n - 1) + fibo(n - 2) print(fibo(4))
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回 栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
高阶函数
变量可以指向函数,函数可以接收参数。 使用一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1 def add(a): 2 return a 3 4 def foo(x,y,func): 5 return func(x) + func(y) 6 7 print(foo(1,2,add))
map()函数
map()函数接收两个参数,第一个是函数参数,第二个是一个可迭代的序列,map()函数将传入的函数作用到序列的每个元素,并把结果作为新的可跌代的序列返回。
比如有一个函数是返回传入数的平方,要把函数作用到 list = [1,2,3,4,5,6,7,8,9]上,可以用map()函数实现
1 def f(n): 2 return n * n 3 li = [1,2,3,4,5,6] 4 a = map(f, li) 5 print(list(a)) #[1,4,9,16,25,36]
map()作为高阶函数,事实上把运算规则抽象了,因此用map()函数不仅可以计算简单的平方运算,还可以计算任意更复杂的函数。
reduce()函数
reduce把一个函数作用在一个数列上[x1,x2,x3,x4,x5],这个函数必须接收两个参数,reduce把结果和序列的下一个元素做累积计算。
比如对一个数列求和
1 from functools import reduce 2 def add(x, y): 3 return x + y 4 5 print(reduce(add,[1,2,3,4,5,6]))
filter()函数
filter()用于过滤序列。filter()接收一个函数和一个序列,把传入的函数依次作用于每个元素,根据返回值是True 还是Flase决定保留还是舍弃该元素。
比如要删掉数列中的偶数
1 def is_odd(n): 2 return n % 2 == 1 3 print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9])))
匿名函数
当我们在传入函数时,有时候不需要显式的定义函数,直接传入匿名函数更方便。
map函数计算数列平方时可以传入匿名函数
print(list(map(lambda x : x * x,[1,2,3,4])))
lambda表示匿名函数,x表示函数参数。不用写return,表达式的结果就是返回值。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数,同样也可以把匿名函数作为返回值返回。
浙公网安备 33010602011771号