004 python 函数,模块知识点运用示例
1. 给定验证码长度n,生成随机验证码,验证码由数字、字母组成(参考chr()内置方法)
```python
# 第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母
# 97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
import random
def identify_code(n):
icode ='' for i in range(n):
# s1=chr(random.randint(65,90))
# s2=chr(random.randint(48,57))
s1 = chr(random.randrange(65, 90,1))
s2 = chr(random.randrange(97, 126, 1))
# s2 = chr(random.randrange(48, 57,1))
# s2 = str(random.randrange(0, 9, 1))
s3 = str(random.randint(0, 9))
icode +=random.choice([s1,s2,s3])
return icode print(identify_code(9))
```
2. 打印进度条,进度条图形如下图所示,以下代码为参考代码
```
#=========知识储备==========
#进度条的效果 [# ] [## ] [### ] [#### ]
#指定宽度
print('[%-15s]' %'#')
print('[%-15s]' %'##')
print('[%-15s]' %'###')
print('[%-15s]' %'####')
#打印%
print('%s%%' %(100))
#第二个%号代表取消第一个%的特殊意义
#可传参来控制宽度
print('[%%-%ds]' %50)
#[%-50s]
print(('[%%-%ds]' %50) %'#')
print(('[%%-%ds]' %50) %'##')
print(('[%%-%ds]' %50) %'###')
1,别人做的答案
import time
a = 5 # a为宽度省略号宽度
str = 0
for i in range(a):
str += '#' time.sleep(1)
print(('\r[%%-%ds]' % a) % str, end='')
2,这是网上答案
import sys
import time
def progress(percent,width=50):
if percent >= 1:
percent=1
show_str=('[%%-%ds]' %width) %(int(width*percent)*'#')
print('\r%s %d%%' %(show_str,int(100*percent)),file=sys.stdout,flush=True,end='')
#=========应用==========
data_size=1025
recv_size=0
while recv_size < data_size:
time.sleep(0.1)
#模拟数据的传输延迟
recv_size+=1024 #每次收1024
percent=recv_size/data_size #接收的比例
progress(percent,width=70) #进度条的宽度70
```
3. 装饰器应用练习
1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')
转成字典格式
1 定义一个字典看用户登录状态 2 auth_status={ 3 'user':None, 4 'status':False#状态是没有登录 5 } 6 def wrapper(fun): 7 def inner(*args,**kwargs): 8 if auth_status['status']:#如果登录了,就执行fun函数 9 ret = fun(*args, **kwargs) # index/home 10 return ret 11 else:#如果没有登录,就实现认证功能 12 username = input('name:>>').strip()#获取用户名 13 password = input('password:>>').strip()#获取密码 14 f=open('login.txt','r',encoding='utf-8')#打开文件获取用户的信息 15 user_dic=f.read()#读出来的是字符串类型 16 zhddict=eval(user_dic)#转换成字典类型 17 #print(type(zhddict))#查看eval转换后的类型 18 if zhddict.get(username) and password == zhddict[username]:#如果用户名和密码都正确,就显示登陆成功,不正确就显示登录失败 19 print('login successful') 20 auth_status['user']=username #登陆成功后就把用户名放在user里 21 auth_status['status']=True 状态改为True 22 ret = fun(*args,**kwargs)#index/home 23 return ret 24 else: 25 print('login faild') 26 return inner 27 @wrapper #语法糖 28 def index(): 29 print("欢迎来到首页") 30 31 @wrapper 32 def home(): 33 print("欢迎回家") 34 35 index() 36 index() 37 home() 38 index()
2.编写下载网页内容的函数,
要求功能是:用户传入一个url,函数返回下载页面的结果
编写装饰器,实现缓存网页内容的功能:
具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,
否则,就去下载,然后存到文件中
1 from urllib.request import urlopen 2 url_l=[]#存放 3 def huancun(func): 4 ''' 5 实现缓存网页内容的功能 6 ''' 7 def inner(*args,**kwargs):#args传的就是url,那么得到url就得用url = args[0] 8 url = args[0] # 取url 9 filename=str(hash(url))#用hash算法吧url转换为数字作为文件名,但是数字不能作为文件名,必须转换成str类型 10 if url in url_l:#如果url已经在列表里了,就说明你已经下载过了,就不需要在执行func了,就直接打开就行了 11 f=open(filename,'rb') 12 ret=f.read() 13 else:#如果不在列表里就要把添加到url列表 14 url_l.append(url) 15 ret = func(*args, **kwargs) 16 f=open(filename,'wb')#打开文件 17 f.write(ret)#并且用写的方式把它写进文件里 18 f.close() 19 return ret 20 return inner 21 22 23 @huancun#get=huancun(get) 24 def get(url):#定义一个get函数 25 return urlopen(url).read()#返回读取的网页 26 print(get('http://www.people.com.cn')) 27 print(get('http://www.people.com.cn'))#调用get方法,传一个'http://www.people.com.cn'网址进去 28 print(get('http://www.people.com.cn'))