- 一堆准备好的代码,在需要的时候可以调用这一堆代码
- 用重复的代码表示的缺点:冗余,可维护性差
- 因此,将多行代码打包成一个整体:函数
- 在Python中,用关键字 def 来声明一个函数
- 函数定义好之后并不会自动执行
- 需要使用 函数名(参数) 来调用
- 函数名也是一个标识符
- 由数字,字母,下划线组成,不能以数字开头,严格区分大小写;不能使用关键字
- 遵守命名规范,使用下划线连接;顾名思义:函数执行的逻辑,最好和函数的名字一致
函数的参数
- 函数在声明的时候,括号里的参数我们称之为形式参数,简称形参
- 形参的值是不确定的,只是用来占位的
- 通过调用函数的时候,可以传递形参
- 函数调用时候传入的参数,才是真正参与运算的数据,我们称之为实参
- 函数调用时候,会把实参一一对应传递给形参处理
- 也可以指定变量名,将实参传递给形参
函数的返回值
- 返回值就是函数的执行结果,但是并不是所有的函数都必须要有返回值
def add(a,b):c = a+b return c result = add(1,2)
print(result ** 4)
函数的文档说明
def add(a,b):"""a: 第一个参数b: 第二个参数该函数返回两个数字相加的结果"""return a+b
- 可以在编写函数的时候,在形参后面加上 :int 来指定希望传入的实参的类型
def add(a:int,b:str): pass
函数调用函数
- 在函数2中,可以直接调用函数1,当函数2被调用的时候,会根据函数1在函数2代码中的位置,对函数1进行调用,演示如下:
def function_1():print('函数1开始了')print('函数1结束了')def function_2():print('函数2开始了')print('开始调用函数1')function_1()print('函数1调用结束')print('函数2结束了')function_2()
def fac(n):x = 1for i in range(1,n+1):x *= ireturn xdef sum(m):x = 0for i in range(1,m+1):x += fac(i)return xprint(sum(5))
全局变量和局部变量
- Python可以用函数来分隔作用域
- 函数外部定义的变量是全局变量,在整个py文件中都可以访问
- 函数内部定义的变量是局部变量,它是局部函数,只能在函数内部使用
- 内置函数 globals() locals()可以打印函数中的全局变量和局部变量
a = 100
word = 'hello'def test():b = 80 a = 10 print(a)global wordword = 'thank'print(word)print('locals = {},globals = {}'.format(locals(),globals())) test()
print(a) print(word)
函数多个返回值
- return表示一个函数的结束
- 一般情况下,一个函数最多只会执行一个return语句
- 特殊情况下(finally语句),下一个函数可能会执行多个return语句
def test(a,b):x = a // by = a % breturn x,y print(test(12,5))
默认参数的使用
- 有些函数的参数,如果你传递了参数,就是用传递的参数,如果没有传递参数,就使用默认的值
print('hello',end = '')
print('你好')
- 如何设定形参的默认值:在定义函数的时候,在需要默认值的形参处,直接给形参一个值
- 如果没有传递参数,会使用默认值,如果传递参数,就使用传递的参数,如下
def say_hello(name,age,city='hangzhou'):print('大家好,我叫{},我今年{}岁了,我来自{}'.format(name,age,city))say_hello('lzh',18)
- 可以直接传递单个参数,也可以使用变量赋值的形式传参
- 如果有位置参数和关键字参数,关键字参数一定要放到位置参数的后面
def say_hello(name,age,city='hangzhou'):print('大家好,我叫{},我今年{}岁了,我来自{}'.format(name,age,city))say_hello(name ='lzh',city ='sichuan',age =18)
可变参数的使用
- 使用 *args 表示可变位置参数 --> 以元组的形式保存
- 使用 **kwargs 表示可变关键字参数 --> 以字典的形式保存
def add (a,b,*args): pass
add(1,4,65,7,8,43) def add(*args): passdef add(a,b,*args,mul=2): passdef add(a,b,*args,mul=2,**kwargs): pass
函数的注意事项
- 函数的三要素
- 有一些编程语言里,允许函数重名,在Python中不允许函数重名
- 如果函数重名了,后一个函数会覆盖前一个函数
- 在Python中,函数名也可以理解为一个变量名
- 因此定义函数时,不要和内置函数重名
- 递归简单的来说,就是函数内部自己调用自己
- 递归最重要的就是要找到出口(停止的条件)
x = 0
def get_sum(n):global xx += nn -= 1if n >= 1:get_sum(n)return xprint(get_sum(100))
def get_sum2(n):if n == 0:return nreturn n + get_sum2(n-1)print(get_sum2(100))
def get_num(n):if n == 0:return 1 return n * get_num(n-1)print(get_num(0))
def get_fi(n):if n == 2 or n == 1:return 1return get_fi(n-2) + get_fi(n-1)print(get_fi(8))
匿名函数
def add(a,b):return a+bx = add(1,2) fn = add
- 使用关键字 lambda 可以用来定义一个函数
- 匿名函数,用来表达一个简单的函数
- 如何调用一个匿名函数:
- 第一种:给他定义一个名字(很少这样使用)
- 第二种:把这个函数当做参数传给另一个函数使用
lambda a,b: a+b
fn2 = lambda a,b: a+b def calc(a,b,fn):c= fn(a,b)return cx3 = calc(1,3,lambda x,y: x+y)
print(x3)
sort方法的使用
students = [{'name':'zhoujielun','age':18,'sorce':97,'height':180},{'name':'linjunjie','age':22,'sorce':65,'height':177},{'name':'caiyilin','age':20,'sorce':88,'height':185}
]
students.sort(key= lambda ele:ele['height'])
print(students)
filter map reduce内置类的使用
- filter 可以对可迭代对象进行过滤,得到的是一个filter对象
- 在Python2中,是一个内置函数,在Python3中,修改成了一个内置类
x = filter(lambda a: a%2 == 0,range(1,10))
print(x)
print(list(x))
for i in x:print(i,end='')
ages = [10,11,25,16,8,14,46,547]m = map(lambda a: a+2,ages)
for x in m:print(x,end=' ')
from functools import reduce
def foo(x,y):return x + y scores = [100,154,1564,4684]print(reduce(foo,scores))
from functools import reducestudents = [{'name':'zhoujielun','age':18,'sorce':97,'height':180},{'name':'linjunjie','age':22,'sorce':65,'height':177},{'name':'caiyilin','age':20,'sorce':88,'height':185}
]
print(reduce(lambda x1,x2:x1+x2,map(lambda a: a['age'],students)))
print(reduce(lambda x1,x2:x1+x2['age'],students,0))