一. 函数
1. 函数的返回值
(1)
def fun(*args):
r = 0
for i in args:
r += i
print(r)
fun(1, 2, 3, 4)
# 输出(但是不能把r的值拿到外边用)
10
但是在函数外加上print(r)的时候,会报错,没有返回值,也就是无法用函数里边的值
(2)写一个函数的最初的梦想,就是封装好这个功能,让我们可以随时调用。
函数的调用=函数的返回值
def fun(*args):
r = 0
for i in args:
r += i
print(r)
return r
print(fun(1, 2, 3, 4))
#输出
10
10 # 函数的返回值用函数的调用fun()来接收了这个返回值的结果
用一个变量去接收函数的返回值,再进行其他操作,会更方便
def fun(*args):
r = 0
for i in args:
r += i
print(r)
return r
result = fun(1, 2, 3, 4)
print(result - 4)
# 输出
10
6
(3)任意类型的值都可以作为函数的返回值来返回
def fun1():
return 1 #return True #return [1, 2, 3])
print(fun1())
# 输出
1 # 后边括号里边输出的是True,[1, 2, 3]
def fun1():
def fun2():
pass
return fun2
print(fun1())
# 输出
<function fun1.<locals>.fun2 at 0x0000020364916048>
但是fun2这个函数并没有被调用,而在fun1后边加上一个括号后就可以被调用了。
def fun1():
def fun2():
print(1)
return fun2
print(fun1()) # fun1()=fun2
print(fun1()()) # fun1()()=fun2(),此时fun2可以被调用
# 输出
<function fun1.<locals>.fun2 at 0x0000022BA1046048>
1
None
对于返回值来说,如果不写return xxx和只写一个return,返回的结果都是None
def fun1():
def fun2():
print(1)
return 123
return fun2
print(fun1())
print(fun1()())
# 输出
<function fun1.<locals>.fun2 at 0x0000018AA42F6048>
1
123
(4)return的特性:在函数中,return后边的代码都不会执行,return一旦执行,函数自动结束
def fun2():
print(1)
return
print(2)
fun2()
# 输出
1
(5)练习题
def fun3():
for i in range(5):
if i == 3:
break # 用来退出当前循环
print(i)
print("循环执行结束")
fun3()
# 输出
0
1
2
循环执行结束
def fun3():
for j in range(2): # range()是左闭右开的
for i in range(5):
if i == 3:
break
print(i)
print("循环执行结束")
fun3()
# 输出
0
1
2
循环执行结束
0
1
2
循环执行结束
def fun3():
for i in range(5):
if i == 3:
continue
print(i)
print("循环执行结束")
fun3()
# 输出
0
1
2
4
循环执行结束
def fun3():
for i in range(5):
if i == 3:
return # return后边的代码都不会执行了
print(i)
print("循环执行结束")
fun3()
# 输出
0
1
2
2. 文档字符串
(1)文档字符串:运用于对函数或者面向对象做功能、参数等的说明帮助文档
def fun(a, b): # 打入三对双引号之后回车就会出现以下内容
"""
:param a:
:param b:
:return:
"""
(2)help()是内置函数,可以查询函数的用法,帮助查看文档说明
help(print)
# 输出
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
3. 函数的作用域
(1)作用域指的是变量生效的位置
(2)在最外层函数以外的区域都是全局作用域
(3 )函数内部的函数正常情况下不能拿到外边来用,
def fun4():
a = 1
print('函数内部', a)
fun4()
print('函数外部', a)
# 输出(有错误)
函数内部 1
Traceback (most recent call last):
File "E:/安装软件/PyCharm software/PyCharmproject/第9讲/第九讲.py", line 61, in <module>
print('函数外部', a)
NameError: name 'a' is not defined
b = 2
def fun4():
a = 1
print('函数内部', a)
print('函数内部', b)
fun4()
print('函数外部', b)
# 输出
函数内部 1
函数内部 2
函数外部 2
(4)有一个方法可以让内部函数的变量拿到外边来用:声明a是全局变量,属于全局作用域,global xxx
def fun4():
global a
a = 1
print('函数内部', a)
fun4()
print('函数外部', a)
# 输出
函数内部 1
函数外部 1
4. 命名空间
(1)命名空间实际上是一个字典,用来储存变量,local()用来获取当前作用域的命名空间
a = 1
b = 2
c = 3
print(locals())
# 输出
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002061E3DC0B8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/安装软件/PyCharm software/PyCharmproject/第9讲/第九讲.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3}
a = 1
b = 2
c = 3
space = locals()
space['d'] = 4
print(space)
# 输出
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000027114DFC0B8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/安装软件/PyCharm software/PyCharmproject/第9讲/第九讲.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'space': {...}, 'd': 4}
# 在最后把d给加上了
def fun():
space = locals()
print(space)
fun()
# 输出
{}
def fun():
abc = 123
space = locals()
print(space)
fun()
# 输出
{'abc': 123}
获取全局作用域的命名空间
a = 1
def fun():
abc = 123
space = globals()
print(space)
fun()
# 输出
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000024C72F3C0B8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/安装软件/PyCharm software/PyCharmproject/第9讲/第九讲.py', '__cached__': None, 'a': 1, 'fun': <function fun at 0x0000024C73011F28>}
5. 递归函数
(1)需求:求10!(10的阶乘)
print(1*2*3*4*5*6*7*8*9*10)
# 输出
3628800
n = 10
for i in range(1, 10):
n *= i
print(n)
# 输出
3628800
可以用来求n的阶乘
def fun(n):
for i in range(1, 10):
n *= i
return n
r = fun(10)
print(r)
# 输出
3628800
(2)递归:首先是一个函数,然后它还是一个自己调用自己的函数
但是像是下边这样自己调用自己就不可以了
def fun1():
fun1()
fun1()
# 错误
RecursionError: maximum recursion depth exceeded(超过最大递归深度)
(3)满足两大条件:
a.基线条件:问题可以分解为最小的问题,当满足基线条件的时候,我们再去解决问题
b.递归条件:将问题继续分解的条件
(4)返回第一问的需求,求10的阶乘,我们定义函数的目的就是这个
def fun(n):
# 基线条件
if n == 1:
return 1
# 递归条件
return n * fun(n-1)
r = fun(10)
print(r)
# 输出
3628800
6. 递归练习
(1)求任意数字的任意幂运算
def fun(n, m): # fun(n)是求n的m次幂运算
# 基线条件
if m == 1:
return n
# 递归条件
return n * fun(n, m-1)
print(fun(10, 4))
# 输出
10000
(2)回文字符串的练习:检测一个字符串是不是回文字符串,是:返回True,不是:返回False
回文字符串:abcdefgfedcba/abcdefggfedcba
def fun1(s): # 判断是否是回文字符串
# 基线条件
if len(s) < 2:
return True
elif s[0] != s[-1]:
return False
# 递归条件
return fun1(s[1:-1])
s = input(':')
if len(s) < 2:
print('请重新输入字符串')
else:
print(fun1(s))
# 输入
:121
# 输出
True
二. 作业
1. 第一个作业
用函数实现一个判断用户输入的年份是否是闰年的程序
(1)能被400整除的年份
(2)能被4整除,但是不能被100整除的年份
以上2种方法满足一种即为闰年
def fun(year):
if year % 400 == 0:
print('该年份为闰年')
elif year % 4 == 0 and year % 100 != 0:
print('该年份为闰年')
else:
print('该年份不是闰年')
year = int(input('请输入年份:'))
fun(year)
# 输入
2400
# 输出
该年份为闰年
2. 第二个作业
猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def fun1(n, day):
# 基线条件
if day == 1:
return n
# 递归条件
return fun1((n + 1)*2, day - 1)
print(fun1(1, 10))
# 输出
1543