函数的基本类型
1:无参数,无返回值,一般用于提示信息打印
def m():
print("-" * 20)
2:无参数,有返回值,多用在数据采集中,比如获取系统信息
def mycpu():
#获取cpu信息
return info
3:有参数,无返回值,多用在设置某些不需要返回值的参数设置
def s(a):
pass
4:有参数,有返回值一般是计算型的,需要参数,最终要返回结果
def b(a,b):
c=a+b
全局变量与局部变量
局部变量
局部变量:定义在函数内部的变量,作用域就在函数内部
不同的函数可以定义相同的局部变量
局部变量作用:为了临时保存数据,需要在函数中定义进行存储
def m():
name="nvdg"
print("{}".format(name))
pass
m()
#其中name为局部变量
全局变量
p="vkegke"
def m():
name="nvdg"
print("{},{}".format(name,p))
pass
m()
#其中p为全局变量
#当全局变量与局部变量相同时优先使用局部变量
修改全局变量
p="vkegke"
def m():
name="nvdg"
print("{},{}".format(name,p))
pass
def b():
global p #重点
p="nekrgnke"
pass
b()
m()
引用
不可变型
a=1
def b(x):
print('x的地址:',id(x))
x=2
print('x的修改后的地址:', id(x))
print(x)
pass
print('a的地址:{}'.format(id(a)))
b(a)
print(a)
可变类型
li=[]
def m(parms):
li.append([2,5,59,6,3,5,9])
print(id(parms))
print('内部的{}'.format(parms))
pass
print(id(li))
m(li)
print('外部的变量对象{}'.format(li))
1.在python中万物皆对象,在函数调用时,实参传递的就是对象的引用
2.了解了原理之后,就可以很好地把控在函数内部的处理是否会影响到函数外部的数据变化
参数的传递是通过对象引用来完成
匿名函数
python中使用lambda 关键字创建匿名函数,所谓匿名即这个函数没有名字不用def关键字创建标准的函数
语法:lambda 参数1,参数2,参数3:执行代码语句(参数个数不限)
特点:
1:lambda关键字创建函数
2:没有函数名
3:匿名函数后的表达式有且只有一个,注意:是表达式,不是语句
4:匿名函数自带return,而这个return的结果就是表达式计算后的结果
计算两数之和:
a=lambda x,y:x+y
print(a(1,2))
print(a(6,8))
双元运算
a if b else c 如果满足条件b执行a否则执行c
import random
b=random.randint(0,30)
print(b)
print("可以参军" if b>18 else "继续上学")
两个数的大小比较
简接调用
c=lambda x,y:x if x>y else y
print(c(234345,5475))
print(c(5346,325))
直接调用
c=(lambda x,y:x if x>y else y)(234345,5475)
print(c)
缺点:lambad只能是单个表达式,不是一个代码块,lambad的设计就是为了满足简单函数的场景,仅可封装有限的逻辑,复杂的逻辑没法实现,需用def来实现
递归函数
阶乘
def digui(n):
if n==1:
return 1
else:
return digui(n-1)*n
pa
print(digui(10))
递归函数必须有一个明确的结束条件。
优点:逻辑简单,定义简单
缺点:容易导致栈溢出,内存资源紧张,甚至内存泄漏
模拟实现树形结构的遍历
重点
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)
pass
pass
else:
return
pass
#调用文件对象
findfile("C:\\Users\\86183\\Music")#此处路径不一定且是双斜杠
自定义函数+自定义函数
def closer () :
n = 100
def get_n () :
return n
def set_n (m) :
print ( 'execute set_n' )
nonlocal n #调用外部函数变量
n = m
return {
'setn' :set_n,
'getn' :get_n
}
fdict = closer()
fset = fdict.get ('setn')
fget = fdict.get ('getn')
fset(99)
r = fget ()
内置函数 + 自定义函数
import math
def add (a,b,f):
return f(a)+f(b)
#1-根据f(a)可以推断,该函数必须只有一个参数,并且有返回值
r = add (-3,9, abs) #return abs(-3)+abs (9)
print (r)
r = add(9,16,math.sqrt)
print (r)