Python之路——函数

一、函数知识点补充

 1 #参数
 2     #没有参数
 3         #定义函数和调用函数时括号里都不写内容
 4     #有一个参数
 5         #传什么就是什么
 6     #有多个参数
 7         #位置参数
 8 
 9 
10 #站在实参的角度上:
11     #按照位置传参
12     #按照关键字传参
13     #混着用可以:但是 必须先按照位置传参,再按照关键字传参数
14             #  不能给同一个变量传多个值
15 
16 #站在形参的角度上
17     #位置参数:必须传,且有几个参数就传几个值
18     #默认参数: 可以不传,如果不传就是用默认的参数,如果传了就用传的
19 
20 # 动态参数有两种:可以接受任意个参数
21     #*args   : 接收的是按照位置传参的值,组织成一个元组
22     #**kwargs: 接受的是按照关键字传参的值,组织成一个字典
23     #args必须在kwargs之前
24 # def func(*args,default=1,**kwargs):
25 #     print(args,kwargs)
26 # func(1,2,3,4,5,default=2,a='aaaa',b='bbbb')
27 
28 # def mysum(*args):
29 #     the_sum = 0
30 #     for i in args:
31 #         the_sum += i
32 #     return the_sum
33 # the_sum = mysum(1,2,3,4)
34 # print(the_sum)
35 
36 # def stu_info(**kwargs):
37 #     print(kwargs)
38 #     print(kwargs['name'],kwargs['sex'])
39 #
40 # stu_info(name = 'alex',sex = 'male')
41 
42 # 参数陷阱,默认参数是一个可变数据类型
43 # def defult_param(a,l = []):
44 #     l.append(a)
45 #     print(l)
46 #
47 # defult_param('alex')
48 # defult_param('egon')
49 
50 # def func(*args):  # 站在形参的角度上,给变量加上*,就是组合所有传来的值。
51 #     print(args)
52 #
53 # func(1,2,3,4,5)
54 # l = [1,2,3,4,5]
55 # func(l)
56 # func(*l)  # 站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散
57 # def func(**kwargs):
58 #     print(kwargs)
59 # func(a=1,b=2)
60 # d = {'a':1,'b':2}
61 # func(**d)
62 
63 
64 #函数的注释
65 # def func():
66 #     '''
67 #     这个函数实现了什么功能
68 #     参数1:
69 #     参数2:
70 #     :return: 是字符串或者列表的长度
71 #     '''
72 #     pass

 

 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 # 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域  ——globals()
28 # 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()
29 
30 # a = 1
31 # def func():
32 #     global a
33 #     a = 2
34 #
35 # func()
36 # print(a)
37 
38 # 对于不可变数据类型 在局部可以查看全局作用域中的变量
39 # 但是不能直接修改
40 # 如果想要修改,需要在程序的一开始添加global声明
41 # 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
42 
43 
44 #globals 永远打印全局的名字
45 #locals 输出什么 根据locals所在的位置

 

 1 # a = 1
 2 # b = 2
 3 # def func():
 4 #     x = 'aaa'
 5 #     y = 'bbb'
 6 #     print(locals())
 7 #     print(globals())
 8 #
 9 # func()
10 # print(globals())
11 # print(locals()) #本地的

 函数的闭包

 1 # 闭包
 2 # from urllib.request import urlopen
 3 # def get_url():
 4 #     url = 'https://y.qq.com/portal/player.html'
 5 #     def get():
 6 #         ret = urlopen(url).read()
 7 #         return ret
 8 #     return get
 9 # get = get_url()
10 # h = get()
11 # with open('xiaohua100','wb') as f:
12 #     f.write(h)
13 
14 # def func():
15 #     def func1(a):
16 #         a += 1
17 #         print(a)
18 #         print('2',func1.__closure__)
19 #     return func1
20 # f = func()
21 # print(f.__closure__)
22 # print(func.__closure__)

装饰器

 1 # def wrapper(func):
 2 #     def inner(*args,**kwargs):
 3 #         print('before')
 4 #         ret = func(*args,**kwargs)
 5 #         print('ends')
 6 #         return ret
 7 #     return inner
 8 #
 9 # @wrapper
10 # def qqxing():
11 #     print(123)
12 #     return 456
13 #
14 # print(qqxing())

装饰器进阶

 1 # from functools import wraps
 2 #
 3 # def deco(func):
 4 #     @wraps(func)    # 加在最内层函数正上方
 5 #     def wrapper(*args,**kwargs):
 6 #         return func(*args,**kwargs)
 7 #     return wrapper
 8 #
 9 # @deco
10 # def index():
11 #     '''hahaha'''
12 #     print('from index')
13 #
14 # print(index.__name__)
15 # print(index.__doc__)
16 
17 # 装饰器的固定格式
18 # def timer(func):
19 #     def inner(*args,**kwargs):
20 #         '''执行函数之前要做的'''
21 #         re = func(*args,**kwargs)
22 #         '''执行函数之后要做的'''
23 #         return re
24 #     return inner
25 
26 
27 #装饰器的固定格式——wraps版
28 # from functools import wraps
29 #
30 # def deco(func):
31 #     @wraps(func) #加在最内层函数正上方
32 #     def wrapper(*args,**kwargs):
33 #         return func(*args,**kwargs)
34 #     return wrapper
35 
36 
37 #带参数的装饰器
38 # FLAG = True
39 # def outer(flag):
40 #     def timer(func):
41 #         def inner(*args,**kwargs):
42 #             if flag:
43 #                 print('''执行函数前要做的''')
44 #             re = func(*args,**kwargs)
45 #             if flag:
46 #                 print('''执行函数后要做的''')
47 #             return re
48 #         return inner
49 #     return timer
50 #
51 # @outer(FLAG)
52 # def func():
53 #     print(111)
54 #
55 # func()

 

posted @ 2018-01-01 20:49  liuyankui163  阅读(147)  评论(0编辑  收藏  举报