函数第二讲
1. 函数的返回值
返回值就是函数执行以后返回的结果
# 求任意数的和
def s(*nums):
# 定义一个变量来保存结果
result = 0
# 遍历元组,并将元组当中的元素进行累加
for n in nums:
result += n
# print(result)
return result
r = s(1,2,3,4)
print(r)
# 10
用return来指定函数的返回值
我们可以直接使用函数的返回值也可以通过变量来接收函数的返回值
return后面可以跟任意对象,甚至可以是一个函数
def fn():
# return 100
# return 'Python'
# return [1, 2, 3]
# return {'a', 1}
def sn():
print('hello')
return sn()
r = fn()
# hello
如果仅仅写一个return或者不写return则相当于return none
def fn():
print('hello')
return
r = fn()
print(r)
# hello
# None
在函数中,return后面的代码不会执行,return一旦执行函数自动结束
def fn():
print('Python')
return
print('Java')
r = fn()
print(r)
# Python
# None
return、break、continue的区别
break退出当前循环
continue跳过本次循环
return可以用结束函数
def fn1():
for i in range(5):
if i == 3:
break
print(i)
print('执行了这行代码')
fn1()
# 0
# 1
# 2
# 执行了这行代码
def fn2():
for i in range(5):
if i == 3:
continue
print(i)
print('执行了这行代码')
fn2()
# 0
# 1
# 2
# 4
# 执行了这行代码
def fn3():
for i in range(5):
if i == 3:
return
print(i)
print('执行了这行代码')
fn3()
# 0
# 1
# 2
2. 文档字符串
help()函数:可以查询其他函数的用法
语法:help(函数对象)
# def fn(a:int,b:str,c:bool)-> int:
#
# '''
# :param a: 类型 int 默认值...
# :param b: 类型 str 默认值...
# :param c: 类型 bool 默认值...
# :return: int
# '''
#
# return 1
#
# help(fn)
3. 函数的作用域
作用域指的就是变量生效的区域
全局作用域:
全局作用域在程序执行时创建,在程序执行结束时销毁,所有函数以外的部分都是全局作用域,在全局作用域中定义的变量都属于全局变量,全局变量可以在程序的任意位置访问
函数作用域:
函数作用域在函数调用时创建,在调用结束后销毁,函数每调用一次就会产生一个新的作用域,在函数作用域中定义的变量都是局部变量,它只能在函数内部被访问到
global关键字
如果希望在函数内部修改全局变量,则需要使用global关键字,来声明变量
a = 20
def fn1():
a = 10
print('函数内部:', 'a =', a)
fn1()
print('函数外部:', 'a =', a)
# 函数内部: a = 10
# 函数外部: a = 20
a = 20
def fn2():
global a
a = 10
print('函数内部:', 'a =', a)
fn2()
print('函数外部:', 'a =', a)
# 函数内部: a = 10
# 函数外部: a = 10
4. 命名空间
命名空间:实际上就是一个字典,是一个专门用来存储变量的字典
locals():用来获取当前作用域的命名空间
如果在全局作用域中调用locals()则获取的是全局命名空间,如果在函数作用域中调用,则获取的是函数的命名空间 返回是一个字典
s = locals() # 当前的命名空空间
s['b'] = 100 # 像字典中添加key-value 就相当于在全局中创建了一个变量
print(b)
print(s)
# 100
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002805923B160>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Python-Pycharm代码/上课代码整理/函数练习.py', '__cached__': None, 's': {...}, 'b': 100}
globals():函数可以用来在任意位置获取全局命名空间
def fn():
a = 10
# s = locals() # 在函数内部调用locals()会获取到函数的命名空间
# s['c'] = 20
# print(c)
# print(s)
# # 报错
global_space = globals()
print(global_space)
fn()
5. 递归
5.1 递归式的函数
递归简单理解就是自己调用自己
递归式函数,在函数中自己调用自己
5.2 无穷递归
类似于死循环
def fn():
fn()
fn()
5.3 递归式函数有两个条件
- 基线条件
问题可以被分解为最小的问题,当满足基线条件的时候,递归就不在执行了 - 递归条件
将问题可以分解的条件
6. 递归的练习
6.1 练习一
定义一个函数求任意数的阶乘
def fn(a):
if a == 1:
return 1
return a * fn(a-1)
r = fn(10)
print(r)
# 362880
6.2 练习二
创建一个函数来为任意数字做幂运算
def fn(a, i):
if i == 1:
return a
return a * fn(a, i-1)
r = fn(5, 3)
print(r)
# 125
6.3 练习三
创建一个函数,用来检测任意字符串是否是回文字符串
方法一
def fn(a):
if len(a) <= 1:
return True
elif len(a) >= 2:
if list(a)[0] != list(a)[-1]:
return False
else:
return fn(list(a)[1: -1])
r = fn('abcdefedcba')
print(r)
# True
方法二
def fn(a):
if len(a) <= 1:
return True
elif a[0] != a[-1]:
return False
return fn(a[1: -1])
r = fn('abcdefg')
print(r)
# False