一、函数基础
定义:一般是完成具体独立功能的代码块,为了最小化代码冗余,提高代码的复用率,问题局部化
1.1函数分类
def functionA():
'''
无参无返回值函数
:return:无
'''
print('Hello,鹿鸣松')
functionA()
def functionB(name):
'''
带参无返回值函数
:return:
'''
print('Hello,%s'%(name))
functionB('鹿鸣松')
def functionC():
'''
无参有返回值函数
:return:
'''
a=1
b=2
return a+b
params=functionC()
print(params)
def functionD(a,b):
'''
带参有返回值函数
:return:
'''
return a+b
params=functionD(1,2)
print(params)
1.2参数分类
定义:参数是为了实现某项特定的功能所需要的数据
分类:必选参数、默认(缺省)参数、可选参数、关键字参数
# 1.必选参数
def sum(a, b): # 形参:只是意义上的一种参数,并没有开辟内存空间
sum = a + b
print(sum)
sum(1, 4) #实参:实际开辟了内存空间
#2.缺省参数
def sum1(a=1,b=2):
'''
如果不传参数值,则使用默认参数值;另外默认参数一定要放在最后面,放在形参前面会有报错
:param a:
:param b:
:return:
'''
print(a+b)
sum1(5)#输出结果为7,因5给了a
#3.不定长参数,当参数的个数不确定时使用
def functionA(*args):
'''
是元组类型的数据
:param args:
:return:
'''
print(type(args))
for item in args:
print(item,end=' ')
functionA(1,2,3,4,5,6)
print()
#4.关键字参数,在函数体内,参数关键字是一个字典类型,key是一个字符串
def functionB(**kwargs):
'''
:return:
'''
print(kwargs)
dictA={'name':'鹿鸣松','age':24}
functionB(**dictA)
functionB(name='鹿鸣松',age=24)
#5.不定长和关键字混合使用
def complexFunc(*args,**kwargs):
'''
可选参数必须放到关键字参数之前,也就是括号中两个参数的顺序不能换
可选参数接受的是元组类型
关键字可选参数接受的是字典类型
:param args:
:param kwargs:
:return:
'''
# print(type(args))
# print(type(kwargs))
print(args)
print(kwargs)
complexFunc(1,2,3,4,name='鹿鸣松')#这边的字典类型参数能被正常识别
complexFunc(1,2,3,4,dictA)#这边的dictA被放入可选参数了
1.3函数嵌套调用
def functionA(a=10,b=30):
return a+b
def functionB(a,b=96):
result=functionA(a,b)
return result
print(functionB(10))
二、全局变量和局部变量
定义:局部变量的作用域是在函数体内的,而全局变量作用域整个文件。局部变量优先于全局变量,也就是在函数内,如果出现和全局变量一样的参数,则优先使用函数体内的变量。
name='鹿鸣松'
def printName():
name='鹿鸣雪'
print(name)
printName()#输出结果为鹿鸣雪
修改全局变量的方法
name='鹿鸣松'
def modName():
global name #得先声明
name='鹿鸣雪'
modName()
print(name)
三、匿名函数
语法:lambda 参数1、参数2、参数3:表达式
特点:
- 使用lambda关键字去创建函数
- 没有名字的函数
- 匿名函数冒号后面的表达式有且只有一个,注意:是表达式,而不是语句
- 匿名函数自带return,而这个return的结果,就是表达式计算后的结果
#语法结构 lambda 参数1、参数2、参数3:表达式
#特点
add=lambda x,y:x+y
#通过变量去调用函数
print(add(22,18))
'''
这里a,b,c是参数,值在后面的括号里,冒号后面就是表达式,只能有一条表达式
表达式的意思是,如果a>b,就返回a,反之返回c
'''
result=(lambda a,b,c:a if a>b else c)(10,20,30)#替换单分支
print(result)
#把上面的式子拆分写一下,如下
#创建匿名函数
fun=lambda a,b,c:a if a>b else c
rs=fun(10,20,30)
print(rs)
四、递归函数
定义:在函数体内再调用自己
特点:
- 必须有一个明确的结束条件
- 逻辑简单、定义简单
- 容易导致栈溢出、内存资源紧张,甚至内存泄漏
def jiecheng(n):
'''
n的阶乘函数,递归函数简洁,逻辑清晰
:param n:
:return:
'''
if n == 1:
return 1
else:
return n * jiecheng(n - 1)
print(jiecheng(5))
# 模拟实现树形结构的遍历,找到文件夹下的文件
import os # 引入文件操作模块
def findFile(file_path):
listRs = os.listdir(file_path)
for fileItem in listRs:
full_path = os.path.join(file_path, fileItem) # 获取完整的文件路径
if os.path.isdir(full_path): # 判断是否为文件夹
findFile(full_path) # 如果是一个文件夹,再次去递归
else:
print(fileItem)
else:
return
findFile('F:\\英雄时刻')
五、内置函数
函数类型 | 函数名 | 作用 | 举例 |
---|---|---|---|
数学运算函数 | abs | 求绝对值 | abs(-10),结果为10 |
round | 取近似值 | round(2.6),结果为3 | |
pow | 求次方 | pow(3,3),结果为27 | |
divmod | 求商和余数 | divmod(7,3),结果为(2,1)是个元组类型 | |
max | 求最大值 | max([1,3,5]),结果为5,参数是个序列,如列表、元组、字符串等 | |
sum | 求和 | sum((1,2)),结果为3,参数是个序列,如列表、元组、字符串等 | |
eval | 执行字符串表达式 | eval('x*y+z',{'x':10,'y':10,'z':1}),结果为101,参数1是表达式子,后面如果赋值,需要以字典格式来赋值 | |
类型转换函数 | int | 转为整型 | int(2.6),结果为2 |
float | 转为浮点型 | float(2),结果为2.0 | |
str | 转为字符串类型 | str(2),结果是个字符串类型的2 | |
chr | 数字转字符 | chr(2) | |
ord | 给一个unicode的字符的字符串,返回一个整数,表示该字符的unicode代码点 | ord('a'),结果为97 | |
bin | 十进制转换成2进制 | bin(2),结果为0b10 | |
hex | 十进制转十六进制 | hex(16),结果为0x10 | |
oct | 十进制转8进制 | oct(10),结果为0o12 | |
list | 将元组转换为列表 | list((1,2,3)),结果为[1,2,3] | |
tuple | 将列表转元组 | tuple([1,2,3]),结果为(1,2,3) | |
bytes | 转字节 | bytes('鹿鸣松',encoding='utf-8'),结果为b'\xe9\xb9\xbf\xe9\xb8\xa3\xe6\x9d\xbe' | |
bool | 转布尔类型,有参为结果true,无参为false | bool(1),结果为True | |
序列操作函数 | all | 判断给定的可迭代参数中的所有元素是否都为True,如果是则返回True,否则返回False。元素除了是0、空、FALSE外都算True | all((0,2,3)),结果为False |
any | 判断给定的可迭代参数中的所有元素是否都为False,如果是则返回Flase,否则返回True。元素除了是0、空、FALSE外都算True | any((0,False,'')),结果为False | |
sort | 在原来的基础上进行排序,并将值由原来的变量指向 | li=[2,1,0],li.sort(),结果为[0,1,2] | |
sorted | 排序后生成一个新的列表sorted(params,reverse=True/False) |
sorted([1,2,0],reverse=True),结果为[2,1,0] | |
reverse | 反向列表中的元素 | li=[0,2,1],li.reverse()结果为[1,2,0] | |
range | 创建一个整数列表 | range(0,4,2),打印出来的结果就是0,2 | |
zip | 将可迭代的对象作为参数,按序列对象中对应索引位置的元素打包成一个个元组,然后返回这些元组组成的列表。如果迭代器的元素个数不一致,则返回的列表长度与最短的对象相同 | list(zip([1,2,3],('name','age','kk'),[435,56,'asd'])),结果为[(1, 'name', 435), (2, 'age', 56), (3, 'kk', 'asd')] | |
enumerate | 将一个可遍历的对象组合为一个索引序列,同时列出数据和数据下标,一般用在for循环中。参数可以是列表、元组、字符串、字典 | enumerate(params,索引开始下标) | |
集合操作函数 | set | 不支持索引和切片,是一个无序的且不重复的容器,类似于字典,但没有value | 这个集合打印出来的结果,里面的元素排序可能每次都不一样 |
set.add | 往集合里添加元素 | ||
set.clear | 清空集合 | ||
set.difference | 两个集合的差集 |
set1.difference(set2)或者set1-set2结果是set1中在set2中没有的元素 | |
set.intersection | 两个集合的交集 | set1.intersection(set2)和set1&set2这两个表达式都是取两个集合的交集 | |
set.union | 两个集合的并集 | set1.union(set2)和set1 | set2 这两个表达式都是取两个集合的并集 | |
set.pop | 从集合中随机拿数据并同时删除 | ||
set.discard | 移除集合中的指定数据 |
set1.discard(1),再打印set1就没有1这个元素了 | |
set.update | 在原集合的基础上更新集合,集合里的元素是唯一的,所以更换的时候会去重,数学知识 | set1.update(set2) |