PYTHON第十二天笔记
其他知识点:
所有可变类型都是不可hash的,所有不可变的类型都可hash。列表,字典,集合无法哈希,因为无法由内存地址定位值的唯一性。
(eval-不安全,反射-安全)
(输出该函数的名字:func.__name__)
pycharm中有些验证会和Linux系统环境中的结果不一样,以系统环境中为准,因为pycharm对系统内存做了优化。
python是弱类型
is: 判断是否是同一块内存地址
==: 判断两端的值是否相等
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
a = {'k':'v'} def func(): #a['k'] = 'vvvvvv' a = {'k':'vvvvvv'} print(a) func() print(a)
注释:
#对于不可变的数据类型 如果在函数内部修改想对全局生效,就要进行global声明
#对于可变的数据类型 如果在内部想要修改,直接修改即可
前一天作业:
1、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。
(userinfo文件:
alex,222
egon,666)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
AUTH_FLAG = False //一般定义全局变量用大写,局部变量用小写 def login(func): def inner(*args,**kwargs): global AUTH_FLAG while True: if not AUTH_FLAG: username = input('username : ') password = input('password : ') with open('userInfo',encoding='utf-8') as f: for line in f: name,pwd = line.strip().split(',') if name == username and password == pwd: AUTH_FLAG = True print('登录成功') if AUTH_FLAG: ret = func(*args,**kwargs) #index/shopping return ret return inner @login #index = login(index) def index(): print('welcome to Index page') @login #shopping = login(shopping) def shopping(): print('welcome to shopping page') shopping() #inner index()
⚠️知识点if⚠️:(flag在两个if中都生效,只有函数有作用域)
flag = False
if not flag:
flag = True
if flag:
print(111)
'''
2、附加题:
有一个数据结构如下所示,请编写一个函数从该结构数据中返回由指定的字段和对应的值组成的字典。如果指定字段不存在,则跳过该字段。(10分)
data:{"time":"2016-08-05T13:13:05",
"some_id":"ID1234",
"grp1":{ "fld1":1,
"fld2":2},
"xxx2":{ "fld3":0,
"fld5":0.4},
"fld6":11,
"fld7":7,
"fld46":8}
fields:由"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19
def select(data,fields):
# TODO:implementation
return result
'''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
data={'time':'2016-08-05T13;13:05', 'some_ID':'ID1234', 'graps1':{'fld1':1,'fld2':2}, 'xxx2':{'fld3':0,'fld5':0.4}, 'fld6':11, 'fld7':7, 'fld':8 } # 类递归思想 # 栈的思想 fields = 'fld2|fld3|fld7|fld9' fields_lst = fields.split('|') #['fld2', 'fld3', 'fld7', 'fld9'] result = {} data_lst = [1] while data != 1: for key in data: if key in fields_lst: result[key] = data[key] if type(data[key]) == dict: data_lst.append(data[key]) data = data_lst.pop() ##[1] print(result)
今日内容:
1、带参数的装饰器(代码):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
FLAG = False def log(flag): def wrapper(func): def inner(*args,**kwargs): if flag: print('call : %s'%func.__name__) ret = func(*args,**kwargs) return ret return inner return wrapper @log(FLAG) #wrapper = log(FlAG) --> @wrapper --> qqxing = wrapper(qqxing) = inner def qqxing(): print('qqxing') qqxing() #inner()
2、嵌套装饰器(代码):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def wrapper1(func): def inner1(): print('wrapper1 ,before func') func() #f print('wrapper1 ,after func') return inner1 def wrapper2(func): def inner2(): print('wrapper2 ,before func') func() #inner1 print('wrapper2 ,after func') return inner2 @wrapper2 #f = wrapper2(wrapper1(f)) --> f = wrapper2(inner1) --> f = inner2 @wrapper1 def f(): print('in f') f() #inner2()
图片下载:
![](https://images2017.cnblogs.com/blog/737669/201709/737669-20170903220401155-2043486796.png)
![](https://images2017.cnblogs.com/blog/737669/201709/737669-20170903220416687-1029423815.png)