python 基础学习-11-函数二

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值