函数进阶
1.无参数无返回值:这类函数往往用于提示信息打印
2.无参数有返回值:这类函数往往用于数据采集过程中
3.有参数有返回值:这类函数一般是计算型的
4.有参数无返回值:这类函数多用于设置某些不需要返回值的参数设置
1.局部变量
局部变量的作用域只在局部,出了作用域就不能使用了。不同的函数可以定义相同的局部变量,但是都是各自用各自的,不会产生影响。
局部变量可以是任何类型。
print('---------局部变量-----------')
def Part1():
a=1
print(a)
pass
def Part2():
a=2
print(a)
pass
Part1()
Part2()
print(a) #局部变量只在局部起作用,出了范围后就会释放掉
2.全局变量
全局变量定义在全局,作用域为全局,什么类型都行。
print('---------全局变量-----------')
pro='全局变量'
def All1():
print('在All1函数中使用全局变量:',end=' ')
print(pro)
pass
def All2():
print('在All2函数中使用全局变量:',end=' ')
print(pro)
pass
print('在函数体外使用全局变量:', end=' ')
print(pro)
All1()
All2()
当全局变量和局部变量名称相同时,优先使用函数内部的变量
但是要注意出现这种情况时,在声明局部之前不可以使用,不然会报错
print('---------全局变量-----------')
pro='全局变量'
def All1():
print('在All1函数中使用全局变量:',end=' ')
print(pro)
pro='改变全局变量的值'
print('改变全局变量的值后的输出:',end=' ')
print(pro)
pass
print('在函数体外使用全局变量:', end=' ')
print(pro)
All1()
报错👆
正确的使用方法:
print('---------全局变量-----------')
pro='全局变量'
def All1():
pro='改变全局变量的值'
print('改变全局变量的值后的输出:',end=' ')
print(pro)
pass
print('在函数体外使用全局变量:', end=' ')
print(pro)
All1()
在函数中修改的全局变量出函数之后就会回归为原来的全局变量值。如果想要彻底修改,需要用到global关键字:
Qu='全局变量'
print(Qu)
def All():
global Qu
Qu='变量'
pass
All()
print(Qu)
3.引用
在python中,值是靠引用传递的,可以用id()查看一个对象的引用是否相同,id是值存在内存中那块地址的标识。
a=1 #不可变类型,如int类型等
def fun1(x):
print('x的内存地址{}'.format(id(x)))
print('x的值%d'%x)
x=2
print('改完x的值后x的内存地址{}'.format(id(x)))
print('此时x的值是%d'%x)
pass
print('a的内存地址{}'.format(id(a)))
fun1(a)
print('a的值是{}'.format(a))
如果是可变类型,数据是同步变化的:
li=[] #可变类型
def fun1(x):
print('x的内存地址{}'.format(id(x)))
x.append([1,2,3,4])
print('x的内存地址{}'.format(id(x)))
print('此时的x{}'.format(x))
pass
print('li的内存地址{}'.format(id(li)))
fun1(li)
print('此时的列表{}'.format(li))
print('由此可以看出可变类型在内部函数改变值后,可以传到外面')
在python中,所有的东西都是对象,在函数调用的时候,实参传递的就是对象的引用,参数传递是通过对象引用完成的。
4.匿名函数
python中使用lambda关键字创建匿名函数,所谓匿名函数是指这个函数没有名字,不用def创建标准的函数。
lambda 参数1,参数2,参数3: 执行代码语句..
匿名函数冒号后面的表达式有且只有一个,是表达式不是语句
自带return,结果就是表达式计算结果
只能实现简单逻辑,复杂逻辑实现不了
M=lambda x1,x2:x1+x2
print(M(1,2))
#用正常实现:
def fun1(n1,n2):
return n1+n2
print(fun1(1,2))
#lambda和三元运算:
def fun2(a):
if a==1:
return 1
else:
return 2
pass
n=lambda a:1 if a==1 else 2
print(fun2(2))
print(n(1))
#python中的幂运算:
print(2**4)
5.递归函数
递归函数就是一直调用自己,不调用其他函数的函数。递归函数必须有一个结束的条件,否则递归无法结束一直运行会死循环或到达最大递归深度后报错。
print('-----------循环求阶乘-------------')
#求阶乘:
def fun1(n):
i=1
sum=1
while i<=n:
sum*=i
i+=1
pass
return sum
print(fun1(10))
print('---------递归方式求阶乘------------')
#递归求阶乘:
def fun2(n):
if n==1:
return n
else:
return n*fun2(n-1)
pass
print(fun2(10))
#递归小练习:
#取文件
import os #引入文件操作模块
def findFile(file_path):
listRs=os.listdir(file_path) #得到路径中所有文件夹
for item in listRs:
full_path=os.path.join(file_path,item) #获取完整的文件路径
if os.path.isdir(full_path): #判断是否是文件夹
findFile(full_path) #如果是文件夹就继续遍历
else:
print(item)
pass
pass
else:
return
pass
findFile('D:\\octaveFunction') #多打一个\转义