1 形参:位置参数:必须传 2 *args:动态参数,可以接收任意多个位置参数 3 默认值参数:可以传也可以不传 4 **kwargs:动态参数,可以接收多个关键字参数。 5 实参:按照位置传参,按照关键字传参。 6 7 #顺序:位置参数,*args,默认值参数,**kwargs。 8 def test(a,*args,t=10,**kwargs): #t=10是默认值参数,要放在**kwargs前面。 9 print(args,kwargs,t) 10 test(1,23,3,12,45,3,1,5,1,3,5,1,3,t=200,a='asdf',b='awea') #t=200是关键字传参。 11 12 def test1(*args): #args是元组。 13 print(args) 14 a = (1,2,3,87,45,3,43,645) 15 test1(*a) #将元祖a打散成多个元素传参。 16 17 def test3(*args): 18 print(*args) #args是元组,*args是打散元组,所以执行结果是1 2 3 19 print(args) #结果是(1,2,3) 20 test3(1,2,3) 21 22 23 def test2(**kwargs): #形参**kwargs将传入的参数放在字典里面。kwargs是字典。 24 print(kwargs) 25 b = {'c':1,'t':23} 26 # test2(**b) #实参**b将字典打散为键值对传给形参。跟下行代码test2(c=5,t=10)的效果一样。 27 test2(c=1,t=23) 28 29 def a(): 30 return 2 31 print(a()) #函数名()=返回值。 a()=2 32 33 def b(*args): 34 return args 35 print(b(1,2,3)) 36 37 38 默认值参数的陷阱 39 def test(a=[]): 40 a.append(1) 41 print(a) 42 test() #因为a是默认值参数,所以调用函数的时候可以不传参,执行结果是[1] 43 test() #[1,1] 44 test() #[1,1,1] 45 46 47 48 返回值 49 没有返回值:返回None 50 1.不写return 51 2.只写return :结束函数,return下面的代码不执行。 52 3.写return None 不常用 53 返回一个值: 54 可以返回任何数据类型:数字,字符串,元组,列表,字典等等。 55 如果有多个return,只执行第一个。 56 返回多个值: 57 多个返回值要用多个变量接收。 58 def test(): 59 return 1,2,3 60 a1,a2,a3=test() #多个返回值要用多个变量接收。 61 print(a1,a2,a3) #打印出1 2 3 62 print(test()) #打印出元组(1,2,3) 63 64 def a(b): 65 return b[1::2] #返回奇数索引对应的值 66 print(a([1,3,3,6,1,4])) 67 68 def a(b): 69 return len(b)<5 #返回传入的字符串的长度是否小于5 70 print(a('adsfadsf')) 71 72 def test(n): 73 if len(n)>2: #检查传入的列表的长度是否大于2,如果是,返回前面两个元素。 74 return n[:2] 75 print(test([1,2,3,4])) 76 77 def test(list): 78 '''函数注释:统计传入的参数有多少个字母(字母包含汉字),数字,空白符,其他字符''' 79 alpha = 0 80 digit = 0 81 space = 0 82 other = 0 83 for i in list: 84 if i.isalpha(): #如果i是字母为True 85 alpha += 1 86 elif i.isdigit(): #数字 87 digit += 1 88 elif i.isspace(): #空白符 89 space += 1 90 else: #其他 91 other += 1 92 return alpha,digit,space,other 93 print(test('asdfasdfas asdgasdg asdfasdawe645a4s4df 646 465a4 64 646 46 46 465****、、、 ')) 94 95 def test(n): 96 dic={'alpha':0,'digit':0,'space':0,'other':0} #利用字典简化代码,并且返回字典,让别人易读。只看结果就知道字母,数字,空白符,其他,一共多少个。 97 for i in n: 98 if i.isalpha(): 99 dic['alpha'] += 1 100 elif i.isdigit(): 101 dic['digit'] += 1 102 elif i.isspace(): 103 dic['space'] += 1 104 else: 105 dic['other'] += 1 106 return dic 107 print(test('asdfa 44 6a4 645 6a6dfa687df6a**a*d*f*a*d*f*')) 108 109 def test(dic): 110 for k in dic: 111 if len(dic[k]) > 2: 112 dic[k] = dic[k][:2] 113 return dic 114 print(test({'adf':'dfa','vb':'cdag','oe':'desfg'})) 115 116 117 def test(a,b): #接收两个数字,返回小的 118 return a if a<b else b #三元运算,简化代码,适合简单的情况 119 print(test(1,5)) 120 121 122 a = 0 #全局变量 123 def outer(): 124 b=2 #局部变量 125 def inner(): #嵌套函数 126 nonlocal b #nonlocal 声明b是外层函数的变量 127 b=20000000 #修改b的值 128 inner() 129 print(b) 130 global a #声明a是全局变量。如果想修改全局变量,必须先声明 131 a=10000000 #修改a的值 132 outer() 133 print(a) 134 135 136 137 闭包:闭包的好处是外部函数变量a长期存放在内存当中,不会因为外部函数多次被调用而多次生成,导致占用空间。 138 def outer(): 139 a=1 140 def inner(): 141 print(a) #内部函数调用外部的变量,叫做闭包。这里调用了a. 142 return inner #inner()是调用inner函数,inner没有()是函数对象的意思。这里返回函数对象的地址给outer()。因为函数名()=返回值,所以outer()=inner. 143 outer()() #因为outer()=inner,所以outer()()=inner(),这样就可以调用内部函数。