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(),这样就可以调用内部函数。