1. 函数的返回值
• 返回值就是函数执行以后返回的结果
#求任意数的和
def fn(*nums):
result=0
for n in nums:
result+=n
print(result)
fn(1,2) #3
• 通过return来指定函数的返回值
#返回值 就是函数执行以后返回的结果
#可以通过return来指定函数的返回值
#可以通过一个变量来接收函数的返回值
def fn():
return 100
r= fn()
print(r)
print(fn()) #或者采取这种方式
100
100
• return后面可以跟任意对象,返回值甚至可以是一个函数
1.可以是字符
def fn():
# return 100
return "python"
r= fn()
print(r)
print(fn()) #或者采取这种方式
python
python
2.可以是字典 数列
def fn():
# return 100
# return "python"
# return[1,2,3] #[1, 2, 3] 可以是列表
return {"name":"张三"} #{'name': '张三'}
r= fn()
print(r)
print(fn()) #或者采取这种方式
3.可以是函数
def fn():
def fn2():
print("hello")
return fn2
r= fn() #r此时是一个函数
r()#调用执行时 返回的值
hello
#如果仅仅写一个return,或者不写return,则相当于return None
def fn2():
return
r=fn2()
print(r)
None
def fn3():
print("hello")
print("1,2,3")
r=fn3()
print(r)
hello
1,2,3
None #没有写return,相当于return none
#在函数中,执行到return后则不再执行
def fn3():
print("hello")
return
print("1,2,3")
r=fn3()
hello
def fn4():
for i in range(5):
print(i)
fn4()
0
1
2
3
4
def fn4():
for i in range(5):
if i==3:
break
print(i)
print("循环执行完毕")
fn4()
0
1
2
循环执行完毕
return 用来结束函数
在函数中 return后面的代码都不会执行,return一旦执行,函数自动结束。
def fn4():
for i in range(5):
if i==3:
# break
return
print(i)
print("循环执行完毕")
fn4()
0
1
2
# #求任意数的和
def fn(*nums):
result=0
for n in nums:
result+=n
# print(result)
return result
r=fn(1,2)
print(r+3)
6
函数加()和无是的区别
def fn5():
return 100
#fn5和fn5()的区别
#fn5是函数对象 ,只是希望将函数对象提供时 不加()
#fn5()实在调用函数, 在需要返回值时,需要加上()
print(fn5)
print(fn5())
<function fn5 at 0x107641e18>
100
2. 文档字符串
• help()是Python中内置函数,通过help()函数可以查询Python中函数的用法。
#help()函数
#通过help()函数来查询python中函数的用法
help(print)
print("abc","123")
print("www","baidu","com")
print("www","baidu","com",sep=".")
abc 123
www baidu com
www.baidu.com
• 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
把自己定义的文档 字符串进行说明
def fn(a,b,c):
"""
这个函数是一个文档字符串的实例
参数a 作用 类型默认值 :param a:
参数b 作用 类型默认值 :param b:
参数c 作用 类型默认值 :param c:
:return:
"""
return 100
help(fn)
fn(a, b, c)
这个函数是一个文档字符串的实例
参数a 作用 类型默认值 :param a:
参数b 作用 类型默认值 :param b:
参数c 作用 类型默认值 :param c:
:return:
通过->方式对函数进一步说明
ef fn(a:bool,b:int,c:str)->int: #返回需要时一个int类型的整数
"""
这个函数是一个文档字符串的实例
参数a 作用 类型默认值 :param a:
参数b 作用 类型默认值 :param b:
参数c 作用 类型默认值 :param c:
:return:
"""
return 100
help(fn)
fn(a:bool, b:int, c:str) -> int
这个函数是一个文档字符串的实例
参数a 作用 类型默认值 :param a:
参数b 作用 类型默认值 :param b:
参数c 作用 类型默认值 :param c:
:return:
3. 函数的作用域
• 作用域(scope)
• 作用域指的是变量生效的区域
def fn():
#a定义在了函数的内部,所以它的作用域就是函数内部,函数外部是无法访问的
a=10
print("函数内部:","a=",a) #函数内部: a= 10
fn()
print("函数外部:", "a=", a) #NameError: name 'a' is not defined
• 在Python中一共有两种作用域
• 全局作用域
• 全局作用域在程序执行时创建,在程序执行结束时销毁
b=50
def fn():
#a定义在了函数的内部,所以它的作用域就是函数内部,函数外部是无法访问的
a=10
print("函数内部:","a=",a)
print("函数内部:","b=",b)
fn()
print("函数外部:","b=",b) #全局作用域
函数内部: a= 10
函数内部: b= 50
函数外部: b= 50
• 所有函数以外的区域都是全局作用域
• 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
a=30
def fn2 ():
def fn3():
# global a #声明在函数内部的使用,用于修改全局变量,通过a修改全局的a
#声明在函数内部使用的变量a是全局变量,则此时在去修改a时,就是在修改全局变量
a=40
print("这是函数内部","a=",a)
fn3()
fn2()
print("这是函数外部","a=",a)
这是函数内部 a= 40
这是函数外部 a= 30
当使用global 时修改全局变量
a=30
def fn2 ():
def fn3():
global a #声明在函数内部的使用,用于修改全局变量,通过a修改全局的a
a=40
print("这是函数内部","a=",a)
fn3()
fn2()
print("这是函数外部","a=",a)
这是函数内部 a= 40
这是函数外部 a= 40
• 函数作用域
• 函数作用域在函数调用时创建,在调用结束时销毁
• 函数每调用一次就会产生一个新的函数作用域
• 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
4. 命名空间
• 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
• locals()用来获取当前作用域的命名空间
• 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间
#命名空间实质上就是一个字典,是一个专门用来存储变量的字典
#locals()用来获取当前作用域的命名空间,返回值是字典
a=20
def fn():
global a
a=50
print("函数内部","a=",a)
s=locals()
print(s)
print(a) #20
print(s["a"]) #20
s["c"]=100
print(c)
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x101d266d8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/artemisyan/PycharmProjects/study with python/day 11/dome 4.py', '__cached__': None, 'a': 20, 'fn': <function fn at 0x101cb0e18>, 's': {...}}
20
20
100
def fn():
a=10
s=locals() #获取函数内部的命名空间
s["b"]=20
print(s)
fn()
{'a': 10, 'b': 20}
利用globals()获取全局的命名空间
def fn2():
global_s= globals() #获取全局的命名空间
print(global_s)
fn2 ()
• 返回值是一个字典
5. 递归函数
• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
• 递归式函数有2个条件
• 1. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
#尝试求10的阶乘(10!)
#1!=1
#2!=1*2=2
#3!=1*2*3=6
#.......*8*9*10
# print(1*2*3*4*5*6*7*8*9*10)
#创建一个变量
n=10
for i in range(1,10):
n*=i
print(n) #3628800
#求任意数的阶乘
def fn(n):
#参数n 要求阶乘的数字
# n = 10
#定义一个变量 保存结果
result=n
for i in range(1, 10):
result *= i
return result
print(fn(9)) #3265920
• 2. 递归条件 可以将问题继续分解的条件
#递归是一个解决问题的方式
#它的整体思想,是将一个大的问题,分解为一个一个小问题,直到问题无法分解时,再去解决问题
#递归式的函数有2个条件
#1.基线条件
#问题可以被分解为最小问题,当满足基线条件时,递归就不再执行了
#2.递归条件
#将问题可以继续分解的条件
# #用递归的方式求任意数的阶乘
# 10!=10*9!
# 9!=9*8!
# 8!=8*7!
def fn(n):
#参数n是要求阶乘的数字
# 1.基线条件
if n==1:
#1的阶乘就是1 直接返回结果
return 1
# 2.递归条件
return n*fn(n-1)
print(fn(10))
3628800
首先寻找递归的基线条件,再总结出递归条件
#创建一个函数,来为任意数字做幂运算
#10**6=10*10**5
#10**5=10*10**4
#10**4=10*10**3
#10**3=10*10**2
# .....
# 10**1=10
def fn(n,i):
#参数n要做幂运算的数字,i是要做幂运算的次数
# 1.基线条件
if i==1:
return n
# 2.递归条件
# return n*n**i-1
return n * fn(n,i-1)
print(fn(5,5))
print(5**5)
3125
3125
#定义一个函数,用来检查一个任意字符是否是回文字符,如果是,返回TRUE,如果不是,返回false
#回文字符串,字符串从前往后念和从后往前念是一样的
#例如abcba
#abcdefgfedecba
#先检查第一个字符和最后一个字符是否是一致,如果不一致,就一定不是回文字符串
#如果一致,就要检查剩余的部分是否是回文字符串
#bcdefgfedcb是不是回文
#cdefgfedc
#defgfed
#efgfe
#fgf
#g
#字符串的长度小于2时,默认为时回文
def fn(s):
#参数s就是要检查的字符串
# 1.基线条件
# 字符串的长度小于2时,则字符串一定是回文
if len(s)<2:
return True
#第一个字符和最后一个字符不相同,则一定不是回文字符串
elif s[0]!=s[-1]:
return False
# 2.递归条件
return fn(s[1:-1])
print(fn("abcdefgfedcba")) #True
print(fn("python")) #False
6. 作业
汉诺塔游戏,现在有ABC三根柱子。要求:将A柱所有的圆盘放到C柱。在移动的过程中可以借助B柱。并且规定大圆盘不能放小圆盘上面,每次只能移动一个盘子。用递归的方式来解决汉诺塔问题
#如果只有一个盘子A--->c
#如果盘子大于等于2的情况下 我们总是可以看成是2个盘子,一个是最下面的盘子和最上面的一个或者是所有的饿盘子
# 先把最上面的盘子 从A放到B
# 把最下面的盘子从A放到C
# 把B柱上的盘子从B放到C
#定义一个函数解决汉诺塔问题
def hannuoTower(num,a,b,c):
#参数num代表的是盘子,a b c分别代表的是A柱 B柱 C柱
#第一个条件 基线条件
# 如果只有一个盘子A--->c
if num==1:
print("第一个盘子从A到C")
else:
# 第二个条件 递推条件
# nums>=2的情况
#先把最上面的盘子 从A放到B 借助C柱 num-1是除去最下面的那个盘子
hannuoTower(num-1,a,c,b)
# 把最下面的盘子从A放到C
print("第",num,"个盘子从",a,"到",c)
# 把B柱上的盘子从B放到C
hannuoTower(num-1,b,a,c)
# hannuoTower(1,"A","B","C") #验证一个盘子的时候,第一个盘子从A到C
hannuoTower(3,"A","B","C")
第一个盘子从A到C
第 2 个盘子从 A 到 B
第一个盘子从A到C
第 3 个盘子从 A 到 C
第一个盘子从A到C
第 2 个盘子从 B 到 C
第一个盘子从A到C