1.函数的返回值
第一个案例:
# 求任意数的和
# 可以通过return 来指定函数的返回值
def fn(*nums):
# 定义一个变量来保存结果
result = 0
# 遍历元组 并将元组中的元素累加
for n in nums:
result += n
# print(result)
return result
r = fn(1,2,3)
print(r+6)
- 返回值可以直接使用,也可以通过一个变量来接收函数返回值的结果。
第二个案例:
def fn():
# return 100
# return [1,2,3]
# return 1+1
def fn2():
print('python')
return fn2
r = fn()
r()
print(r)
- return后面可以跟任意的对象,甚至可以是一个函数。
第三个案例:
def fn2():
return
a = 10
r = fn2()
print(r)
- 如果仅仅写一个return 或者 不写return 则相当于return None
第四个案例:
def fn3():
print('hello')
return
print('abc')
r = fn3()
- 在函数中 return后面的代码都不会执行, return 一旦执行函数将自动结束
第五个案例:return,break,continue 区别
def fn4():
for i in range(5):
if i == 3:
#break # 用来退出当前循环
# continue # 用来跳过当次循环
return # 用来结束函数
print(i)
print('循环结束')
fn4()
由结果我们看出:
- break 用来退出当前循环
- continue 用来跳过当次循环
- return 用来结束函数
第六个案例:fn 和 fn() 的 区别
def fn():
return 10
print(fn)
print(fn())
执行结果分别是:
<function fn at 0x0000016C54C51268>
10
- fn 是函数对象 实际上在打印函数对象
- fn() 是在调用函数 实际上在打印fn()函数的返回值
2. 文档字符串
- help() 可以查询python 函数中的用法
- 语法 help(函数对象)
help(print)
def fn(a:int,b:str,c:bool) -> int:
'''
函数的参数
:param a: 作用 ....
:param b: 作用 ....
:param c: 作用 ....
:return: int
'''
return 10
help(fn)
3. 函数的作用域
作用域指的是变量生效的区域
- 在Python中有2种作用域
- 1 全局作用域
全局作用域在程序执行时创建,在程序结束时销毁;
所以函数以为的区域都是全局作用域;
在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序汇总的任意位置访问;- 2 函数作用域
函数作用域在函数调用时创建,在调用结束时销毁;
函数每调用一次就会产生一个新函数的作用域;
在函数作用域中定义的变量 都是局部变量,它只能在函数内部被访问;
示例代码:
a = 20
b = 20
def fn():
a = 10 #a定义在函数内部,所以它的作用域就是函数内部,函数外部是无法访问的
print('函数内部:','a =',a)
print('函数内部:', 'b =', b)
fn()
# print('函数外部:','a =',a)
print('函数内部:','b =',b)
3.1 通过global 关键字改变变量的作用域
a = 20
def fn2():
# 如果希望在函数内部修改全局变量,则需要使用global关键字,来声明变量
global a # 声明在函数内部的使用a是全局变量,此时在去修改a时,就是修改全局变量
a = 10
print('函数内部:','a =',a)
fn2()
print('函数外部:','a =',a)
4.命名空间
命名空间实际上就是一个字典,是一个专门用来存储变量的字典
- 使用locals()来获取当前作用域的命名空间
- 如果在全局作用域中调用locals()函数则获取全局作用域命名空间;
如果在函数作用域中调用locals()则获取函数命名空间;
locals() 返回的就是一个字典
a = 1
b = 2
c = 3
s = locals() # 获取当前的命名空间
print(s)
print(a)
print(s['a']) # 就是s中一个一个的键值对
s['c'] = 200 #增加一个c的变量
print(s)
def fn4():
a = 10
s = locals() #在函数内部调用locals()会获取函数的命名空间
s['b'] = 20 # 可以通过s来操作函数的命名空间,但是不建议这么做
print(s['b'])
print(s)
fn4()
一般不建议用这种方法来定义和操作变量
5. 递归
递归式的函数
递归简单理解就是自己去调用自己
递归式函数就是在函数中调用自己
5.1 递归的作用
递归式解决问题的一种方式
递归式函数的两个条件
1.基线条件
问题可以被分解成最小的问题,当满足基线条件时,递归不在执行了
2.递归条件
将问题继续分解的条件
看个例子:
def fn2(n):
# 基线条件
if n == 1:
# 1的阶乘是它本身
return 1
# 递归条件
return n * fn2(n-1)
print(fn2(10))
5.2 递归练习
- 1 创建一个函数 来为任意数做任意幂运算
def fn4(n,i):
# 定义了一个函数 其中有2个参数 n 要做幂运算的数字 i 做幂运算的次数
# 基线条件 幂为1
if i == 1:
return n
# 递归条件 2*2*2*2 = 16 2**4 2**3 2 ** 2
return n * fn4(n,i-1)
print(fn4(2,4))
- 练习二 创建一个函数 用来检查任意的字符串是否是回文字符串,如果是返回True,不是返回False
# 回文字符串 字符串从后往前念和从前往后念是一样的 abcba
# abcdefgfedcba
# 先检查第一个字符和最后一个字符是否一致,如果不一致不是回文字符串
# 如果一致,则看剩余部分是否是回文字符串
# 检查bcdefgfedcb 是不是回文
# 检查cdefgfedc 是不是回文
# 检查defgfed 是不是回文
# 检查 efgfe是不是回文
# 检查 fgf 是不是回文
# 检查 g 是不是回文
def fn5(s):
# 这个函数就是检查任意一个字符串是否是回文
# 参数s 就是我们要检查的字符串
# 基线条件
if len(s) < 2:
# 字符串的长度小于2 则这个字符串一定是回文
return True
elif s[0] != s[-1]:
# 第一个字符和最后一个字符不相等,不是回文
return False
# 递归条件
return fn5(s[1:-1])
print(fn5('abcdefgfedcba'))
6.高级函数
特点:
1.接收一个或多个函数作为参数
2.将函数作为返回值返回
满足任意一个特点就是高级函数
def fn(func,lst):
for n in lst:
if func(n):
new_list.append(n)
# 返回新的列表
return new_list
print(fn(fn4,l))
当我们使用一个函数作为参数时,实际上是将指定的代码传递进了目标函数,根据传入的不同的函数,就改变了实现的规则。