函数
什么是函数?
function 英文 -> 函数,功能
函数就是一个具有特定功能的语法结构。(代码块/组)
作用:提高代码的复用率,提高开发效率,减少后期的维护成本
定义函数
【基本结构】:
def 函数名():
实现函数功能的代码
实现函数功能的代码
实现函数功能的代码
...
函数的调用可以在任何位置进行调用,但要注意格式规范
特征:
1.函数不调用不会执行
2.函数可以调用N次不受次数限制
函数名的定义:
1.推荐使用英文,可以使用拼音,不可以使用汉字
2.可以使用数字,但是不能以数字开头
3.不可以使用特殊字符,除了下划线_
4.函数名严格区分大小写
5.函数命名要有意义
6.函数名不能和系统保留关键字冲突
7.函数名尽量不要和系统已存在的内建函数同名,以免覆盖内建函数
函数的参数
详细分析参数
(1)函数参数概念及分类
函数参数:调用时需要传递的数据.
函数参数大类分为形参和实参:
形参意思: 函数定义时的参数
实参意思: 函数调用时的参数
形实关系:函数调用时,形参和实参个数需要一一对应
如下图所示:
形参种类: 普通参数,默认参数,普通收集参数,命名关键字参数,关键字收集参数
实参种类: 普通实参,关键字实参
(2)普通参数(位置参数)普通的参数,接收实参传递的值
(3)默认参数:位于普通参数后面,具有默认值的参数
语法:(x,y=2) y就是默认参数
(4)收集参数:
普通收集参数:用于专门收集多余普通参数的是普通收集参数,形成一个新的元组
语法:参数前面加*例:args
关键字收集参数:用于专门收集多余关键字实参的是关键字收集参数,形成一个新的字典
语法:参数前面加**例:**kwargs
(5)命名关键字参数:定义时放在号后面的参数,调用时强制必须传入指定参数名才能调用
语法:(a,,x) x是命名关键字参数
如果函数参数中已经有了收集参数,那么收集参数后面的参数即为命名关键字参数
语法:(args,x,y)
(6)形参声明的位置顺序:
普通参数 -> 默认参数 -> 收集参数 -> 命名关键字参数 -> 关键字收集参数
def func(a,b,c=1,args,d,**kw)
a,b为普通参数,c是默认参数,args是收集参数,d是命名关键字参数,kw是关键字收集参数
极少出现五种参数同时出现的情况
def func(a,b=2,,c,d,**kw)
a为普通参数,b是默认参数,c,d是命名关键字参数 ,kw是关键字收集参数
(7)注意:实参将值传递给形参的过程,本质上就是变量赋值操作
所有参数的摆放问题
1.实参:普通实参在前,关键字参数在后
2.形参:
关键字收集参数一定在最后出现
收集参数推荐在普通参数之后使用
推荐顺序:普通形参,收集参数,关键字收集参数
函数文档
1.使用help函数查看
help(函数名)
2.函数名.__doc__
print(函数名.__doc__)
函数的返回值
函数执行完毕之后可以得到一个结果,该结果可以被接受或者使用
函数划分为两大类:
执行过程函数:函数执行之后没有任何结果可以在函数之外接收到(没有return语句的函数)
具有返回值的函数:函数执行之后可以返回一个结果到函数之外被接收或者使用(具有return语句)
return:返回的意思
执行过程函数:送外卖的,把外卖送给客户,结束了(送外卖是过程,送完之后没得到任何东西)
具有返回值的函数:送外卖,把外卖送给客户,结束了得到了钱(送外卖是过程,送完之后得到了钱)
return的另外一个作用:
终止函数执行,函数运行过程中一旦执行了return语句,那么函数就会结束执行。
id() 具有返回值的函数
type() 具有返回值的函数
int() 具有返回值的函数
....
print() 执行过程函数 没有返回值 只有一个None值 (None表示没有值)
变量的作用域
变量名不能和系统保留关键字冲突
import keyword
print(keyword.kwlist) # 查询系统保留关键字
变量的作用域:变量的有效范围
分类:
全局变量:在函数内外都有效的变量就是全局变量(使用global关键字声明)
局部变量:仅仅在函数内部有效的变量就是局部变量
手术麻醉:
全身麻醉:相当于全局变量
局部麻醉:相当于局部变量
全局变量(特征):
1.在函数外部可以正常访问
2.在函数内部也可以正常访问
局部变量(特征):
1.在函数外部不可以访问
2.在函数内部可以访问
locals() 获取当前作用域的变量(在局部中,是获取locals()之前的所有变量)
globals() 获取当前位置的全部全局变量。
pritn(locals())
print(globals())
将局部变量提升为全局变量:
在函数内部使用global关键字可以将局部变量提升为全局变量。
真正的全局变量:
使用global关键字对全局变量进行声明才可以在函数内部任意操作,否则在函数内部只能访问,而不能修改
变量作用域链:
变量的有效范围可以向函数内部层层传递
如果其他的函数内部没有使用global,可以访问变量
如果其他的函数中使用gloabl,可以进行任何操作
nonlocal是在Python3.2之后引入的一个关键字,它是用在封装函数中的。
nonlocal 适用于在局部函数中的局部函数, 把内层的局部变量设置成上一个外层局部可用,但是还不是全局的。他与global可以混合使用,下面的代码示例可以分出global与nonlocal区别
def scope_test():
def do_local():
spam = "局部变量" #1
def do_nonlocal():
nonlocal spam #使用外层的spam变量
spam = "nonlocal 变量" #2
def do_global():
global spam
spam = "global 变量" #3
spam = "test spam"
do_local()
print("本地分配后:", spam)
do_nonlocal()
print("nonlocal分配后:",spam)
do_global()
print("global分配后:",spam)
scope_test()
print("全局范围:",spam)
递归函数
在当前函数当中调用当前函数本身的函数就是递归函数。
递归的运行特性:先进后出
闭包
闭包的定义:
内函数使用外函数的局部变量,并且外函数将内函数返回出来的方法叫闭包,
返回的内函数叫 闭包函数.
闭包的特点:
外函数的临时变量会在将来的内部函数中用到,
自己调用结束后会把外函数的临时变量与内函数绑定,不释放
将来调用内函数的时候仍可使用外函数变量.
闭包的意义:
闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问.
迭代器
迭代器:能被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator 迭代器是对象)
特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
惰性序列:没有一次性的把所有数据都放在序列中,而是遍历一个放一个,这样的序列
检测:
from collections import Iterable,Iterator
--Iterable可迭代的 Iterator迭代器
isinstance() 判断数据类型,返回bool值
list1 = [1,2,3,4,5]
result = isinstance(list1,list)
print(result)
iter(Iterable)
功能:使用iter可以把可迭代数据变成迭代器
参数:Iterable(可迭代对象)
返回值:迭代器
zip(Iterable,Iterable,...)
功能:从参数中的多个可迭代对象取元素组合成一个新的迭代器,迭代器的组成元素是元组.
参数:Iterable(可迭代对象)
返回值:返回一个zip对象(迭代器),其内部元素为元组
*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。
表达式:
表达式是指变量和操作符(或叫运算符)的组合。
Python代码由表达式和语句组成,并由Python解释器负责执行。它们的主要区别是表达式的结果一定是一个值,而语句表示的是一个动作,而不是生成或者返回一个值(如调用,for,else,pass,break,continue,def,import,from等)。
lambda表达式
是函数的另外一种表示方式而已。本质上还是一个函数
变形金刚:人型状态:函数 (功能丰富)
汽车状态:lambda表达式(功能简单)
格式:变量名 = lambda 参数,参数... : 返回值
def getsum(no1,no2):
result = no1 + no2
return result
getsum2 = lambda no1,no2 : no1 + no2 #lambda表达式自带return
注意:
lambda表达式功能比较单一,只能实现简单的数据运算或者判断,无法使用循环或者复杂的操作所以lambda常用于数据过滤
带有分支的格式:
变量名 = lambda 参数,参数.. : 真值 if 条件表达式 else 假值
def getsex(sex):
#检测性别返回单词
if sex == '男':
return 'man'
else:
return 'woman'
内建函数
内建函数:系统启动python的时候就加载并且可以使用的函数。
类型转换相关:
int() 将其他数据类型转换为整型
float() 将其他数据类型转换为浮点型
bool() 将其他数据类型转换为布尔值
complex() 将其他数据类型转换为复数
list() 创建空列表,或者将其他数据类型转换为列表
tuple() 创建空元组,或者将其他数据类型转换为元组
dict() 创建空字典,或者将其他数据类型转换为字典
str() 将其他数据类型转换为字符串
变量相关函数:
id() 获取数据的id标识
type() 获取数据的类型字符串
print() 打印护具
locals() 打印当前环境中的所有变量,常用于检测某个变量是否声明,结果是字典
数学相关的函数:
abs() 获取一个数据的绝对值
变量 = abs(数据)
sum() 计算一个容器的数据的和
变量 = sum(容器)
max() 获取容器数据的最大值
格式1:
变量 = max(容器数据)
格式2:
变量 = max(数据1,数据2....)
min() 获取容器数据的最小值
格式1:
变量 = min(容器数据)
格式2:
变量 = min(数据1,数据2....)
pow() 计算一个数值的N次方
变量 = pow(底数,次方数)
round() 对一个数值进行四舍五入操作
变量 = round(数值)
注意:round函数操作时,如果是N.5的数值,采取N奇数进一,N偶数舍弃的操作
range() 产生一个连续数据的生成器
格式1:产生从0到指定数据之间的所有连续整数,不包含结束值
变量 = range(结束值)
格式2:产生从开始值到结束值之间的所有连续整数,不包含结束值
变量 = range(开始值,结束值)
格式3:产生从开始值到结束值之间的所有整数,使用跳步值增加的整数(跳步值默认为1)
变量 = range(开始值,结束值,跳步值)
进制转换函数:
bin() 将数值转换为2进制字符串
变量 = bin(数值)
oct() 将数值转换为8进制字符串
变量 = oct(数值)
hex() 将数值转换为16进制字符串
变量 = hex(数值)
ascii码转换相关(了解):
A-Z 65-90
a-z 97-122
0-9 48-57
chr() 将ascii编码转换为字符
变量 = chr(ascii码数值)
range(0,1114111)
ord() 将字符转换为其对应的ascii码
变量 = ord(字符)
其他内建函数:
input() 接受用户输入的信息 ,接受的结果为字符串
格式:变量 = input('提示信息')
高阶函数
高阶函数:能够把函数当成参数传递的就是高阶函数 (sorted map reduce filter )
sorted(iterable,reverse=False,key=函数)
功能: 排序
运行原理:把可迭代数据里面的数据,一个一个拿到函数里面进行处理,按照return的结果进行排序,得到一个新的列表
参数:
iterable:可迭代数据(容器类型数据,range对象,迭代器)
reverse(可选) :是否反转 默认False 不反转 , True 反转
key(可选) :函数 自定义 或 内置函数
返回值:排序后的结果(新的列表)
map(func,iterable)
map() 函数是python内置的高阶函数,对传入的可迭代对象里的每一个元素进行处理,返回一个新的处理之后的迭代器
功能: 把可迭代数据里面的数据,一个一个拿到函数里面进行处理,得到一个迭代器并返回。
参数: func 函数
iterable 可迭代的数据(容器类型数据,range对象,迭代器)
返回值: 迭代器
reduce(func,iterable)
reduce() 函数在 python 2 是内置函数, 从python 3 开始移到了 functools 模块。
使用方法:from functools import reduce
功能:
一次性从iterable拿出两个值,扔到func里面做运算,得出一个计算结果
然后,把这个计算结果和iterable里面的第三个数据,继续扔到func里面做运算,以此类推
即:不停地从iterable里面拿数据,直到运算结束为止
参数:
func : 内置函数 或 自定义函数
iterable:可迭代的数据 (容器类型数据,range对象,迭代器)
返回值: 最终的结果
filter(func, iterable)
功能: 过滤数据 (return True 保留数据,return False 舍去数据)
接收两个参数,第一个为函数,第二个为可迭代对象,可迭代对象的每个元素作为参数传递给函数进行判断,
然后返回 True 或 False,最后将返回 True 的元素放到迭代器中。
参数:
func : 判断函数
iterable: 可迭代的数据(容器类型数据,range对象,迭代器)
返回值:
迭代器