Day8-课堂笔记-函数
2018-07-25 本文已影响0人
晓晓的忍儿
1.函数的返回值
a.就是函数返回给调用者值
b.就是return关键字后面的表达式的值
c.就是函数调用表达式的值
函数调用:
a.回到函数的地方
b.传参(实参给形参赋值)
c.执行函数体
d.执行完函数体,将返回值返回给函数调用表达式
e.回到函数调用的位置
函数的函数体只有在调用之后才会执行
2.return关键字
a.将return后面的值,返回给函数调用表达式
b.结束函数
函数结束:
a.函数体执行完
b.遇到return
3.函数调用表达式:python中每个函数调用表达式都是有值的
(python中每个函数都是有返回值的,返回值就是return后面的值
如果没有return,那么函数的返回值就是None)
练习:写一个函数,判断指定的年龄是否属于成年人(返回结果)
def age_ren(age):
if age>18:
return '是成年人'
else:
return '还未成年'
str=age_ren(10)
print(str)
if age_ren(10)=='是成年人':
print('可以进入网吧')
else:
print('回家吃奶去吧')
结果:
还未成年
回家吃奶去吧
练习:写一个函数,求1+2+3+...,和不能大于10000
def sum(n):
sum=0
for x in range(1,n+1):
sum+=x
if sum>10000:
return sum
print(sum(10000))
def sum1():
sum1=0
sum2=0
while True:
if sum2+sum1>10000:
return sum2,sum1
#python中函数可以有多个返回值,在return
#后面返回多个值,每个值之间用逗号隔开。返回值是一个元组
sum2 += sum1
print(sum1())
结果:
10011
4.作用域
- 作用域:变量可以使用的范围(函数和类可以影响变量的作用域)
- 全局变量:从声明开始,到文件结束都可以使用
- 局部变量:在函数(类)中声明的变量,作用域是从声明开始到函数(类)结束
a=10 #全局变量
def func1():
b='a' #局部变量
print(a)
print(b)
for _ in range(10):
c=100 #全局变量
print(c)
func1()
print(a)
结果:
100
10
a
10
- global和nonlocal
global:如果全局变量中没有相同的变量名,就在函数中创建一个全局变量
格式: global 变量名
变量名=值
nonlocal:在函数中声明函数的时候,才需要使用
# python中函数里面可以声明函数
abc='abc'
bcd='bcd'
def func4():
abc='aaa' #如果全局变量名和局部变量名相同,在函数中使用的是局部变量
print(abc)
global bcd #说明bcd是一个全局变量,并可以在函数和类中创建一个全局变量
bcd = 200
print(bcd)
func4()
print(abc)
print(bcd)
结果:
aaa
200
abc
200
练习:声明一个变量,统计一个函数调用的次数
sum1=0
def math():
global sum1
sum1=1
print('===')
math()
math()
math()
print(sum1)
def func8():
a1=10
print('外部:',a1)
def func9():
# a1 = 100
# print('内部:', a1)
nonlocal a1
a1=100
print('内部:', a1)
func9()
print('外部:',a1)
func8()
结果:
===
===
===
1
外部: 10
内部: 100
外部: 100
5.匿名函数
匿名函数:本质还是函数,以另外一种简单的方式来声明
格式:函数名=lambda 参数列表:返回值--->结果就是一个函数变量
#写一个函数计算两个数的和
sum=lambda x,y:x*y
print(sum(10,20))
print((lambda x:x*4)(2))
结果:
200
8
6.函数作为变量
声明一个函数就是在声明一个变量。函数名可以当成变量来使用
可以打印,可以赋值,可以查看类型,可以作为函数的参数,可以作为函数的返回值
#将函数func1赋给变量a,这个时候a就是一个函数
def func1(a):
print(a)
return 10
print(func1,type(func1))
a=func1
b=func1(10)+100
a('aaa')
#将函数func1作为列表的元素
functions=[func1,func1(10)]
functions[0]('b')
结果:
10
aaa
10
b
1)将函数作为参数
def my_sum(*numbers):
sum1=0
for item in numbers:
sum1+=item
return sum1
def my_mul(*numbers):
sum1=1
for item in numbers:
sum1*=item
return sum1
def operation(method,x,y):
# 求10和20的和
result=operation(my_sum,1,3)
print(result)
# 求10和20的积
result=operation(my_mul,1,3)
print(result)
# 判断10是否大于20
result3=operation(lambda x,y:x>y,10,23)
# result3=operation(lambda x,y:x if x>y else y,10,5)
print(result3)
'''
:param method: 运算方式
:param x: 变量1
:param y: 变量2
:return: 返回两个值
'''
return method(x,y)
结果:
4
3
False
2)三目运算
python中的三目运算符
值1 if 表达式 else 值2 --->判断表达式是否为True,为True
整个表达式的结果为值1,否则是值2
print(a=10 if 10>20 else 20)
结果:
20
3)将函数作为函数的返回值
print((lambda x,y:x*y)(10,20))
结果:
200
练习:写一个函数有个参数,要求传入一个运算符(+,-,*,>,<),返回符号对应的功能
def get_method(method):
if method=='+':
def get_sum(*number):
num = 0
for item in number:
if num==0:
sum1=item
else:
sum1+=item
num += 1
if num<2:
sum1=None
return sum1
return get_sum
if method == '>':
return lambda x,y:x>y
if method == '<':
return lambda x,y:x<y
if method=='-':
def get_cha(*number):
num=0
for item in number:
if num==0:
sum2=item
else:
sum2-=item
num += 1
if num<2:
sum2=None
return sum2
return get_cha
if method=='*':
def get_mul(*number):
num=0
for item in number:
if num==0:
sum3=item
else:
sum3*=item
num += 1
if num<2:
sum1=None
return sum3
return get_mul
print(get_method('+')(10,20,30))
print(get_method('*')(10,20,30))
print(get_method('-')(-10,-20-30))
print(get_method('>')(10,20))
print(get_method('<')(10,20))
7.递归函数
*递归函数:在函数的函数体中调用函数本身理论上循环能做的事情,递归都可以做
*对递归的要求:能不用就用
函数调用的过程是一个压站的过程(每调用一次函数,系统都有为其分配内存空间,用来存储函数中声明的变量和参数等,这个内存在函数调用结束后会自动销毁)
- 写递归函数
a.找临界值(跳出循环-->return)
b.找关系:假设当前函数对应的功能已经实现,
找到f(n)和f(n-1)的关系
c.使用f(n-1)与b中的关系去实现f(n)的功能
#普通函数
def get_sum(n):
sum1 = 0
for x in range(1,n+1):
sum1+=x
return sum1
print(get_sum(10))
# 递归函数
def my_sum2(n):
# 找到临界值
if n==1:
return 1
return my_sum2(n-1)+n
print(my_sum2(10))
# 练习:用递归求2*4*6*...*n(n是偶数)
def my_mul(n):
if n==2:
return 2
# 关系
# f(x)=f(x-2)*n
if n%2!=0:
n=n-1
return my_mul(n-2)*n
print(my_mul(10))
结果:
55
55
3840
**