参数 默认参数:参数有默认值,如果不传参则使用默认值
 
必需参数:须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
 
可变参数:
 1:最好写在最后,因为它将从它开始直到最后的所有元素组成一个元组
 2:可以传递一个元组或列表,但是它将此元组或列表组成元组的第一个元素
 3:可以在传参时加一个*,此时是将元组或列表中的元素取出来,传递给args,args将所有元素组成元祖
 def test(a,b,c=0,*args):
     print(args)
     for i in args:
         for j in i:
             print(j)
     print(a,b,c)
 tuples=['a','b','c']
 test(1,2,33,*tuples)
 结果:
 ('a', 'b', 'c')
 a
 b
 c
 1 2 33
 
 
关键字参数:
 1:只接收键值对的形式
 2:以  参数=值  的形式传参
 3:如果值是一个字典,传参时加上**
 def testkw(a,b,**kw):
     print(kw)
     print(a,b)
 dicts={'c':3,'d':4}
 testkw(1,2,**dicts)
 结果:
 {'c': 3, 'd': 4}
 1 2
 
 
 
变量的作用域
 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
 如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了。
 a,b=1,2
 def test():
     global a
     #表示在此函数中使用全局变量,如果没有此声明,下面的变量a就是局部变量
     a=10
     print(a,b)
 def test2():
     print(a)
 #调用函数:局部变量优先
 test()
 test2()
 结果:
 10 2
 10
 
 
 
匿名函数
 python 使用 lambda 来创建匿名函数。
 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
 
1:lambda 只是一个表达式,函数体比 def 简单很多。
 
2:lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
 
3:lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
 
4:虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
 sum=lambda arg1,arg2:arg1+arg2;
 print(sum(10,20))
 #lambda表达式作为参数传递
 def add(a,b,fun):
     print(fun(a,b))
 add(11,22,lambda arg1,arg2:arg1+arg2)
 结果:
 30
 33
 
 
 
filter(函数,可迭代的对象)表示如果if:过滤函数,满足lambda的条件即可返回,可强制转换成列表
 
map(函数,可迭代的对象):返回lambda后面表达式的值
 foo=[2,15,48,65,94]
 print(list(filter(lambda x:x%3==0,foo)))
 print(list(map(lambda x:x*2+10,foo)))
 from functools import reduce
 print(reduce(lambda x,y:x+y,foo))
 结果:
 [15, 48]
 [14, 40, 106, 140, 198]
 224
 
 
 上面filter例子可以写成:print([x for x in foo if x%3==0])
 上面map例子可以写成:print([x*2+10 for x in foo])
 
 
 例子:
 1-10每个数的平方:print([x**2 for x in range(1,11)])
 1-100的偶数:print([x for x in range(1,101) if x%2==0])