[Python][华为云Python编程创造营][学习笔记][05_Python的函数]
1,函数是什么
1.1,数学中的函数
- 数学中的函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。
1.2,编程语言中的函数
- 在程序中,函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。
- 函数能提高应用的模块性,和代码的重复利用率。
2,Python中的函数
2.1,Python中的函数可以分为几个类型:
- 内建函数:比如基础函数print、input等;高阶函数map、reduce等。
- 用户自定义函数,通过def、lambda关键字构造的函数。
- 第三方工具包中的函数。
2.2,组成函数的零件
2.3,定义函数的关键字
- 在Python中用关键字def声明函数,后面跟函数名和小括号,括号内可以放置所需参数。def定义的函数,是我们平常所说的函数,也是比较常用的。
- 使用lambda定义的函数,被称之为匿名函数。较为简洁,用于一些小功能场景。
2.4,函数名-就像是方程的代号
- 函数名是用来标识一个函数的标识符,其起名的规则和标识符的命名规则是一样的。
- 好的函数名可以直观的理解函数的功能,起名方式可以遵循标识符的起名方法。
- 函数调用时通过函数名进行使用。
2.5,说明文档-就像是工具的说明书
def add(a, b):
"""
用于计算两个数字之和
param a:数值类型
param b:数值类型
return 两个数字之和
"""
return a+b
help(add)
# 输出效果
# add(a, b)
# 用于计算两个数字之和
# param a:数值类型
# param b:数值类型
# return 两个数字之和
2.6,参数-就像是方程中的X
- 形参:形式参数,没有实体,在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数实参。
- 实参:实际参数,在代用函数时传入的数据;可以是常量、变量、表达式、函数等。
def function(param): # 此处为形参
'''说明文档'''
pass
function(1) # 实参
2.7,返回值-就像是方程计算的结果
- return,返回函数计算的结果,可以是具体的值、公式、函数等。
返回值并不是必须的,如果函数中没有return(没有返回值),则默认返回None。
返回值可以是多个,即:return a b c(实际上会被当作一个元组返回)
- return标志着一个函数的结束。
l = [1, 2, 3, 4]
print(l.append(5)) # 输出None,即append没有返回值
print(l.pop(2)) # 输出3,返回删除的对象
2.8,函数体-就像是方程中的计算过程
- 函数体是函数实现功能的主要部分。
- 函数体部分要进行缩进。
- 是对某种功能代码的实现。
- pass:占位符,没有实际意义。
- 函数体中可以继续定义函数。
2.8.1,函数中的参数的类型可以分为以下几种:
- 必备参数:必备参数须以正确的顺序传入函数,调用时的数量必须和声明时的一样。
function(a,b)
- 关键字参数:函数调用时使用等号赋值的形式传入参数。
function(a=1,b=2)
- 默认参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
def function(a=1,b=2):
pass
function() # 此时使用,没有传入参数,默认a=1,b=2
- 不定长参数:有时可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数,声明时不会命名。
*args,**kwargs:加了星号(*)的变量args会存放所有未命名的变量参数,args为元组,
而加了(**)的变量kwargs会存放命名参数,即形如key=value的参数,kwargs为字典。
def function(*args):
pass
function(1,2,3,4,5)
参数的位置:def func(必备参数,关键字参数,默认参数,不定长参数)。
2.9,变量重名-就像和名人重名了
name="吴彦祖"
def func():
name="小吴"
print("有人喊你,%s"%(name))
func() # 喊的是谁?小吴
- 这段代码会显示什么结果?下面这段呢?
name="吴彦祖"
def func():
name="小吴"
print("有人喊你,%s"%(name)) # 小吴
func()
print("有人喊你,%s"%(name)) # 吴彦祖
- 变量可分为全局变量和局部变量
定义在脚本中的变量(吴彦祖)为全局变量(脚本中都可以使用)。
定义在函数、类内部的变量为局部变量(离开函数后就不能再使用了)。
如果变量重名,在函数内部优先使用局部变量。
- 当函数中要使用的变量就是全局变量时,可以通过关键字global使用。
name="吴彦祖"
def func():
global name
print("我就是,%s"%(name)) # 吴彦祖
func()
print("我就是,%s"%(name)) # 吴彦祖
- 可变数据对于函数的影响
l = [1, 2]
def func():
l.append(5)
func()
print(l) # [1, 2, 5]
3.0,匿名函数
- Python中提供了lambda来创建匿名函数。相比于普通函数而言,匿名函数有以下特点:
lambda只是一个表达式,函数体比def简单很多。
lambda不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 定义匿名函数:
#lambda 参数:函数体
lambda x:x+1
- 匿名函数的优势
- 让代码更简洁,例如:
实现功能,输出x的平方、三次方、四次方
def f1(x):
return x**2
def f2(x):
return x**3
def f3(x):
return x**4
l=[f1,f2,f3]
x=3
for f in l:
print(f(x))
x=3
l = [lambda x:x**2,lambda x:x**3,lambda x:x**4]
for i in l:
print(i(x))
3,Python函数的特点
3.1,Python函数的小特点
- 函数本身可以作为参数和返回值。
- Python程序的执行过程:
自上而下。
函数体在调用时才会被执行。
3.2,函数式编程
- 函数就是面向过程的程序设计的基本单元。
- 函数式编程思想更接近数学计算。
- 函数式编程就是一种抽象程度很高的编程范式。
- 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
- Python对函数式编程提供部分支持。
3.3,思考一下
- 结合Python函数的特点,以下输出结果是多少?
def func():
temp=[lambda x:x*i for i in range(4)]
return temp
for i in func():
print(i(3)) # 9 9 9 9
4,高阶函数
4.1,高阶函数(1)
- 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就是高阶函数。
- 高阶函数有以下特点:
变量可以指向函数。
可以传入函数。
4.2,高阶函数(2)
- 高阶函数中变量可以指向函数。
- 要获得函数调用结果,我们可以把结果赋值给变量。
例如:x = abs(-10) => x = 10
- 函数本身也可以赋值给变量,即:变量可以指向函数。
例如:f = abs => f(-10) = 10
4.3,高阶函数(3)
- 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数。
- 一个最简单的高阶函数:
def add(x,y,f):
return f(x)+f(y)
- 以下输出结果是?
def add(x,y,f):
return f(x)+f(y)
print(add(-5,6,abs)) # 11
4.4,map函数
- Python内建了map()函数。
- map()函数接收两个参数,一个是函数,一个是Iterable对象,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
- 比如我们有一个函数f(x)=x^2,要把这个函数作用在一个list[1,2,3,4,5,6,7,8,9]上,就可以用map()实现如下:
def f(x):
return x*x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(r)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
4.5,reduce函数
- reduce把一个函数作用在一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
- 把序列[1,3,5,7,9]变换成整数13579,reduce就可以派上用场:
from functools import reduce
def fn(x,y):
return x*10+y
print(reduce(fn,[1,3,5,7,9])) # 13579
4.6,filter函数
- Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。
- 和map()不同的是,filter()把传入的函数依次用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
- 利用filter把序列中的空字符串删除:
def not_empty(s):
return s
result=list(filter(not_empty,['a','b',None,'c','']))
print(result) # ['a', 'b', 'c']
4.7,sorted函数
- 排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。
- 比较的过程必须通过函数抽象出来。Python内置的sorted()函数就可以对list进行排序。
- sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序。
- 对字符串排序,是按照ASCII的大小比较的。
print(sorted(['bob','about','zoo','credit'],key=str.lower)) # ['about', 'bob', 'credit', 'zoo']
- 点赞
- 收藏
- 关注作者
评论(0)