一.判斷
# 非空即真、非0即真 # 不為空的話就是true,是空的話就是false # 只要不是0就是true,是0就是false# 布爾類型 # True False name = input('請輸入你的名字:').strip() a = [] #false d={} # false c = 0 #false f = tuple() #false e='' #falseif 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)#補0phone_num = start+new_num f.write(phone_num+'\n') f.close()
小練習:
#需求 # 1、監控日志,如果有攻擊咱們的,就把ip加入黑名單#分析:#1、打開日志文件#2、把ip地址拿出來#3、判斷每一個ip出現的次數,如果大于100次的話,加入黑名單#4、每分鐘讀一次#直接循環一個文件對象的話,每次循環的是文件的每一行 #文件句柄 文件對象 import timepoint = 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_newrandom.shuffle(passwd_new)print(passwd_new)passwd_insert = ''.join(passwd_new)if list.count(passwd_insert):continueelse: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\nline = 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]=pwdprint('恭喜,注冊成功!')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')
?