python中函数的介绍


文章目录

  • python中函数的介绍
  • 一、函数的返回值
  • 二、文档字符串
  • 1、在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
  • 2、help()是Python中内置函数,通过help()函数可以查询Python中函数的用法
  • 三、函数的作用域
  • 1、作用域(scope)
  • 四、命名空间
  • 五、递归函数
  • 六、作业
  • 1、用函数实现一个判断用户输入的年份是否是闰年的程序
  • 2、 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?


一、函数的返回值

- 返回值就是函数执行以后返回的结果
- 通过return来指定函数的返回值
- return后面可以跟任意对象,返回值甚至可以是一个函数
def fun(*args):
    res = 0
    for i in args:
        res += i
    return res, 1, res-1, i


result = fun(1, 2, 3, 4, 5)
print(result)  # (15, 1, 14, 5)

二、文档字符串

  • 文档字符串,运用于对函数或者面向对象做功能、参数等的说明帮助文档。

1、在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明

def fun(a, b):
    """
    文档字符串示例
    这和函数的功能是......

    :param a: 作用 功能  类型  默认值 
    :param b: 作用 功能  类型  默认值 
    :return:  需要
    """

2、help()是Python中内置函数,通过help()函数可以查询Python中函数的用法

help(print)
# 运行结果: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.

三、函数的作用域

1、作用域(scope)

- 作用域指的是变量生效的区域
- 在Python中一共有两种作用域
- 全局作用域	
	- 全局作用域在程序执行时创建,在程序执行结束时销毁
	- 所有函数以外的区域都是全局作用域
	- 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
a = 1


def fun():
    pass


b = 1
# 这一段代码中的a,b为全局作用域
- 函数作用域
	- 函数作用域在函数调用时创建,在调用结束时销毁
	- 函数每调用一次就会产生一个新的函数作用域
	- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
b = 456


def fun1():
    a = 123

    print('函数内部', a)
    print('函数内部', b)


fun1()

print('函数外部', b)  # 打印结果 函数内部 123 函数内部 456 函数外部 456
print('函数外部', a)  # 会报错,因为a为局部作用域,函数外面访问不到


def fun2():
    global a  # global :声明 :a为全局变量  
    a = 20

    def fun3():
        print('fun3里面', a)

    fun3()


fun2()
print(a)  # 打印结果:fun3里面 20  20

四、命名空间

- 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
- locals()用来获取当前作用域的命名空间
a = 1
b = 2
c = 3
d = 4
print(locals())
# 打印结果为:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001EBA877B160>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/niezeyu/基础班/函数二/函数的命名空间.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'd': 4}
  • 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间
  • 返回值是一个字典
def fun():
    print(locals())


fun()  # {}创建一个空字典


def fun1():
    e = 5
    print(locals())


fun1()  # {'e': 5}

五、递归函数

- 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
- 递归式函数有2个条件
	- 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
	- 递归条件 可以将问题继续分解的条件
# 实现10的阶乘
# 方法1
print(1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10)
# 方法2
n = 10
for i in range(1, 10):
    n *= i
print(n)


# 方法3


def fun(x):
    for i in range(1, x):
        x *= i
    return x


fun(10)
print(fun(10))
# 方法4:用递归函数来实现


def fun1(x):
    if x == 1:
        return 1
    return x * fun1(x - 1)


print(fun1(10))
  • 递归函数的练习
# 实现n的m次幂


def fun(n, m):
    if m == 1:
        return n
    return n * fun(n, m - 1)


print(fun(10, 5))

六、作业

1、用函数实现一个判断用户输入的年份是否是闰年的程序

  • 1.能被400整除的年份
  • 2.能被4整除,但是不能被100整除的年份
  • 以上2种方法满足一种即为闰年
def fun(mon):
    """
    判断输入的年份是否为闰年
    :param mon: 默认参数 
    :return: 不需要
    """
    if mon % 400 == 0:
        print(f'{mon}为闰年')
    elif mon % 4 == 0 and mon % 100 != 0:
        print(f'{mon}为闰年')
    else:
        print(f'{mon}不是闰年')


while True:
    mon = input('请输入年份:')
    if mon.isdigit() == True:
        mon = int(mon)
        fun(mon)
    else:
        print('输入错误,请重新输入!')

2、 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?

def fun(n):
    if n == 1:
        return 1
    return (fun(n-1)+1)*2

print(fun(10))