Python函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,
比如print(),但你也可以自己创建函数,这被叫做用户自定义函数
return [表达式] 结束函数,返回一个值给调用方。不带表达式的return相当于返回 None
经常使用的代码可以定义函数,方便执行
定义函数是不会执行的
def 函数名():
函数代码
def print_hello():
print("人生苦短,我用python")
print_hello() #调用函数
带参数的函数
def test1(r): #r形参,代表一个变量
s=3.14*(r**2) #print("圆的面积为:%s"%s)
test1(11.8) #真正的参数
多参数函数
def 函数名(参数1,参数2...):可以随便起,形参,不用在前面定义,也不会和之前的变量冲突
a=1
def test(a,b): #形参,局部变量
c=a+b
print("%s加上%s的和为%s"%(a,b,c))
test(a,20) #实参,在调用函数的时候传给函数的参数,实参可以传全局变量
带有返回值的函数(执行函数返回的结果就是返回值)
def test(a,b):
c=a+b
return c #返回值为c,即a+b的值,没有返回值s的结果为None
#return被执行之后,不管return后面还有什么代码都不会执行
print("我是帅哥")#此代码不会被执行
s=test(10,20)
print(s)
函数返回多个值
def test():
a=1
b=2
return a,b #[a,b] 这样也可以让返回值变成列表 #默认返回多少值就要用多少个值赋,用一个值赋值默认是元组
x=test() #或x,y=test()
print(x)
判断输入的不是数值不执行
def test(a,b):
if isinstance(a,(int,float)) and isinstance(b,(int,float)):
#判断a和b是int或者是float就执行下面的代码
print("传入成功")
c=a+b
else:
print("传入失败")
return c
num1=100
num2=200
s=test(num1,num2)
print(s)
2.1版本:判断输入的不是数值不执行
def test(a,b):
if not isinstance(a,(int,float)):
print("传入失败,%s不是一个数字类型"%a)
return#如果a不是数值,函数后面的代码没有必有执行
elif not isinstance(b,(int,float)):
print("传入失败,%s不是一个数字类型"%b)
return#如果b不是数值,函数后面的代码没有必有执行
else:
print("传入成功")
c=a+b
return c
num1=200
num2=200
s=test(num1,num2)
print(s)
求3个数的平均值
def avg_3num(a,b,c):
if is_number(a) and is_number(b) and is_number(c):
#调用3此下面定义的函数,判断a,b,c的值为不为数值类型
return (a+b+c)/3
else:
print("没法计算平均值")
def is_number(a): #判断a的值是不是int或float类型
if not isinstance(a,(int,float)):
print("传入的实参是:%s,传入的不是一个数字"%a)
return False #不是int和float就返回False
else:
return True #是就为True
avg=avg_3num(100,225,233)
print(avg)
局部变量只能在该函数中使用,全局变量能在所有环境使用
count = 5 全局变量
def myfun():
count = 10 局部变量
print (count)
myfun() 结果是10
print(count) 结果是5
def fun():
print("fun在调用")
def fun1():
print("fun1在调用")
fun1() #fun里调用fun1
fun() #调用fun函数
在函数里面修改全局变量
1.如果全局变量是可变类型,可以在函数里面任意修改(值,引用)
2.如果全局变量是不可变类型,在函数里面不能修改值,也不能修改引用,除非加上global
3.在函数内可以修改列表和字典全局变量,字符串和数值要加global,只有可变类型可以修改
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
函数默认参数
def test(x,y,z=10): #默认参数必须在最后
print(x,y,z)
return x+y+z
print("三个数的和是%d"%test(5,8))#缺省参数可以不传参,也可以随便传个参数,替代默认值
不定长参数
def test(x,y,*args,): #不定长参数可以传多个参数,元组方式显示
print(x,y)
print(args)
test(1,2,3,4,5,6,7)
1 2
(3, 4, 5, 6, 7) #默认是元组
def test1(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test1(1,2,3,4,num1=5,num2=6)
结果1,(2,3,4),{'num2': 6, 'num1': 5}
拆包
nums=[3,4]
num2={"num1":5,num2:6}
test(2,*nums,**num2)
递归函数(在函数内部调用函数本身的函数)
打印阶乘
1.在函数的内部调用自己本身
2.递归函数本质是一个方法的循环调用,注意,有可能会出现死循环
3.一定要定义函数的边界(什么时候退出循环)
def test(n):
if n == 1:
return 1
return n * test(n-1)
print(test(7))
匿名函数(没有名字的函数),不需要定义def
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,
后者的目的是调用小函数时不占用栈内存从而增加运行效率。
sum = lambda arg1, arg2: arg1 + arg2 sum(10,20) 结果30
func = lambda x,y:x+y #需要赋值给一个变量
print(func(11,22))
#!/usr/sbin/python3
def test(a,b,func):
result=func(a,b)
return result
print(test(22,33,lambda x,y:x+y))
stus=[{'name':'zs','age':'22'},{'name':'laowang','age':'19'},{'name':'aini','age':18}]
stus.sort(key=lambda x:x['name']) #按照name的values进行比较
print(stus)
结果如下: #按列表的某一个元素进行比较
[{'name': 'aini', 'age': 18}, {'name': 'laowang', 'age': '19'}, {'name': 'zs', 'age': '22'}]
#!/usr/sbin/python3
def test(a,b,func):
result=func(a,b)
return result
func_new=input("请输入你的操作:") #可以输入:lambda x,y:x+y
func_new=eval(func_new) #把字符串换成一个表达式,可以执行
print(test(22,33,func_new))