6. python 函数

0## 函数上

函数简介

  • 函数也是一个对象。
  • 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用
1. 语法
2. def 函数名([形参1,形参2,形参3.....]):
3. 		代码块

注意:
函数名必须符合标识符的规范(可以含字母,数字,下划线但是不能以数字开头)
print是函数对象 print() 是调用函数

函数的参数

形参和实参

  • 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值。
  • 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将赋值给对应的形参,简单来说有几个形参就有几个实参。

函数的传递方式

  • 定义形参时,可以为形参指定默认值。指定了默认值之后,如果用户传递了参数则默认不会生效。如果用户没有传递,则默认值就会生效。
  • 位置参数:关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递。
  • 混合使用位置参数和关键参数的时候必须将位置参数写到关键字参数的前面去。

不定长参数

  • 定义函数时,可以在形参前面加个* ,这样这个形参可以获取到所有的实参,他会将所有的保存到一个元组里。
  • 带 * 号的形参只能有一个,可以和其他参数配合使用
  • ’ * ’ 号形参只能接受位置参数,不能接受关键字参数。
  • ** 形参可以接受其他的关键字参数,它将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值。
  • **形参只能有一个,并且必须写在所有参数的后面。

参数的解包

  • 传递实参时,也可以在序列的类型的参数前面添加星号,这样它将自动的将序列中元素依次作为参数传递。
  • 要求序列中的元素的个数必须和形参的个数一致。

函数中

函数的返回值

  • 返回值就是函数执行以后的返回结果。
  • 通过return来指定函数的返回值。
  • return后面可以跟任意对象,返回值甚至可以是一个函数。

文档字符串

  • help()是python中的内置函数,可以通过help()函数可以查询python中函数的用法,
  • 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是函数的说明。

函数的作用域

  • 作用域(scope)
  • 作用域指的是变量生效的区域
  • 在python中一共有2种作用域
    • 全局作用域(scope)
    • 全局作用域在程序执行时创建,在程序结束时销毁。
    • 所有函数以外的区域都是全局作用域。
    • 在全局作用域中定义的变量,都是全局变量,全局变量可以在全局的任意位置进行访问。
    • 函数作用域。
    • 函数作用域在函数调用时创建,在调用结束时销毁。
    • 函数每调用一次就会产生一个新的函数作用域。
    • 在函数作用域中定义的函数变量,都是局部变量,它只能在函数内部被访问。

命名空间

  • 命名空间实际就是一个字典,是一个专门来存储变量的字典。
  • locals()用来获取当前作用域的命名空间。
  • 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数的作用域中调用;locals()则获取函数命名空间。
  • 返回值是一个字典。

函数递归

  • 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题。
  • 递归式函数有2个条件
    • 基线条件,问题可以分解为最小问题,当满足基线条件时,递归就不执行了。
    • 递归条件,可以将问题继续分解的条件。
# 求取10的阶乘

# 1!= 1
# 2!= 1*2
# 3!= 1*2*3
# n = 1
# for i in range(1, 11):
#     n *= i
# print(n)

# def fun(n):
#     r = 1
#     for i in range(1, n+1):
#         r *= i
#     return r
#
# print(fun(10))

# 递归函数简单理解就是自己引用自己:递归函数就是在函数中自己调用自己

# 无穷递归
# def fun():
# #     fun()
# #
# # fun()


# 递归的两个条件:
# ① 基线条件:问题可以被分解最小的问题,当满足基线条件的时候,再去解决问题
# ② 递归条件  将问题继续分解的条件
# 10!= 10*9!  n! = n*(n-1)! =>fun(n)=n*fun(n-1) (递归条件)
# 9! = 9*8!
# 1! = 1   (基线条件)

def fun(n):  # fun(n) 是为了求取n的阶乘
    if n == 1:
       return 1
    return n*fun(n-1) # (递归条件)

print(fun(10))


# def fun(n):  # fun(n) 是为了求取n的阶乘
#     if n == 1:
#        return 1
#     r = n*fun(n-1) # (递归条件)  # 这样会报错

# print(fun(10)) # 10*9*8......2*fun(1)=>2*1 也就是fun(10)结果
相应运行结果:
3628800

函数下

高阶函数

  • 接受函数作为参数,或者将函数作为返回值返回的函数就是高阶函数。
def fun2(i):
    if  i % 2 == 0:
        return True

def fun(fn):
    list1 = []
    for i in range(101):
        if fn(i):
            list1.append(i)
    return list1


print(fun(fun2))
相应运行结果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]

闭包

  • 将函数作为返回值也是高阶函数我们也称为闭包。
  • 闭包的好处
    – 通过闭包可以创建一些只有当前函数能访问的变量。
    – 可以将一些私有数据藏在闭包中。
  • 行成闭包的条件
    – 函数嵌套。
    – 将内部函数作为返回值返回。
    – 内部函数必须要使用到外部函数的变量。

装饰器的引入

  • 我们可以通过修改函数中的代码来完成需求,但是会产生以下一些问题。
    – 如果修改的函数多,修改起来会比较麻烦。
    – 不方便后期的维护。
    – 这样做会违反开闭原则(ocp)
    • 程序的设计,要求开发对程序的扩展,要关闭对程序的修改。

装饰器的使用

  • 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展。
  • 在开发中,我们都是通过装饰器来扩展函数的功能的。

练习

  1. 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
    • 控制姓名长度为6-20
    • 电话号码长度11
    • 性别只能允许输入男或女
    • 每一样信息不允许为空
while True:

    name = input('输入姓名:')
    if 6 <= len(name) <= 20 :
        while True:
            Telephone_number = input('输入电话号码:')
            if len(Telephone_number) == 11:

                while True:
                    gender = input('输入性别')
                    if gender == '男' or gender == '女':
                        print('姓名:', name, '\n手机号码:',  Telephone_number, '\n性别:', gender)
                        exit()
                    else:
                        print('输入错误,请输入男或女')

        else:
            print('输入错误,请输入长度为11的号码')
    else:
        print('输入错误,请输入长度6-20的姓名')

  1. 使用函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21…即: 起始两项均为1,此后的项分别为前两项之和
def Fibonacci_list(a):
    list1 = [1, 1]
    b = 1
    c = 1
    for i in range(0, a-2):
        d = b + c
        b = c
        c = d

        list1.append(d)
    print(list1)
    print('总共', len(list1), '个数字')
Fibonacci_list(20)

  1. 编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def lnteger_addition(a):
    b = 0
    for i in range(a+1):
        b += i
        print(b)



lnteger_addition(100)
  1. 用函数实现一个判断用户输入的年份是否是闰年的程序
    1.能被400整除的年份
    2.能被4整除,但是不能被100整除的年份
    以上2种方法满足一种即为闰年
a = int(input('请输入一个年份:'))
def year():
    if a % 4 == 0 and a / 100 != 0:
        print('你输入的年份是闰年')
    elif a % 400 == 0:
        print('你输入的年份是闰年')
    else:
        print('你输入的年份不是闰年')
year()
  1. 猴子吃桃子问题(递归):猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃一个。第二天又将剩下的桃子吃掉一半,又多吃一个。以后每天都吃了前一天剩下的一半零一个。到了第10天早上在吃时,只见剩下一个桃子了,求第一天共摘了多少个桃子?
def fun(a, b):
    if a == 1:
        return b
    else:
        return (fun(a-1, b)+1)*2


print(fun(10, 1))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值