王振2020-5-14笔记

#### 迭代器 能被next函数 调用,并且不断返回下一个值的对象,叫迭代器
'''
概念:迭代器就是迭代取值的工具,迭代是一个重复的过程
	每一次重复都是基于上一次的结果,单纯的重复不是迭代
特征:不依赖索引,通过next指针迭代所有数据,一次只取一个,可以大大节省空间,迭代无限量数据


'''
#(1)可迭代对象 (如果成员中含有 __iter__这个方法,就是可迭代对象)
setvar = {"a",1,"b",2}
for i in setvar:
	print(i)
	
dir函数可以查看一个对象中所有成员
res = dir(setvar)
print(res)

#(2)迭代器
'''
for循环遍历数据就是利用了迭代器,通过next方法进行调用,从而获取数据
可迭代对象 和迭代器之间的关系:从不可被直接获取-->可被直接获取的过程

'''
1.如何定义迭代器
(1)iter 方法  (前提是必须是一个可迭代对象)
(2)用__iter__()


2.如何判断一个迭代器
用dir查看,如果成员中有__iter__和__next__两个方法,就可以判断是一个迭代器


3.如何调用一个迭代器
(1)next方法调用--->是单向不可逆的过程
(2)迭代器.__next__()
(3)for循环 遍历迭代器


4.重置迭代器
it = iter(setvar)
res = next(it)
print(res)

5.使用iterator(迭代器类型) 和 iterable(可迭代对象) 来判断是否是迭代器
from collections import iterator,iterable

<-------------------------------------------------------------------------->
###   高阶函数 :能够把函数当成参数传递的就是高阶函数
    ( map , filter , reduce , sorted )

'''
map (func ,iterable)
功能
	把iterable里面数据一个一个拿出来,放到func函数中进行处理,处理结果扔到迭代器中,返回迭代器
参数
	func 自定义函数 或者内置函数
	iterable 可迭代对象
返回值:
	迭代器


'''
## map 改写
it = map(int,lst)
lst = list(it)
print(lst)

#####  3. 
dic = {97:"a",98:"b",99:"c"}
lst = ["a","b","c"]
def func(n):
	dic1 = {}
	for k,v in dic.items():
		dic1[v] = k
	
	return dic1(n)
it = map(func,lst)
print(list(it))

<-------------------------------------------------------------------------->
##### filter
'''
filter(func,iterable)
功能:
	在自定义函数里,过滤数据
	如果返回真,代表数据保留
	如果返回假,代表舍弃该数据
参数:
	func自定义函数
	iterable 可迭代性数据
返回值:
	迭代器

'''
#  filter 改写
lst = [1,2,3,4,5,6,7,8]
(1)
def func(n):
	if n % 2 == 0:
		return False
	else:
		return True
it = filter(func,lst)
print(list(it))

(2)
it = (lambda n : True if n % 2 == 1 else False,lst) 
print(list(it))

<----------------------------------------------------------------------->
####   reduce
'''
reduce(func,iterable)
功能:
	一次性从iterable中拿出2个值,扔到func函数中处理,
	把运算结果拿出来,再和iterable中的第三个值运算...
	最后返回计算的结果
参数:
	func 自定义函数
	iterable 可迭代性数据

返回值:
	最后计算的结果

'''

### reduce 改写
from functools import reduce
lst = [5,4,8,8]
def func(x,y,):
	return x*10 + y
res = reduce(func,lst)
print(res)

<------------------------------------------------------------------------>
### sorted
sorted(iterable,reverse=True,key = 函数)
功能:
	排序
参数:
	iterable 可迭代性数据
	reverse 代表是否倒叙,,,从大到小排序,,reverse=False,代表正序
	key   自定义函数或者内置函数

返回值:
	排序后的结果

### 1.
lst = [100,200,13,-6,0]
sorted(lst)
lst2 = sorted(lst)
print(lst2)

### 2.   sorted  也可以排序 元组,集合,字符串,字典,
   排完顺序后一定是列表
   排序字典时候,排列的是字典的键
   
### 3.倒序排列,从大到小排序
lst2 =  sorted(lst,reverse = True)
print(lst2)

### 4.通过内置函数排序
 按照绝对值排序,  abs
lst = [-200,-300,9,20]
sorted(lst,key = abs)

### 5.通过自定义的函数进行排序
按照余数排序
def func(n):
	return n % 10
sorted(lst,key = func)

总结:
sort   基于原有的列表进行排序,只限定列表类型
sorted 所有的容器类型数据都可以排序,返回一个全新的列表



######  登录小程序  ######

#存放账户
acountlist = []
pwdlist = []
blacklist = []


sign = True
while sign:
	username = input("请输入用户名")
	print(username)
	
	#获取文件里面的账户密码
	with open("user.txt",mode = "a+",encoding="utf-8") as fp:
		fp.seek(0)
		lst = fp.readlines()
		print(lst)
		
		#提取文件里面的账户和密码
		for i in lst:
			acount,pwd = i.strip().split(":")
			acountlist.append(acount)
			pwdlist.append(pwd)
			
			
	#2.判定是否存在该用户
	if username in acountlist:
	
	
		#3.判定是不是黑用户
		with open("block.txt",mode = "a+",encoding="utf-8") as fp:
			fp.seek(0)
			lst = fp.readlines()
			for i in lst:
				blacklist.append(i.strip())
		print(blacklist)
		
		if username in blacklist:
			print("抱歉,您的账户被冻结...")
		else:
			num = accountlist.index(username)
		
		
			#检查输入的次数为三次
			times = 0
			while times < 3:
				pwd = input("请输入您的密码:")
				if pwd == pwdlist[num]:
					#如果都正确,程序结束
					print("恭喜你,登录成功")
					sign = False
					break
				else:
					print("密码输入错误,您还剩下%s次机会" % (2-times))
					if times == 2:
						print("因为密码错了三次,您的账户被冻结")
						#记录黑名单文件中
						with open("black.txt",mode="a+",encoding="utf-8") as fp:
							res = username + "\n"
							fp.write(res)
						
				times += 1
	
	else:
		print("该用户根本不存在")



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值