一.判断
# 非空即真、非0即真 # 不为空的话就是true,是空的话就是false # 只要不是0就是true,是0就是false # 布尔类型 # True False name = input('请输入你的名字:').strip() a = [] #false d={} # false c = 0 #false f = tuple() #false e='' #false if name: #name里面有没有东西, print('name不是为空的。。') else: print('输入不能为空。。') # a = b = c = 0 #定义了3个变量 ,值都是0
二.交换变量
a = 1 b = 2 #交换变量如果不定义第三个变量的方法: a = a+b # 3 b = a-b # 1 a = a-b # 2 print(a,b) #python中的做法: b,a= a,b #交换两个变量的值,Python底层帮你引入了一个的第三方变量在交换, 多个变量交换也可以 如: a,b,c=b,c,a
print(a,b)
三. 字符串方法:
print(a.index('t')) #找下标 print(a.find('t')) #找下标 # 1 find()方法:查找子字符串,若找到返回从0开始的下标值,若找不到返回-1 info = 'abca' print( info.find('a'))##从下标0开始,查找在字符串里第一个出现的子串,返回结果:0 info = 'abca' print (info.find('a',1))##从下标1开始,查找在字符串里第一个出现的子串:返回结果3 info = 'abca' print( info.find('333'))##返回-1,查找不到返回-1 # 2 index()方法: # python 的index方法是在字符串里查找子串第一次出现的位置,类似字符串的find方法,不过比find方法更好的是,如果查找不到子串,会抛出异常,而不是返回-1 info = 'abca' print(info.index('a')) print(info.index('33')) # rfind和rindex方法用法和上面一样,只是从字符串的末尾开始查找。 print(a.replace('t','T')) #替换 print(a.isdigit()) #是否全都是数字 print(a.islower()) #是否全都是x小写字母 print(a.isupper()) #是否全都是大写字母 print(a.isalpha()) #是否全都是汉字或者字母 print(a.isalnum()) #只要里面没有特殊符号,就返回true &… print(a.upper()) #变成大写 print(a.lower())#变成小写 print(a.startswith('test')) #以xx开头 print(a.endswith('.xls')) # 以xx结尾 import string print(string.ascii_lowercase) #所有的小写字母 print(string.ascii_uppercase) #所有大写字母 print(string.digits) #所有的数字 print(string.ascii_letters) #所有大写字母和小写字母 print(string.punctuation) #所有的特殊字符 l=['zhang','liu','liang'] res = ','.join(string.ascii_lowercase) #1、它把一个list变成了字符串 #2、通过某个字符串把list里面的每个元素连接起来 #3、只要是可以循环的,join都可以帮你连起来 names='abcd' print(list(names)) name_list = names.split()#根据某个字符串,分割字符串,什么也不传的话,是以空格分割的 print(name_list) user='牛寒阳' sex='男' age=18 addr='回龙观' money= '1000w' cars='1w台' # words = 'insert into user values ("%s","%s","%s","%s","%s","%s");'%(user,sex,age,addr,money,cars) sql = 'insert into user values ("{name}","{sex}","{age}","{addr}","{qian}","{che}");' new_sql = sql.format(age=age,che=cars,name=user,sex=sex,qian=money,addr=addr) print(new_sql) print('欢迎登录'.center(50,'*'))
print('1'.zfill(4)) #自动补足4位,前面补0
四.深拷贝,浅拷贝
# int float list dict tuple set # 天生去重 import copy #浅拷贝 #深拷贝 lis = [1,1,2,3,4,5,6,8] l2 = copy.deepcopy(lis) #深拷贝 # l2 = lis #浅拷贝 print(id(lis)) print(id(l2)) #id和lis的不同 l2.append('aaa') lis.remove(8) print(lis) print(l2) # print(id(l)) print(id(l2)) #浅拷贝和深拷贝的区别就是深拷贝会重新开辟一个内存空间,连个list相互独立不受影响 #动态循环删list里面的数据的时候,结果会不正确 l=[1,1,2,3,4,5,6,8] # 0 1 2 3 4 5 6 7 第一次取下标0的元素1,然后删掉 # [1,2,3,4,5,6,8] # 0 1 2 3 4 5 6 第二次取下标1的元素2, 所以第一个元素被跳过了没有检查 print(l) for i in l: if int(i)%2!=0: l.remove(i) print(l) #[1, 2, 4, 6, 8] #为什么多了一个1?因为是根据下标循环list的,操作后元素的位置变了 #所以我们定义两个相同的list,用第二个循环,用第一个删除,结果就正确了,因为可以保证没有元素都被检查到了 l2=copy.deepcopy(l) for i in l2: if int(i)%2!=0: l.remove(i) print(l)
五.集合
# 集合天生就能去重,集合也是无序的 s=set() #空集合 s2 = set('1234445566778') # print(s2) s3 = {'1','1','3','4','5','6','7','9'} #自己定义一个集合,和字典的区别是字典有key:value #d = {'k':'v'} #字典 # 交集 并集 差集 # 就是两个集合相同的地方 print(s3 & s2) #取交集 print(s3.intersection(s2)) #取交集 #并集 # 就是把两个集合合并到一起,然后去重 print(s2 | s3) #取并集 print(s2.union(s3)) #取并集 s4 = {1,2,3} s5 = {1,4,6} #差集 #在一个集合里有,在另一个集合里面没有的 # S4里面有,s5里面没有的 # 取一个集合存在,另一个不存在的元素 print( s4 - s5) #取差集 print(s4.difference(s5)) #取差集 #对称差集 #俩集合里面都没有 #去掉俩集合里面都有的 print(s4 ^ s5) print(s4.symmetric_difference(s5)) s4.add('ss') #加元素 s4.pop()#随机删一个 s4.remove('ss')#指定删除哪个 s4.update({1,2,3}) #把另外一个集合加进去 s4.isdisjoint(s5)#如果没有交集的话返回true,可以用于判断是否不包含黑名单中的内容
学会了集合后,判断密码复杂性就更方便了:
# 校验密码里面是否包含 # 数字、大写字母、小写字母、特殊符号 import string nums_set = set(string.digits) upper_set = set(string.ascii_uppercase) lower_set = set(string.ascii_lowercase) pun = set(string.punctuation) for i in range(5): pwd=input('请输入密码:').strip() pwd_set = set(pwd) if pwd_set & nums_set and pwd_set & upper_set and pwd_set & lower_set and pwd_set & pun: print('密码是合法的',pwd) else: print('密码必须包含大写字母、小写字母、数字和特殊字符')
六.文件操作
# python 2 3 # file() #python2中有,python3中没有 #utf-8 bbk # 读模式 写模式 追加模式 f = open('names','r',encoding='utf-8') #python3和python2中都有 ,r模式指针在文件开头,读过后到末尾 print(f.read()) #读文件 # f.seek(0) print(f.readline()) #读取一行内容 # f.seek(0) print(f.readlines()) #是把文件的每一行放到一个list里面 # f.write('双方都')#写入 # f.seek(0) # print(f.read()) #只要沾上了r,文件不存在的就会报错 #只要沾上了w,都会清空原来的内容 # 读模式 r 读写模式 r+ #1、不能写 #2、文件不存在的话会报错 # 写模式 w 写读模式 w+ #1、文件不存在的话,会帮你新建文件 #2、打开一个已经存的文件,他会清空以前文件的内容 #3、不能读 # 追加模式 a 追加读模式 a+ #文件末尾去增加内容 # 1、文件不存在的话,会帮你新建文件 # 2、打开一个已经存的文件,不会清空,末尾增加 # 3、不能读
七.文件指针
# 文件指针: # 用来记录文件到底读到哪里了 f = open('naems','a+',encoding='utf-8') # a模式的文件指针是在末尾的 f.write('呵呵呵') f.seek(0) #移动文件指针到最前面 f.write('鹏妹妹') #移动完文件指针之后,是只能读,写的时候还是在文件末尾写 f.seek(0) print(f.read())
小练习,自动产生电话号码,并写入到一个文件中:
import random #18612343, #12384234 # 1861253 2945 print(random.randint(1,9999)) print('1'.zfill(4)) #自动补足4位,前面补0 #1、先随机产生一些手机号 #2、写到文件里面 f = open('phones.txt', 'w') num = input('请输入你要产生的手机号个数:') for i in range(int(num)): # start = '1861235' random_num = str(random.randint(1, 9999)) new_num = random_num.zfill(4)#补0 phone_num = start+new_num f.write(phone_num+'\n') f.close()
小练习:
#需求 # 1、监控日志,如果有攻击咱们的,就把ip加入黑名单 #分析: #1、打开日志文件 #2、把ip地址拿出来 #3、判断每一个ip出现的次数,如果大于100次的话,加入黑名单 #4、每分钟读一次 #直接循环一个文件对象的话,每次循环的是文件的每一行 #文件句柄 文件对象 import time point = 0 # 每次记录文件指针的位置 while True: all_ips = [] #存放所有的ip地址 f = open('access.log',encoding='utf-8') f.seek(point)#移动文件指针 for line in f: ip = line.split()[0] all_ips.append(ip) point = f.tell() #记录了指针的位置 all_ip_set = set(all_ips) # for ip in all_ip_set: if all_ips.count(ip)>50: print('应该加入黑名单的ip是%s'%ip) f.close() time.sleep(60) #暂停60秒 # for i in all_ips: # if all_ips.count(i)>100: # print('攻击的ip是%s'%i)
八.自动关闭文件
with open('geci','a+') as f: for line in f: pass
作业:
#1、写一个自动生成密码文件的程序
1、你输入几,文件里面就给你产生多少条密码
2、密码必须包括,大写字母、小写字母、数字、特殊字符
3、密码不能重复
4、密码都是随机产生的
5、密码长度6-11
http://www.nnzhp.cn/archives/150
随机数怎么用 参考 random模块怎么用
import random,string i = input("请输入需要产生的条数:") f = open("passwd.txt",'w') str = string.ascii_letters + string.punctuation + string.digits list = [] passwd_insert='' a = 0 while a<int(i): passwd_new = [] passwd_new.append(random.choice(string.digits)) passwd_new.append(random.choice(string.punctuation)) passwd_new.append(random.choice(string.ascii_lowercase)) passwd_new.append(random.choice(string.ascii_uppercase)) passwd_new=random.sample(str,random.randint(2,7)) + passwd_new random.shuffle(passwd_new) print(passwd_new) passwd_insert = ''.join(passwd_new) if list.count(passwd_insert): continue else: list.append(passwd_insert) f.write(passwd_insert + '\n') a+=1 f.close()
#2、写一个注册的程序,账号和密码都存在文件里面。
choice = input('请输入你的选择:1,注册2、删除用户3、登录')
#注册
输入
账号
密码
密码确认
# #需要校验用户是否存在,两次输入的密码,是否一致,为空的情况
#账号和密码都存在文件里面
#删除
输入一个用户名
#需要校验用户是否存在
#登录
输入账号密码登录
user_info = {} #存放所有的用户 with open('users.txt') as f: for line in f: # niuhanyang,123456\n line = line.strip() temp = line.split(',') username = temp[0] pwd = temp[1] user_info[username]=pwd for i in range(3): choice = input('请输入你的选择' '1、登录 2、注册 3、删除').strip() if choice=='1': username = input('username:').strip() pwd = input('pwd:').strip() if username and pwd: if username in user_info: if user_info.get(username)==pwd: print('登录成功') else: print('账号密码错误!') else: print("user not found!") else: print('账号密码不能为空!') elif choice=='2': username = input('username:').strip() pwd = input('pwd:').strip() cpwd = input('cpwd:').strip() if username and pwd and cpwd: if username in user_info: print('该用户已经被注册!') else: if pwd==cpwd: user_info[username]=pwd print('恭喜,注册成功!') else: print('两次输入的密码不一致!') else: print('不能为空!') elif choice=='3': username = input('username:').strip() if username: if username in user_info: user_info.pop(username) print('删除成功!') else: print('不能为空!') else: print("输入有误,请重新输入") else: with open('users.txt','w') as fw: for uname,pwd in user_info.items(): fw.write(uname+','+pwd+'\n')