python——函数(续)

9.函数的关键字参数 

   关键字参数允许传入含参数名的参数,在函数内部自动组装为一个dict,意思就是,

  不定长参数没参数名!访问参数得遍历。而关键字参数也是不定长参数,只不过给每个参数起名了!所以键值对!dict! 

def person(name,age,**kw):

     print("name:",name,"age:",age,"other",kw); 

person('Bob',15,city="Xian");

extra = {'city': 'Beijing', 'job': 'Engineer'};

person('Jack', 24, **extra);


10.函数的命名关键字参数

不定长参数需要遍历序列访问,为了方便调用参数给每个参数起名,从而诞生了关键字参数

关键字参数如果过多就会产生冗余,则以指定参数名限定关键字参数的个数,从而 诞生命名关键字参数

传参时必须写参数名

命名关键字参数可以有默认值

def person(name,age,*,city,job):     
    print(name,age,city,job); 
若有可变参数 
def person(name,age,*args,city,job):     
    print(name,age,args,city,job); 
注意:综合一下,看看什么结果 
def fun(a, b, *args, **kwargs):     
    print("a =", a )     
    print("b =", b)     
    print("args =", args)     
    print("kwargs: ")     
    for key, value in kwargs.items():       
    print(key, "=", value) 

fun(1, 2, 3, 4, 5, m=6, n=7, p=8) 
c = (3, 4, 5) 
d = {"m":6, "n":7, "p":8} 
fun(1, 2, *c, **d)   
fun(1,2,c,d);

11.函数的递归 

如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。 举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n 

如何打印斐波那契数列呢?


'''
n的阶乘
0!=1
1!=1
2!=2*1
3!=3*2*1
4!=4*3*2*1
foc(5)=5*foc(4)
foc(4)=4*foc(3)
...
foc(1)=1
'''
def foc():
	if n==1:
		return 1
	else:
		return n*foc(n-1)
print(foc(10))


# 1 1 2 3 5  8  13 21 34 55
'''
feibo(1)=1
feibo(2)=1
feibo(3)=feibo(2)+feibo(1)
feibo(4)=feibo(3)+feibo(2)+feibo(1)
        =1+1+1
feibo(7)=feibo(6)+feibo(5)
        =...
...
feibo(n)=feibo(n-1)+feibo(n-2)
'''
def feibo(n):
	if n==1 or n==2:
		return 1
	else:
		return feibo(n-1)+feibo(n-2)
print(feibo(5))
print("")
for i in range(1,100):
	print(feibo(i))


#时间复杂度:代码的执行次数有关 

12.匿名函数 

   首先,在python中函数名其实也是变量名!

      

      abs(-10) # 10

      f=abs f(-10) #10

     abs=10

     abs(-10) #错误!

函数本身也可以赋值给变量,变量可以指向函数! 

  def add(x,y,f):

      return f(x)+f(y)

  add(-5,6,abs);

lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

 lambda函数的语法只包含一个语句,如下: 

lambda [arg1 [,arg2,.....argn]]:expression 

如下实例:

sum = lambda arg1, arg2: arg1 + arg2
#调用sum函数
print("Value of total : ", sum( 10, 20 )) 
print("Value of total : ", sum( 20, 20 )) 

 注意: 

lambda函数能接收任何数量的参数但只能返回一个表达式的值

匿名函数不能直接调用print,因为lambda需要一个表达式

应用场合:函数作为参数传递 

(1)自定义函数 

     

def fun(a, b, opt): 
    print("a =", a) 
    print("b =", b) 
    print("result =", opt(a, b)) 
fun(1, 2, lambda x,y:x+y) 

 (2)作为内置函数的参数 

stus = [     
   {"name":"zhangsan", "age":18},      
   {"name":"lisi", "age":19},      
   {"name":"wangwu", "age":17} 
] 
stus.sort(key = lambda x:x['name'])

 举个栗子:

def addCharToInt(c1,c2,c3):
    print(c3(c1)+c3(c2))

	addCharToInt("a","b",ord)

myfunc=lambda x1,x2=2:x1**x2  #冒号后面为返回值
print(myfunc(3,4))

addCharToInt(3,4,myfunc)

#myfunc2=lambda x1,x2:if x1%2==0 x1*x2  有错误
myfunc2(2,2)
myfunc2(3,2)
list=[x for x in range(10) if x%2==0]
print(list)

13.高阶函数 

  13.1Map函数 

  接收两个参数,一个是函数,一个是Iterable

  将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回

#Map  得到一个序列
def func(x):
	return x**2
l=[1,2,3,4,5,6]
result=list(map(func,1))  #遍历该集合,并**2
print(result)

13.2Reduce函数

     接收两个参数,一个函数,一个是Iterable

     把前两个的元素的计算结果继续和序列的下一个元素做累积计算,其效果就是 

     reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

#Reduce  是一种叠积算法
l=[1,3,5,7,9]
'''
1*10+3=13
13*10+5=135
135*10+7=1357
1357*10+9=13579
x1*10+x2
'''
#import random 代表导入工具箱,从工具箱里面取工具
from functools import reduce  # functools.reduce  是工具
def func2(x1,x2):
    return x1*10+x2
l=[1,3,5,7,9]
num=reduce(func2,l)
print(num)


#from functools import reduce 
l=["9","2","3","1","4","8",]
#923148
num=reduce(func2,list(map(int,l)))
print(num)

  13.3Filter函数 

        filter把传入的函数依次作用于每个元素,然后根据返回值是True或False决定保留还是丢弃该 元素。 

         比如:删偶数留奇数 

#Filter
l=[1,2,3,4,5,6,7,8,9]
def func3(x3):
	retrun x%2==0  #True 保留
result=list(filter(func3,l))
return(result)

  13.4Sorted函数

       内置排序函数 

       sorted(list,key=abs)

      对字符串比较默认ASCII码顺序比较

      sorted(list,key=str.lower(),reverse=True)

s="sjsjbcg23swd22vnkn67vcdkjksf7"
num=reduce(func2,list(map(int,list(filter(str.isdigit,list(s))))))
print(num)
l=list(map(int,list(filter(str.isdigit,list(s)))))
print(l)
s="ASHUhsccsncufjeijk"
l=sorted(s,key=str.upper)  
#排序按照大写或者小写字母排序,也就是忽略大小写  如果不指定,按照ASCII 大写在前,小写在后
print(l)

       

      

     

         

        

     

        

猜你喜欢

转载自blog.csdn.net/y805805/article/details/84501244
今日推荐