1 # 函数进阶
2 """
3 命名空间和作用域
4
5 *内置命名空间 -----python解释器
6 # 就是Python解释器一启动就可以使用的名字存储在内置命名空间中
7 内置的名字在启动解释器的时候被加载进内存里
8
9 *全局命名空间 -----我们写的代码,但不是函数中的代码
10 # 是在程序从上到下被执行的过程中依次加载进内存的
11 放置了我们设置的所有变量名和函数名
12
13 *局部命名空间 ----函数
14 # 就是函数内部定义的名字
15 当调用函数的时候,才会产生这个命名空间 随着函数执行的结束 这个命名空间就有消失了
16
17 在局部:可以使用全局、内置命名空间中的名字
18 在全局:可以使用内置命名空间中的名字,但不能使用局部的命名空间
19
20 在内置: 不可以使用全局、局部的命名空间
21
22 可以这样想像:内置就是一个大盒子,它包含了全局,全局又是一个中盒子,它包含了局部这个小盒子
23 局部找不到可以向上(全局)中找,没有还可以再向上(内置)中找,但不能向下去找
24
25 依赖倒置原则
26 """
27
28 # 作用域 两种
29 # 全局作用域 --作用在全局 -- 内置和全局名字空间中的名字都属于全局作用域
30
31 # 局部作用域 -- 作用在局部 -- 函数
32
33 # 例子:
34
35 # a = 1
36 # def func():
37 # global a
38 # a += 1
39 #
40 # func()
41 # print(a)
42 # 局部变量不能修改全局变量
43 # 如果想要修改,需要在程序的一开始添加global声明
44
45
46 # def max1(a,b):
47 # return a if a > b else b
48
49 # def the_max(x,y,z): # 函数的嵌套调用
50 # c = max(x,y)
51 # return max(c,z)
52 #
53 # print(the_max(3,5,3))
54
55
56
57 # def outer():
58 # a = 1
59 # def inner():
60 # print(a)
61 # print("inner")
62 #
63 # def inner2():
64 # print(a)
65 # print('inner2')
66 # inner2()
67 # inner()
68 #
69 # outer()
70
71
72
73
74 # 闭包:嵌套函数,内部函数调用外部函数的变量
75 # def outer():
76 # a = 1
77 # def inner():
78 # print(a)
79 # print(inner.__closure__) # 返回值里有cell 就是闭包函数
80 #
81 # outer()
82
83
84
85
86 # def outer():
87 # a = 1
88 # def inner():
89 # print(a)
90 # return inner
91 #
92 # inn = outer() # 先看outer 先调用 然后执行outer这个函数,会有返回值inner,然后用inn去接收它
93 # inn()
94
95
96
97 # def qqxing(l = []):
98 # l.append(1)
99 # print(l)
100 #
101 # qqxing()
102 # qqxing()
103 # qqxing()
104
105
106 # 练习题
107 # 写函数,接收n个数字,求这些参数数字的和。
108 # def sum_func(*args):
109 # total = 0
110 # for i in args:
111 # total += i
112 # return total
113 # print(sum_func(1,2,4,6,3,1225))
114
115 # 读代码,回答,代码中,打印出来的值a,b,c 分别是什么?为什么?
116 # a = 10
117 # b = 20
118 # def test5(a,b):
119 # print(a,b)
120 # c = test5(b,a)
121 # print(c) a = 20 b = 10 c = None(因为没有返回值)
122
123 # 读代码,回答,代码中,打印出来的值a,b,c 分别是什么?为什么?
124 # a = 10
125 # b = 20
126 # def test5(a,b):
127 # a = 3
128 # b = 5
129 # print(a,b)
130 # c = test5(b,a)
131 # print(c)
132
133 # 写函数,检查获取传入列表或元祖对象的所有奇数位索引对应的元素,
134 # 将其作为新的列表返回给调用者。
135
136 # def func(l):
137 # return l[1::2]
138 # a = func([1,2,3,4,5,6,7,8,9])
139 # print(a)
140
141 # 写函数,判断用户传入的对象(字符串、列表、元祖)长度是否大于5。
142
143 # def func(l):
144 # return len(l) > 5
145 # print(func("123455"))
146
147 # 写函数,检查传入列表的长度,如果大于2,
148 # 那么仅保留前两个长度的内容,并将新内容返回给调用者。
149
150 # def func(l):
151 # return l[:2] #if len(l) > 2: 切片 :你切的长度列表中没有,它是不会报错的,所以不用判断
152 # print(func([1,2,3,4,5]))
153
154 # 写函数,计算传入字符串中[数字]、[字母]、[空格]、[其他]的个数,并返回结果。
155 # def func(s):
156 # num = 0 #计算数字的个数
157 # space = 0 # 空格
158 # alpha = 0 # 字母
159 # other = 0 # 其它
160 # dic = {'num': 0,'alpha': 0,'space': 0,'other': 0}
161 # for i in s:
162 # if i.isdigit():
163 # dic['num'] += 1
164 # elif i.isalpha():
165 # dic['alpha'] += 1
166 # elif i.isspace():
167 # dic['space'] += 1
168 # else:
169 # dic['other'] += 1
170 # return dic
171 # print(func("qa12wedc f efdc32ec+++"))
172
173
174 # 写函数,检查传入字典的每一个value的长度,如果大于2,
175 # 那么仅保留前两个长度的内容,并将新内容返回给调用者。
176 # dic = {'k1':'v1v2', 'k2':[11,22,33,44]}
177 # PS:字典中的value只能是字符串或列表
178
179 # def func(dic):
180 # for k in dic:
181 # if len(dic[k]) > 2:
182 # dic[k] = dic[k][:2]
183 # return dic
184 # dic = {'k1':'v1v2', 'k2':[11,22,33,44]}
185 # print(func(dic))
186
187
188
189 # 写函数,接收两个数字参数,返回比较大的那个数字。
190 # def func(a,b):
191 # if a > b:
192 # return a
193 # else:
194 # return b
195 # print(func(3,5))
196
197
198
199 # 三元运算
200 # a = 1
201 # b = 5
202 # c = a if a > b else b # 三元运算
203 # print(c)
204
205 # def func(a,b):
206 # return a if a > b else b
207 # print(func(3,6))
208
209
210
211 # import time
212 # def func():
213 # start = time.time() # 获取当前时间
214 # print('good moring')
215 # time.sleep(2)
216 # end = time.time()
217 # return end - start
218 #
219 # print(func())
220
221
222
223 # 装饰器
224 # import time
225 # def func():
226 # time.sleep(0.01)
227 # print('good moring')
228 #
229 # def timmer(f): # 装饰器函数
230 # def inner():
231 # start = time.time()
232 # f() # 被装饰的函数
233 # end = time.time()
234 # print(end - start)
235 # return inner
236 # func = timmer(func) -----> 这句话相当于语法糖 @timmer
237 # func()
238 # 不想修改函数的调用方式,但是还想在原来的函数前后添加功能
239 # timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
240
241
242
243 # 装饰器的最终形成和固定格式
244 # import time
245 # def timmer(f):
246 # def inner():
247 # start = time.time()
248 # f()
249 # end = time.time()
250 # print(end - start)
251 # return inner
252
253 # @timmer # 语法糖 在被装饰的函数上面加上@装饰器的名字(必须紧挨着)
254 # def func(): # 被装饰的函数
255 # time.sleep(0.01)
256 # print('Happy New Year!')
257 #
258 # # func = timmer(func)
259 # func()
260
261
262
263 # 带返回值的装饰器函数
264 # import time
265 # def timmer(f):
266 # def inner():
267 # start = time.time()
268 # ret = f()
269 # end = time.time()
270 # print(end - start)
271 # return ret
272 # return inner
273 #
274 # @timmer
275 # def func():
276 # time.sleep(0.01)
277 # print('Happy New Year!')
278 # return '新年好!'
279 #
280 # ret = func()
281 # print(ret)
282
283
284
285 # 带参数的装饰器函数
286 # import time
287 # def timmer(f):
288 # def inner(*args,**kwargs):
289 # start = time.time()
290 # ret = f(*args,**kwargs)
291 # end = time.time()
292 # print(end - start)
293 # return ret
294 # return inner
295 #
296 # @timmer
297 # def func():
298 # time.sleep(0.01)
299 # print('Happy New Year!')
300 # return '新年好!'
301 #
302 # ret = func()
303 # print(ret)
304
305
306
307 # import time
308 # def wrapper(f):
309 # def inner(*args,**kwargs):
310 # """再被装饰的函数之前要做的事"""
311 # ret = f(*args,**kwargs)
312 # """在被装饰的函数之后要做的事"""
313 # return ret
314 # return inner
315 #
316 # @wrapper
317 # def func():
318 # time.sleep(0.01)
319 # print('Happy New Year!')
320 # return '新年好!'
321
322
323
324 # 装饰器的固定模式
325 # def wrapper(func):
326 # def inner(*args,**kwargs):
327 # ret = func(*args,**kwargs)
328 # return ret
329 # return inner
330 #
331 # @wrapper
332 # def qqxing():
333 # print(1225)
334 #
335 # ret = qqxing()
336 # print(ret)
337
338 # 注:本文是根据老男孩课程内容整理而成的,本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。