第九讲:函数下

在这里插入图片描述

一. 函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值