一、函数的返回值
函数的返回值:
1.函数返回给调用者的值
2.return后面的表达式的值
3.函数调用表达式的值
函数有没有返回值主要是看有没有return,如果有return,返回的就是return后面的值;如果没有return,函数返回的是None.
函数的调用过程:-------------重点、重点、重点
1.先回到函数声明的位置
2.用实参给形参赋值
3.执行函数体
4.将返回值返回给函数调用表达式
5.回到调用函数的位置
函数的结束:
1.函数体自然执行到结束
2.遇到return,直接结束,返回return后面的值
练习:写一个函数,求1+2+3+.....,和不能大于10000
def my_sum():
sum1 = 0
number = 1
while True:
if sum1 + number >= 10000:
return sum1,number-1
sum1 += number
number += 1
print(my_sum())
结果:(9870, 140)
二、作用域
作用域:一个变量可以使用的范围,就是这个变量的作用域。(函数和类可以影响变量的作用域)
全局变量:从声明开始到文件结束都可以使用的变量
局部变量:在函数(类)中声明的变量就是局部变量。作用域是从声明开始到文件结束。
如果要让一个局部变量变成全局变量,可以用global语句
格式:
global 变量
变量 = 新值
在声明函数的时候,如果函数里面在声明新的函数,可能用到nonlocal,不过这样使用的频率很低。
练习:声明一个变量,统计一个函数调用的次数
count = 0
def function():
global count
count += 1
function()
print(count)
function()
print(count)
function()
print(count)
function()
print(count)
结果:1
2
3
4
三、匿名函数
匿名函数:本质还是函数,以另外一种简单的方式来声明的
匿名函数的声明:
函数名 = lambda 参数列表:返回值
写一个函数,计算两个数的和
me = lambda x,y:x+y
print(me(10,20))
结果:30
注意:匿名函数本身就包含了一个返回值
四、函数作为变量
1.将函数作为参数
def my_sum(*number):
sum1 = 0
for item in number:
sum1 += item
return sum1
def my_mul(*numbers):
sum1 = 1
for item in numbers:
sum1 *= item
return sum1
def operation(method,x,y):
return method(x,y)
result1 = operation(my_sum,10,20)
result2 = operation(my_mul,10,20)
result3 = operation(lambda x,y:x<y,10,20)
result4 = operation(lambda x,y:x if x > y else y,10,20)
print(result1,result2,result3,result4)
结果:30 200 True 20
python中的三目运算符
值1 if 表达式 else 值2----->判断表达式是否为True,为True整个表达式的结果为'值1',否则表达式的结果为'值2'
五、递归函数
1、什么是递归
递归函数:在函数的函数体中调用函数本身
理论上循环能做的事情,递归都可以做
对递归的要求:能不用就不用
函数调用的过程是一个压栈的过程(每调用一次函数,系统都要为其分配内存空间,
用来存储函数中声明变量和参数,这个内存在函数调用结束的时候会自动释放)
2、怎么去写一个递归函数
a.找临界值(跳出循环---->return)
b.找关系:假设当前函数对应的功能已经实现,找到f(n)和f(n-1)的关系
c.使用f(n-1)和前面找到的关系去实现f(n)的功能
写一个递归函数实现:1+2+3+4+.....+n
def my_sum(n):
if n == 1:
return 1
return my_sum(n-1)+n
print(my_sum(5))
结果:15
作业:
1.写⼀个函数将⼀个指定的列表中的元素逆序(例如[1, 2, 3] -> [3, 2, 1])(注意:不要使⽤列表⾃带的逆序函数)
list1 = [1,2,3]
def reverse_list(list1):
for item in list1[0:len(list1)]:
list1.pop()
list1.insert(0,item)
return list1
print(reverse_list(list1))
结果:[3, 2, 1]
2.写⼀个函数,提取出字符串中所有奇数位上的字符
str1 = 'hjhkfjio14484845*(^^#%$#%^*^*'
def extract(str1):
str2 = ''
for item in str1[0:len(str1):2]:
str2 += item
print(str2)
extract(str1)
结果:hhfi1444*^#$%**
3.写⼀个匿名函数,判断指定的年是否是闰年
def leap_year(number):
if number%100 == 0:
if number%400 == 0:
return '闰年'
else:
return '平年'
else:
if number%4 == 0:
return '闰年'
else:
return '平年'
print(leap_year(189))
结果:平年
4.使⽤递归打印:
n = 3的时候
@
@@@
@@@@@
n = 4的时候:
@
@@@
@@@@@
@@@@@@@
def print_star(n,m=0):
if n == 1:
print(' '*m,'@ ')
else:
print_star(n - 1,m+1)
print(' '*m,'@ '*n)
print_star(5)
结果:
# 5.写函数,检查传⼊列表的⻓度,如果⼤于2,那么仅保留前两个⻓度的内容,并将新内容返回给调⽤者。
list1 = [1,2,3,4,5,6,7,8]
def length(list1):
list2 = []
if len(list1) > 2:
for item in list1[0:2]:
list2.append(item)
return list2
print(length(list1))
结果:[1, 2]
# 6.写函数,利⽤递归获取斐波那契数列中的第 10 个数,并将该值返回给调⽤者。
def sequence(n):
if n == 1 or n == 2:
return 1
return sequence(n-1)+sequence(n-2)
print(sequence(6))
结果:8
# 7.写⼀个函数,获取列表中的成绩的平均值,和最⾼分
list1 = [1,2,3,4,5,6,7,8,9]
def average(list1):
max1 = list1[0]
for item in list1:
if item > max1:
max1 = item
sum1 = 0
for x in list1:
sum1 += x
return max1,sum1/len(list1)
print(average(list1))
结果:(9, 5.0)
# 8.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新的列表返回给调
list1 = [1,3,8,'hfh','uryihi','&^%',')((&','4']
def check(list1):
list2 = []
for item in list1[1:len(list1):2]:
list2.append(item)
return list2
print(check(list1))
结果:[3, 'hfh', '&^%', '4']
网友评论