函数基础

函数就是一堆代码,然后使用的时候来调用这堆代码 不使用函数的缺点: 冗余,可读性差,维护性太差 把多行代码封装成一个整体(函数)

在python里面,使用关键字def 来声明一个函数

def 函数名(参数):
  函数要执行的操作

# 函数定义好了之后并不会自动执行,需要调用才会被执行

函数命名规范

  • 函数名也是一个标识符
  • 由数字、字符下划线组成,不能以数字开头,严格区分大小写,不能使用关键字
  • 遵守命名规范,使用下划线连接,顾名思义
def tell_story():
    print('春眠不觉晓')
    print('处处闻啼鸟')
    print('夜来风雨声')
    print('花落知多少')

tell_story()
  • 函数声明时,括号里的参数我们称之为形式参数,简称形参
  • 形参的值是不确定的,只是用来占位的
def hello(person1,person2):
    print(person1 + '对' + person2 + '说:"hello!"')
# 调用函数时传递数据
# 函数调用时传入的参数,才是真正参与运算的数据,我们称之为实参,

hello('张三',"李四")  # 会把实参一一对应的传递,交给形参处理

# 还可以通过定义变量名的形式给形参赋值
hello(person1="李四",person2="张三")

函数的返回值

函数的返回值就是函数执行的结果,并不是所有的函数都必须要有返回值

def add(a,b):
    c = a + b  # 变量c在外部是不可见的,只能在函数内部使用
    return c  # return 表示一个函数的执行结果

# 获取到add函数的结果,然后再求结果的4次方

result = add(1,2)
print(result ** 4)

# print 就是一个内置函数
x = print("hello")
print(x)  #None

函数的注释

def add(a,b):
    """
    这个函数用来将两个数字相加
    """
    return a + b 
print(add(1,3))

help(add)   # 

def add(a:int,b:int):   #函数不限制参数类型,只给参数建议类型 
    return a + b
z = add('hello','world' )
print(z)

函数调用函数

def test1():
    print('test1开始了')
    print('test1结束了')

def test2():
    print('test2开始了')
    test1()
    print('test2结束了')

test2()
  • 定义函数求[n,m]直接所有整数之和
def add(n,m):
    x = 0
    for i in range(n,m):
        x += i
    return x
result = add(0,101)
print(result)
  • 求一个N的阶乘
def fac(n):
    x = 1 
    for i in range(1,n+1):
        x *= i
    return x
print(fac(5))
  • 计算m阶乘的和 m = 6 ==> 1!+2!+3!+4!+5!+6!
# def fac_sum(m):
#     x = 0
#     y = 1
#     for i in range(1,m+1):
#         y *= i
#         x += y
#     return x
# print(fac_sum(5))

def fac_sum(m):
    x = 0
    for i in range(1,m+1):
        x += fac(i)
    return x
print(fac_sum(5))

默认参数的使用

def say_hello(name,age,city="北京"):   # 缺省参数要写到最后,形参xity设置了一个默认值
    print('大家好,我是{},我今年{}岁了,我来自{}'.format(name,age,city))

say_hello('jack',19) # 如果没有传递city的参数,使用默认值"北京"
say_hello(name = 'tony',age = 23)

# 如果有位置参数和关键字参数的话,关键字参数一定要放到位置参数的后面,
say_hello('jerry',age=24)    # jerry要写到前面,不然报错

# 有些函数的参数是,如果你传递了参数就使用传递的参数,如果没有传递参数,就使用默认的值

# print函数里end就是一个缺省参数,
print('hello world',end="---")
print('hi')

print('hello','nihao',sep="****")
print('hjiijjk')

可变参数的使用

# *args 表示可变位置参数 ,最低需要两个参数,**kwargs 表示可变的关键字参数
def add(a,b,*args):  
    print('a = {},b = {}'.format(a,b))
    print('args = {}'.format(args))  # 多出来的可变参数会以元组的形式保存到args里
    c = a + b
    for i in args:
        c += i
    return c
print(add(1,3,4,9,8,2))

def add(a,b,*args,mul = 1,**kwargs):
    print(kwargs)  #kwagrs是以字典的方式存放

add(1,2,3,4,5,c = 1,d = 2)

可变数据类型和不可变数据类型的传参

def test(a):
    a = 100

def demo(nums):
    nums[0] = 10

x = 1
test(x)
print(x)

y = [3,4,5,6,2]
demo(y)

print(y)

函数的注意事项

  • 函数的三要素: 函数名,参数和返回值
  • 在有一些编程语言里,允许函数重名,python里不允许函数的重名,如果函数重名了,后一个函数会覆盖前一个函数
  • python里函数名也可以理解成为一个变量名
# def test(x):  # test ==一个函数
#     print('good,x={}'.format(x))

# test = 5  # 重新赋值5给test了

# test(3)  # 5不能作为函数来调用
# TypeError: 'int' object is not callable

递归函数的使用

count = 0
def test():
    print('test')
    global count
    count += 1
    if count < 5:
        test()
test()
  • 求1~n的和
def get_num(n):
    if n == 0:
         return 0
    return get_num(n-1) + n

print(get_num(6))
  • 使用递归求n!
def fac(n):
    if n == 1:
        return 1
    return fac(n - 1) * n

print(fac(6))
  • 使用递归求斐波那契数列的第N个数字
def fib(n):
    
    if n ==2 or n == 1:
        return 1
    return fib(n-1) + fib(n -2)
print(fib(4))

匿名函数

# 用lambda 关键词可以创建一个小型匿名函数,省去使用def声明函数的操作
#lambda函数的语法只包含一个语句,如下:
# lambda 参数列表:运算表达式

def add(a,b):
    return a + b

x = add(4,5)
print(x)

fn = add  # 相当于给函数起了一个别名
print(fn(6,5))

# 除了使用def关键字定义一个函数外,还能使用lambda表达式定义一个函数

lambda a,b : a + b  #匿名函数,用来表达一个简单的函数,函数的调用次数很少,基本就是调用一次

# 调用匿名函数的两种方法:
# 给他定义一个名字,很少这样使用
#  把这个函数当做参数传给另一个函数来使用,这样的场景比较多

mul = lambda a,b : a + b 
print(mul(4,5))

def calc(a,b,fn):
    c = fn(a,b)
    return c

def add(x,y):
    return x +  y

def minus(x,y):
    return x - y

print(calc(5,6,add))

print(calc(10,5,minus))

x3 = calc(5,7,lambda x,y: x + y)
print(x3)

x3 = calc(5,7,lambda x,y: x * y)
print(x3)

x3 = calc(5,7,lambda x,y: x - y)
print(x3)

x3 = calc(5,7,lambda x,y: x / y)
print(x3)