平常名利可以直接进行执行,但是有很大的局限性,比如,如果换了数据,或者换了参数,这时候就要进行重新编写。十分不方便,于是有了函数的加入。
def hello():
print('hello')
print('python')
# 通过函数名来调用函数
hello()
函数的用法 ,而且多变。
比如函数里面嵌套函数
def a():
print('is test1')
def b():
print('is test2')
b()
a()
上面的为不带参数的函数,同时还有带参数的函数。
def welcome(a):
print('hello',a)
# 真实的数据信息,调用函数的时候传递的参数较实参
welcome('tom')
welcome('lily')
打印出来的结果为
hello tom
hello lily
位置参数:形参和实参数量必须保持一致
def getInfo(name,age): # 按照位置传递参数
print(name,age)
getInfo('aa',11)
getInfo(11,'aa')
getInfo(age=11,name='aa')
上面两种打印出来的效果是不同的,因为,只是按照位置在定位参数,没有进行指定。
#默认参数
def mypow(x,y=2):
print(x**y)
mypow(2,3)
mypow(2)
在执行上面代码时,如果只输入一个参数,那么y默认的为2
#可变参数
def mysum(*args):
print(*args)
print(args)
sum = 0
for item in args:
sum += item
print(sum)
nums = [1,2,3,4]
nums1 = (1,2,3,4)
nums2 = {1,2,3,4}
mysum(1,2,3,4,5)
#参数解包 在参数名前加*
mysum(*nums)
mysum(*nums2)
#关键字参数
#**kwargs是一个字典 可以传递任意多个key-value
def getStuInfo(name,age,**kwargs):
print(name)
print(age)
print(kwargs)
d = dict(a=1,b=2)
#如果要对字典进行解包 一个* 获取所有的key值
print(*d)
getStuInfo('westos',11,sex=1,score=100)
在写函数时,设置的变量只在当前函数中生效,
如果需要每一个都使用需要使用global进行声明。
a = 1
print('outside:',id(a))
def fun():
global a #声明a为全局变量
a = 5
print('inside:',id(a))
fun()
print(a)
print(id(a))
高阶函数
map():接收两个参数,一个是函数 一个是序列
map将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回
#对一个序列[-1,3,-4,-5]的每一个元素求绝对值
print(list(map(abs,[-1,3,-4,-5])))
#对每个元素求阶乘
def f(x):
"""对x求阶乘"""
res = 1
for i in range(1,x+1):
res = res * i
return res
li = [random.randint(2,7) for i in range(10)]
print(list(map(f,li)))
reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
reduce(f,[x1,x2,x3,x4]) = f(f(x1,x2),x3),x4)
filter过滤函数
和map()类似的,也接收一个函数和一个序列
但是和map()不同的是,filter()把传入的函数依次作用于
每个元素,然后根据返回值是True或者False决定保留还是丢弃该元素
def isodd(num):
if num % 2 == 0:
return True
else:
return False
print(list(filter(isodd,range(100))))#将偶数输出,即将返回True的值进行输出。
匿名函数的关键字为 lambda
冒号前面是 形参 冒号后面是返回值
print(list(filter(lambda x:x%2==0,range(10))))##输出偶数