LearnPython_week4
1、装饰器
2、生成器
3、迭代器
4、内置方法
5、可序列化
6、项目规范化
1、装饰器
# -*- coding:utf-8 -*-
# Author:Wong Du ### 原代码
def home():
print("Welcome to home...")
def shoe():
print("Welcome to shoe...")
def clothes():
print("Welcome to clothes...")
def gift():
print("Welcome to gift...")
home()
shoe()
clothes()
gift() #################需求:为程序的购物专区增加认证功能#################
### Part1:添加认证函数login(),加入到需要认证模块的函数当中
user = 'Wong'
passwd = 'Wong123'
def login():
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
break
else:
print("Invalid username or password...")
count += 1 def home():
print("Welcome to home...")
def shoe():
login()
print("Welcome to shoe...")
def clothes():
login()
print("Welcome to clothes...")
def gift():
login()
print("Welcome to gift...")
home()
shoe()
clothes()
gift() #################需求:为程序的购物专区增加认证功能#################
### Part2:添加认证函数login(func),在login()中调用需要添加认证功能的函数
user = 'Wong'
passwd = 'Wong123'
def login(func):
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
func()
break
else:
print("Invalid username or password...")
count += 1 def home():
print("Welcome to home...")
def shoe():
print("Welcome to shoe...")
def clothes():
print("Welcome to clothes...")
def gift():
print("Welcome to gift...")
home()
# shoe()
# clothes()
# gift()
login(shoe)
login(clothes)
login(gift) #################需求:为程序的购物专区增加认证功能#################
### Part3:添加认证函数login(func),函数赋值,再调用
user = 'Wong'
passwd = 'Wong123'
def login(func):
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
func()
break
else:
print("Invalid username or password...")
count += 1
return login #高阶函数,返回login的内存地址 def home():
print("Welcome to home...")
def shoe():
print("Welcome to shoe...")
def clothes():
print("Welcome to clothes...")
def gift():
print("Welcome to gift...")
home()
# shoe()
# clothes()
# gift()
# shoe = login(shoe)
# clothes = login(clothes)
# gift = login(gift)
# shoe()
# clothes()
# gift() #################需求:为程序的购物专区增加认证功能#################
### Part4:添加认证函数login(func),嵌套函数+高阶函数,函数赋值,再调用
user = 'Wong'
passwd = 'Wong123'
def login(func):
def auth():
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
func()
break
else:
print("Invalid username or password...")
count += 1
return auth #高阶函数,返回login的内存地址 def home():
print("Welcome to home...")
def shoe():
print("Welcome to shoe...")
def clothes(name):
print("%s,Welcome to clothes..." %name)
def gift():
print("Welcome to gift...")
home()
shoe = login(shoe)
clothes = login(clothes)
gift = login(gift)
shoe()
clothes()
gift() ### Part5:添加不固定参数,增加装饰器的可扩展性
user = 'Wong'
passwd = 'Wong123'
def login(func,*args,**kwargs):
def auth(*args,**kwargs):
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
func(*args,**kwargs)
break
else:
print("Invalid username or password...")
count += 1
return auth #高阶函数,返回login的内存地址 def home():
print("Welcome to home...")
def shoe():
print("Welcome to shoe...")
def clothes(name,*args,**kwargs):
print("%s,Welcome to clothes..." %name)
def gift():
print("Welcome to gift...")
home()
# shoe = login(shoe)
clothes = login(clothes)
# gift = login(gift)
# shoe()
clothes('Wong')
# gift() ### Part6:函数赋值的方式看起来太low了,用装饰器专用调用方法
user = 'Wong'
passwd = 'Wong123'
def login(func,*args,**kwargs):
def auth(*args,**kwargs):
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
func(*args,**kwargs)
break
else:
print("Invalid username or password...")
count += 1
return auth #高阶函数,返回login的内存地址 def home():
print("Welcome to home...")
@login #相当于shoe = login(shoe)
def shoe():
print("Welcome to shoe...")
@login #相当于shoe = login(clothes)
def clothes(name,*args,**kwargs):
print("%s,Welcome to clothes..." %name)
@login #相当于shoe = login(gift)
def gift():
print("Welcome to gift...")
home()
# shoe()
clothes('Wong')
# gift() ### Part7:为函数添加不同平台qq/wechat/weibo等认证功能
user = 'Wong'
passwd = 'Wong123'
def login(auth_type,*args,**kwargs):
def auth(func,*args,**kwargs):
def inner(*args,**kwargs):
if auth_type == 'qq':
count = 0
while count < 3:
username = input('User login: ')
password = input('Password: ')
if username == user and password == passwd:
print("Login successful...")
func(*args,**kwargs)
break
else:
print("Invalid username or password...")
count += 1
else:
print("Sorry,Only support qq login...")
return inner #高阶函数,返回login的内存地址
return auth def home():
print("Welcome to home...")
@login('qq') #相当于shoe = login(shoe)
def shoe():
print("Welcome to shoe...")
@login('weibo') #相当于shoe = login(clothes)
def clothes(name,*args,**kwargs):
print("%s,Welcome to clothes..." %name)
@login('wechat') #相当于shoe = login(gift)
def gift():
print("Welcome to gift...")
home()
shoe()
clothes('Wong')
gift()
2、生成器
# -*- coding:utf-8 -*-
# Author:Wong Du '''
生成器 generator
生成器最直观的效果就是节省内存
1.传统的列表等集合体是把所有元素存在内存里,当我们需要某个元素时,再从集合体里调用,此方式耗费内存,效率低下
2.生成器可以理解为是把一套计算方法和一个内存地址绑定在一起,这个内存地址里面没有生成元素,当我们需要某个元素时,再通过内存地址里面的算法一个一个生成元素
制造生成器:
1.g = (x*2 for x in range(10))
2.用yield在函数中定义,把整个函数制造成一个生成器
特性:
生成器只能向后生成元素
生成器有两种调用方式
1. __next__方法
g.__next__()
2. for循环调用
for i in g:
print(i)
''' ### 制造生成器和类型说明
g = (x*2 for x in range(10))
print(type(g))
print(g)
'''
输出:
<class 'generator'>
<generator object <genexpr> at 0x0000000000A2A938>
''' ### 生成器的调用特点
print(g.__next__())
print(next(g))
print("走走神。。。")
print(next(g))
print(g.__next__())
print("发发呆。。。")
for i in g:
print(i) ### 函数生成器,
## 生成器的send方法可以给yield赋值
print('华丽分割线'.center(40,'*'))
# def fib(max): #普通函数
# n,a,b = 0,0,1
# while max > n:
# print(b)
# a,b = b,a+b
# n += 1
# return 'done'
# print(type(fib))
def fib(max): #函数生成器
n,a,b = 0,0,1
while max > n:
# print(b)
yield b
a,b = b,a+b
n += 1
return 'done'
print(type(fib(5)))
for i in fib(5):
print(i) ### 单线程并行效果
import time
def foo(name):
print("%s 要开始吃包子了" %name)
while True:
baozi = yield
print("包子 %s 被 %s 吃了" %(baozi,name)) def war():
a1 = foo('A')
a2 = foo('B')
a1.__next__()
a2.__next__()
print("我要准备做包子啦...")
for i in range(5):
time.sleep(1)
print("做了2个包子...")
a1.send(i)
a2.send(i) war()
3、迭代器
# -*- coding:utf-8 -*-
# Author:Wong Du '''
迭代器
定义:迭代器与生成器类似,属数据流对象
可以直接作用于for循环的对象统称为可迭代对象:Iterable,如list、dict、set、tuple、str等
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator,生成器是迭代器
判断方法:
from collections import Iterator #导入Iterator模块
from collections import Iterable #导入Iterable模块
print(isinstance(g,Iterable)) #判断g是否是一个可迭代对象
print(isinstance(g,Iterator)) #判断g是否是一个迭代器
生成迭代器:
iter()方法可以把可迭代对象编程一个迭代器
如:
list = (1,2,3,4)
list = iter(list)
''' ### 判断是否为迭代器或可迭代对象的方法
from collections import Iterator
from collections import Iterable
str = '111'
print(isinstance(str,Iterable)) #True
print(isinstance(str,Iterator)) #False
list = [1,2,3]
print(isinstance(list,Iterable)) #True
print(isinstance(list,Iterator)) #False
g = (i*2 for i in range(5))
print(isinstance(g,Iterable)) #True
print(isinstance(g,Iterator)) #True ### 可迭代对象可通过iter()方法变成一个迭代器
tup = (1,2,3,4,5,4)
print(type(tup)) #tuple
tup = iter(tup)
print(type(tup)) #tuple_iterator
4、内置方法
# -*- coding:utf-8 -*-
# Author:Wong Du def dir_object():
## 删除对象的属性方法
## delattr(object, name: str)
delattr('Wong', 'count') ## 判断对象是否有这个属性方法
## hasattr(object, name: str)
print(hasattr('Wong', 'count1')) ## 获取对象的属性方法,如存在可直接调用执行,如不存在则可配置default返回相关信息
## getattr(object, name: str, default)
print(getattr('Wong,ggg', 'count', '不存在')) ## 为对象添加属性方法
## setattr(object, name: str, value)
def Wong(name): # 定义函数对象
print("Welcome to", name)
print("I am 23 years old")
return 'done'
setattr(Wong, 'author', 'Wongdu') # 增加'author'属性
print(hasattr(Wong, 'author')) # 验证 # 绝对值,
# abs(n),Return the absolute value of the argument.
print( abs(-22) ) # 判断可迭代对象内元素是否全为真
# all(Iterable)
'''Return True if bool(x) is True for all values x in the iterable.
If the iterable is empty, return True.'''
print( all([1,2,3,0]) ) # 判断可迭代对象内元素是否有真
# any(Iterable)
'''Return True if bool(x) is True for any x in the iterable.
If the iterable is empty, return False.'''
print( any([1,'0','']) ) # 把对象变成可打印的字符串形式,如存在中文字符,则用二进制表示;repr则所见即所得
# ascii(object);repr(object)
print(ascii({'name':'wong','age':23,'您好':''}))
print([repr([1,2,3,'22','您好'])]) # 把int对象转换成二进制
# bin(number:int)
'''Return the binary representation of an integer.'''
print( bin(256) ) # 判断对象是否可调用,如函数是可调用的
# callable(object)
def calla():print("It is callable...")
print( callable(calla) ) # 使用序号i返回一个字符的Unicode字符串
# chr(i)
print(chr(1111)) # 打印给定对象的所有方法
# dir(object)
print( dir([1,2,3]) ) # 返回一个元组,关系:((x-x%y)/y, x%y)
# divmod(number,numbre)
print( divmod(22.22,23) ) #退出程序
import time
time.sleep(1)
exit("退出程序") # 为集合体元素进行编号一一对应
dict = {'name':'Wong','age':23,'sox':'man'}
print(dict)
for k,v in enumerate(dict):
print(k,v,dict[v]) # 在全局和本地语境中评估给定的源。
#eval() # 在全局和本地语境中执行给定的源。
#exec() # 格式化输出
print("My name is {_name}".format(_name="Wong")) # 过滤可迭代对象中的元素生成一个迭代器
s = filter(lambda x:x==1,range(10)) #
print(s)
for s1 in s:
print(s1) # 对可迭代对象中的元素进行计算生成一个迭代器
g = map(lambda x:x*5,range(10))
print(g)
for g1 in g:
print(g1) # 返回包含当前作用域全局变量的字典
print(globals())
# 返回包含当前作用域局部变量的字典
print(locals())
# 没有参数时,返回当前作用域局部变量的字典,相当于locals()
print(vars()) # 返回一个对象的哈希值
# hash(object)
list = []
for i in ['1','666','2','3','45',33]:
print(hash(i))
list.append(hash(i))
list.sort()
print(list) # 查看帮助
# help(object)
help(dict) # 返回int对象的16进制
# hex(int)
print(hex(111)) # 判断对象是否属于哪个类型
# isinstance(object,union)
print(isinstance('11',int))
from collections import Iterator,Iterable
print(isinstance('asdfg',Iterable))
print(isinstance('asdfg',Iterator)) # 用户输入
# input()
name = input("您的名字是:")
print(name) # 返回对象的内存地址
# id(object)
print(id('name')) # 把可迭代对象变成迭代器
# iter(iterable)
list = [1,2,34,5]
list = iter(list)
print(list) # 计算集合体的长度
# len(list)等,可迭代对象?
print(len({'name':"wong",'age':23})) # 版本作者等信息
copyright()
credits()
license() # 取可迭代对象中的最大值
# max(Iterable)
print(max({'name':'wong','age':23})) # 取可迭代对象中的最小值
# min(Iterable)
print(min({'name':'wong','age':23})) # 打开文件
# open(file,mode,encoding)
f = open('test','r')
f.close() # 返回int对象的八进制表示
# oct(int)
print(oct(64)) # 通过单个字符,返回ascii表的对应编号
# ord(str)
print(ord('@') # 打印内容
# print("你想表达的内容")
print("打印") # 按如下公式计算
# Equivalent to x**y (with two arguments) or x**y % z (with three arguments)
# pow(int, int, *int)
print(pow(2,8,127)) # 退出程序,指定退出程序code
# quit(code)
count = 0
while True:
print("你是风儿我是沙,缠缠绵绵走天涯...")
if count >1000:
quit(4)
count += 1 # 反转集合体内元素并生成一个迭代器
# reversed(sequence)
rev_iter = reversed([1,2,33,4])
print(rev_iter)
for _i in rev_iter:
print(_i) # 设置数字的精确位,会四舍五入算法
# round(number, ndigits=None)
print(round(23.266655555,5)) # 排序可迭代对象内的元素
# sorted(Iterable)
print(sorted([1,2,44,5,66,7])) # 求和
# sum(int)
print(sum([1,2,3,44,5])) # 将多个可迭代对象的元素一一对应形成一个元组,生成一个迭代器,长度以最小元素的可迭代对象为准
# zip(Iterable1,Iterable2,Iterable3...)
print(zip([1,2,3,55,6]))
for iz in zip([1,2,3,55,6],{'name':'wong','age':23}):
print(iz)
5、可序列化
# -*- coding:utf-8 -*-
# Author:Wong Du '''
序列化
序列化可将非字符串的数据类型的数据进行存档,如字典、列表甚至是函数等等
反序列化,将通过序列化保存的文件反序列化即可得到数据原本的样子,可直接使用
python中序列化的方式:
json:只可序列化简单的数据类型,如字典、列表等,其他语言也有json,即json可跨语言进行序列和反序列化
pickle:python独有的序列化,可序列化一切数据,以二进制的形式保存
python中json和pickle的用法基本上是一模一样的
''' dict = {'name':'wong','age':'23'} # with open('test','w') as f:
# f.write(dict)
### 报错:TypeError: write() argument must be str, not dict '''
### 把字典用json序列化后写入文件
### json.dumps(obj); json.dump(obj, fp)
### f.write(json.dumps(dict)) == json.dump(dict,f)
'''
import json
with open('test','w') as f:
# f.write(json.dumps(dict))
json.dump(dict,f)
### 成功写入 '''pickle序列化'''
import pickle
def foo():
print("In the foo...")
foo()
with open('test2','wb') as f: #以二进制字节类型写入到文件当中,所以mode = 'wb'
# f.write(pickle.dumps(foo))
pickle.dump(foo,f)
### 写入成功!注意,这里的写入是把foo函数对象写入到文件当中,反序列化后,当代码里没有foo函数对象,则会报错 list = [1,2,3,4,'name']
with open('test3','wb') as f:
# f.write(pickle.dumps(list))
pickle.dump(list,f)
序列化
# -*- coding:utf-8 -*-
# Author:Wong Du '''
序列化
序列化可将非字符串的数据类型的数据进行存档,如字典、列表甚至是函数等等
反序列化,将通过序列化保存的文件反序列化即可得到数据原本的样子,可直接使用
python中序列化的方式:
json:只可序列化简单的数据类型,如字典、列表等,其他语言也有json,即json可跨语言进行序列和反序列化
pickle:python独有的序列化,可序列化一切数据,以二进制的形式保存
''' # with open('test','r') as f:
# print(f.read())
# f.read()['name']
### 报错:TypeError: string indices must be integers '''
### json反序列化读取文件内容,可直接获取到字典,进行元素调用
### json.loads(str); line = json.load(fp)
### line = json.loads(f.read()) == line = json.load(f)
'''
import json
with open('test','r') as f:
# line = json.loads(f.read())
line = json.load(f)
print(type(line))
print(line['age'])
### 成功调用
'''
输出:
<class 'dict'>
23
''' import pickle
def foo():
print("In the foo2...")
with open('test2','rb') as f: #以二进制字节类型读取文件内容,所以mode = 'rb'
# line = pickle.loads(f.read())
line = pickle.load(f)
line() with open('test3','rb') as f:
# line = pickle.loads(f.read())
line = pickle.load(f)
print(type(line))
print(line[4])
反序列化
6、项目规范化
1 App/
2 bin/
3 app
4 conf
5 conf.py
6 app
7 test
8 __init__.py
9 main.py
10 main.py
11 __init__.py
12 setup.py
13 requirement.txt
14 readme/README
LearnPython_week4的更多相关文章
随机推荐
- OO_JAVA_表达式求导_单元总结
OO_JAVA_表达式求导_单元总结 这里引用个链接,是我写的另一份博客,讲的是设计层面的问题,下面主要是对自己代码的单元总结. 程序分析 (1)基于度量来分析自己的程序结构 第一次作业 程序结构大致 ...
- 零基础入门之Linux进程基础
计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等.这些最基础的计算机动作被称为指令(instruction).所谓的程序(program),就是这样一系列指 ...
- linux c语言 rename的用法-rename() does not work across different mount points, even if the same file system is mounted on both
最近在一个项目上执行文件的搬移功能时发现总是失败,临时录像文件存放于emmc的/tmp/目录下,当录像完成时候则调用rename企图将此文件搬到/mnt/sdcard/mmcblk1p1/(这是外置的 ...
- hdu 5057 Argestes and Sequence (数状数组+离线处理)
题意: 给N个数.a[1]....a[N]. M种操作: S X Y:令a[X]=Y Q L R D P:查询a[L]...a[R]中满足第D位上数字为P的数的个数 数据范围: 1<=T< ...
- 如何反编译微信小程序👻
如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...
- vue路由监听和参数监听
1.路由携带数据跳转 routerAction(hideDisplays, data) { switch (hideDisplays) { case "pubAccountMenu" ...
- redis 集群环境搭建
原理: 1,每个Redis群集的节点都需要打开两个TCP连接,由于这两个连接就需要两个端口,分别是用于为客户端提供服务的常规Redis TCP命令端口(例如6379)以及通过将10000和命令端口相加 ...
- clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
修改文件 /etc/sysconfig/nfs将#MOUNTD_PORT=892开启防火墙端口:firewalld-cmd --add-port=892/tcp
- Spring一套全通—工厂
百知教育 - Spring系列课程 - 工厂 第一章 引言 1. EJB存在的问题 2. 什么是Spring Spring是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式 轻量级 1. 对于 ...
- 设计模式学习-使用go实现原型模式
原型模式 定义 代码实现 优点 缺点 适用场景 参考 原型模式 定义 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复 ...