Python-函数
函数基础
函数定义:
def 函数名(参数列表):
代码块
函数调用: 函数()
函数说明文档: 函数内容的第一行可以用字符串进行函数说明
函数参数
传参
必选参数
在调用函数的时候必选参数是必须要赋值的
def sum(a,b): #形式参数:只是意义上的一种参数,在定义的时候是不占内存地址的
sum=a+b
print(sum)
pass
#函数调用
sum(20,15) #20,15 实际参数:实参,实实在在的参数,是实际占用内存地址的
默认参数[缺省参数]
始终存在于参数列表中的尾部
def sum(a=20,b=15):
sum=a+b
print(sum)
pass
#函数调用
sum() #在调用的时候如果未赋值,就会用定义函数时给定的默认值
可选参数
当参数的个数不确定时使用
def getComputer(*args):
'''
计算累加和
:param args: 可变长的参数类型
:return:
'''
# print(args)
result = 0
for item in args:
result += item
pass
print('result=%d'%result)
pass
getComputer(1) #(1,)
getComputer(1,2) #(1, 2)
关键字参数
在函数体内,参数关键字是一个字典类型,key是一个字符串
def keyFunc(**kwargs):
print(kwargs)
pass
dictA = {"name":'Leo',"age":35}
keyFunc(**dictA) #{'name': 'Leo', 'age': 35}
keyFunc(name='Leo',age=35,) #{'name': 'Leo', 'age': 35}
可选参数必须放到关键字参数之前
可选参数:接受的数据是一个元组类型
关键字参数:接受的数据是一个字典类型
def complexFunc(*args,**kwargs):
print(args)
print(kwargs)
pass
complexFunc(1,2,3,4,name='Xena')
#(1, 2, 3, 4)
#{'name': 'Xena'}
函数返回值
概念: 函数执行完以后会返回一个对象,如果在函数的内部有return
,就可以返回实际的值,否则返回None
类型: 可以返回任意类型,返回值类型应该取决于return
后面的类型
用途: 给调用方返回数据
一个函数体内可以出现多个return
值,但是肯定只能返回一个return
如果在一个函数体内执行了return
,意味着函数就执行完成退出了,return
如果函数需要返回多个结果,将要返回的值用逗号隔开,最终会返回一个包含所有返回值的元组
函数嵌套调用
函数可以嵌套调用,即在一个函数内部调用另外一个函数。
内层函数可以访问外层函数中定义的变量,但不能重新赋值。
局部变量与全局变量
局部变量
在函数内部定义的变量,函数内部的变量名如果第一次数显,且出现在=
之前,即被视为该函数定义了一个局部变量,不管是全局域中有没有用到该变量名,函数中使用的将是局部变量。
不同的函数可以定义相同名字的局部变量,但是每个函数内部不会产生影响。
局部变量的作用,是为了临时保存数据,需要在函数中定义变量来进行存储。
全局变量
如果一个变量可以在函数内部调用,也可以在函数外部调用,那么这个变量就称为全局变量。
全局变量能在函数内部访问,也可以在外部访问,但函数内部不能修改全局变量。
全局变量与局部变量重复,局部变量不会影响全局变量,函数使用局部变量。
注: 如果在函数的内部想对全局变量进行修改,必须使用global
关键字进行声明
函数参数引用传值
- 在python当中,万物皆对象,在函数调用的时候,实参传递的就是对象的引用
- 在函数内部的处理是否会影响到函数外部的数据:不可变类型(int、tuple、string)不会改变函数外部的数据,可变类型(list、dict)会改变。
参数传递是通过对象引用来完成
匿名函数
python中使用lambda
关键字创建匿名函数,所谓匿名即这个函数没有名字不用def
关键字创建标准的函数
lambda 参数1,参数2,参数3:执行代码语句
特点:
- 使用
lambda
关键字去创建函数 - 没有名字的函数
- 匿名函数冒号后面的表达式有且只有一个,注意:是表达式,而不是语句
- 匿名函数自带
return
,而这个return
的结果就是表达式计算后的结果
缺点:lambda
只能是单个表达式,不是一个代码块,lambda
的设计就是为了满足简单函数的场景,仅仅能封装有限的逻辑,复杂逻辑实现不了,必须使用def
来处理。
lambda与三元运算
if a:
b
else:
c
等价于:
b if a else c
递归函数
如果一个函数在内部不调用其他的函数,而是自己本身的话,这个函数就是递归函数。
递归函数必须有一个结束条件,否则递归无法结束会一直递归下去,直到到达最大递归深度报错。
优点:
- 递归使代码看起来更加整洁、优雅
- 可以用递归将复杂人物分解成更简单的子问题
- 使用递归比使用一些嵌套迭代更容易
缺点:
- 递归逻辑很难调试,递归条件处理不好容易造成程序无法结束,直到达到最大递归错误
- 递归占用大量内存,耗费计算机资源
内置函数
任何一门编程语言的核心操作都是操作内存中的数据,但内存中的数据又是通过编程语言的API来实现,所谓的API,就是系统提供给我们的函数,有一种函数是系统预先定义的函数,也就是安装python就自带的函数,我们把它成为内置函数,也叫内嵌函数
定义: 内置函数就是python安装后就自带有的函数
数字运算函数
abs()
:求绝对值round()
:四舍五入取整pow()
:求指数divmod()
:求商余数max()
:求最大值min()
:求最小值sum()
:求和eval()
:执行字符串表达式
a = 1
b = 2
eval('a+b')
eval('a+b+c',{'c':2,'a':1,'b':3})
类型转换函数
int()
float()
str()
ord()
:字符转数字chr()
:数字转字符bool()
:转换为布尔型,[]
,()
,{}
,0
,None
,0.0
,' '
都相当于False
bin()
:转为二进制hex()
:转为十六进制oct()
:转为八进制list()
:元组转换为列表tuple()
:列表转换为元组dict()
:创建字典bytes()
:转为字节数组
序列操作
可迭代对象:可作用于for
循环的对象
包括:
- 集合数据类型:序列、字典、集合
- 迭代器对象
all()
:用于判断给定的可迭代参数iterable
中的所有元素是否都为True
,如果是返回True
,否则返回False
元素,除了是0
,空,False
外都算True
。**注意:**空元组,空列表返回值为True
,这里要特别注意。any()
:哦那个有判断给定的可迭代参数iterable
是否全部为False
,如果是返回True
,如果有一个为True
,则返回False
。sorted()
:对所有可迭代的对象进行排序操作
sort
和sorted
的区别:
sort
是应用在list
上的方法,sorted
可以对所有可迭代的对象进行排序操作
list
的sort
方法返回的是对已经存中的列表的操作,而内置函数sorted
方法返回的是一个新的list
,而不是在原来的基础上进行的操作。reverse()
:用于反向列表中的元素range()
:创建一个整数列表,一般用在for
循环中zip()
:用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表,如果哥哥迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
与zip
相反,利用*
操作符,可以将元组解压为列表,返回二维矩阵式。
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
enumerate()
:枚举,用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for
循环当中。
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
set集合
定义: set
(集合)也是python
中的一种数据类型,是一个无序且不重复的元素集合
创建集合:
# 第一种方式
set1 = {"1","2"}
# 第二种方式
list1 = ['1','2','3','4']
set2 = set(list1)
集合操作函数:
add()
:添加一个元素clear()
:清空集合的元素difference()
:a.difference(b)
,两个集合的差集,a中存在,b中不存在的intersection()
:a.intersection(b)
,两个集合的交集,a中存在,b中也存在的union()
:a.union(b)
,两个集合的并集pop()
:随机移除集合中的某个元素并且获取那个参数,a.pop()
discard()
:移除指定元素a.discard(x)
update()
:更新集合
>>> a = {1,2,3}
>>> b = {4,5,6}
>>> a.update(b)
>>> a
{1,2,3,4,5,6}