Python學習筆記(從零開始到放棄)(Python 入門)第一部分
目錄
賬號密碼登陸器(for,while,break,continue):
前言
自己學習python的學習記錄,自己學習python的歷程,有些東西知道就未記錄,程式碼都是自己手敲的,不斷學習,不斷記錄。
視訊地址:https://www.bilibili.com/video/av29247220/?p=58
或:https://www.bilibili.com/video/av13690129?p=59
參考:1. http://www.cnblogs.com/yuanchenqi/articles/5782764.html
2. http://www.cnblogs.com/resn/p/5776403.html
3. http://www.cnblogs.com/alex3714/articles/5465198.html
python基礎
變數
宣告變數
1 2 3 |
|
上述程式碼聲明瞭一個變數,變數名為: name,變數name的值為:"Alex Li"
變數定義的規則:
-
- 變數名只能是 字母、數字或下劃線的任意組合
- 變數名的第一個字元不能是數字
- 以下關鍵字不能宣告為變數名
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] - 變數名區分大小寫
九九乘法表實現
#九九乘法表
num = 1
while num <= 9:
first = 1
while first <= num:
print(str(num)+"*"+str(first)+'='+str(num*first),end="\t")
first += 1
num += 1
print()
註釋:
#
“”“。。。。。”“” :多行註釋,多行賦值
‘’‘。。。。。’‘’
msg = '''hello 1
hello 2
hello 3
'''
print(msg)
Pycharm設定:
程式碼開頭自動生成資訊:
pycharm多行註釋快捷鍵ctrl+?
格式化輸出
佔位符
%s s=string
%d d=digit
%f f= float
name = input('Name:')
age = int(input('Age:'))
job = input('Job:')
salary = input('Salary:')
if salary.isdigit(): #長得像不像數字,比如200d,200
salary = int(salary)
else:
#print('must input digit')
#exit()
exit('must input digit')
msg = '''
----------------info of %s----------------
Name:%s
Age:%s
Job:%s
Salary:%s
You will be retired in %s years
------------------end----------------------
'''%(name,name,age,job,salary,65-age)
print(msg)
賬號密碼登陸器(for,while,break,continue):
_user = "alex"
_passwd = 'abc123'
passed_authentication = False #假,不成立
for i in range(3):
username = input("username:")
password = input('password:')
if username == _user and password == _passwd:
print("Welcom %s login..." %_user)
passed_authentication = True
break #中斷
else:
print('Invalid username or password')
if not passed_authentication:#只有在False時執行
print('臭流氓')
_user = "alex"
_passwd = 'abc123'
for i in range(3):
username = input("username:")
password = input('password:')
if username == _user and password == _passwd:
print("Welcom %s login..." %_user)
break #中斷
else:
print('Invalid username or password')
else: #只要for迴圈正常執行完畢,就會執行else,若break打斷則不執行1
print('臭流氓')
_user = "alex"
_passwd = 'abc123'
counter = 0
while counter < 3:
username = input("username:")
password = input('password:')
if username == _user and password == _passwd:
print("Welcom %s login..." %_user)
break #中斷
else:
print('Invalid username or password')
counter += 1
else: #只要while迴圈正常執行完畢,就會執行else,若break打斷則不執行1
print('臭流氓')
_user = "alex"
_passwd = 'abc123'
counter = 0
while counter < 3:
username = input("username:")
password = input('password:')
if username == _user and password == _passwd:
print("Welcom %s login..." %_user)
break #中斷
else:
print('Invalid username or password')
counter += 1
if counter == 3:
keep_going_choice = input('還試嗎【y/n】')
if keep_going_choice == 'y':
counter = 0
else: #只要while迴圈正常執行完畢,就會執行else,若break打斷則不執行
print('臭流氓')
exit_flag = False
for i in range(10):
if i < 5:
continue
print(i)
for j in range(10):
print('layer2',j)
if j == 6:
exit_flag = True
break
if exit_flag:
break
列表和元組:
切片:
a = ['1','2','3','4','5']
#切片
print(a[1:]) #一直取到最後一個值
print(a[1:-1]) #一直取到倒數第二個值
print(a[1:-1:1]) #從左往右,以步長為1取值
print(a[1::2]) #從左往右,以步長為2取值
print(a[3::-1]) #從右往左取,負號表示反向取值
print(a[-2::-1]) #從倒數第二個值開始反向取值
新增:
#新增
a.append('6') #預設新增到list的最後
print(a)
a.insert(1,'1.5') #新增到指定位置,1是新增的位置(索引為1的位置)
print(a)
修改:
a = ['1','2','3','4','5']
#修改
a[1] = '二'
print(a)
a[1:3] = ['二','三']
print(a)
刪除:
#刪除
a.remove('2') #刪除指定的元素
a.remove(a[0])
print(a)
b = a.pop(1) #返回刪除的元素
print(a)
print(b)
del a[0]
print(a)
del a #刪除整個列表物件
列表方法:
count
#count
t = ['to','be','or','not','to','be' ].count('to') #計算元素出現的次數
print(t)
extend
#extend
a = [1,2,3]
b = [4,5,6]
a.extend(b) #把b新增到a
print(a)
print(b)
c = a + b #連線a,b生成新列表c
index
#index
t = ['to','be','or','not','to','be' ]
print(t.index('be')) #獲取元素的位置索引
first_be = t.index('be')
first_list = t[first_be+1:]
second_be = first_list.index('be')
print(first_be + second_be + 1) #取第二個be
reverse
#reverse
t = ['to','be','or','not','to','be' ] #倒置列表
t.reverse()
print(t)
sort
#sort
x = [4,6,2,7,3,8] #按Ascll碼從小到大排序
x.sort()
print(x)
x.sort(reverse=True) #按從大到小
print(x)
clear
清空列表,成空列表
身份確認
print(type(x) is list)
元組
與列表相比不可修改元組的內容。
#接收多個元素
a,b = [2,3]
print(a)
print(b)
購物車:
#購物車
product_list = [
('Mac',9000),
('kindle',800),
('tesla',90000),
('python book',105),
('bike',2000),
]
saving = input('please input your saving:')
shopping_car = []
if saving.isdigit():
saving = int(saving)
while True:
for i,v in enumerate(product_list,1): #列舉,新增序號,並從1開始
print(i,'>>>>>>>>>',v)
choice = input('input your choice number[exit:q]:')
#驗證輸入是否合法
if choice.isdigit():
choice = int(choice)
if 0 < choice <= len(product_list):
p_item = product_list[choice - 1]
if p_item[1] < saving: #如果本金足夠買該商品
saving -= p_item[1] #本金減去商品要花費的錢
shopping_car.append(p_item) #將商品存入購物車
else:
print('not sufficient funds,residue%s'%saving)
else:
print('there is no this number')
elif choice == 'q':
print('------------------you have buy---------------------')
for i in shopping_car:
print(i)
print('the money is residued %s'%saving)
break
else:
print('輸入不規範')
字典
鍵值對,無序儲存,鍵唯一。
增
#增
dic1 = {'name':'alex'}
dic1['age'] = 18
print(dic1)
dic1.setdefault('age',20) #檢查是否有age這個鍵了,若有則不修改
ret = dic1.setdefault('ae',20) #有age這個鍵了,則返回原age這個鍵對應的值,若沒有則怎加age鍵值對後,再返回age這個鍵對應的值
print(dic1)
print(ret)
查
#查 通過鍵去查對應的值
dic3 = {'age':18,'name':'alex','hobby':'girl'}
print(dic3['name'])
print(list(dic3.keys())) # 查所有的鍵
print(list(dic3.values())) #查所有的值
print(list(dic3.items())) #查所有鍵值對
改
#改
dic4 = {'age':18,'name':'alex','hobby':'girl'}
dic5 = {'1':'11','2':222,'age':20}
dic4.update(dic5) #用dic5的內容更新dic4,若dic4中不存在的就新增,若dic4中也有這個鍵,則覆蓋
print(dic4)
刪
#刪
dic4 = {'age':18,'name':'alex','hobby':'girl'}
del dic4['name']
print(dic4)
dic4.clear() #清空整個字典,空字典
print(dic4)
print(dic4.pop('age')) #返回值
print(dic4)
a = dic4.popitem() #刪除最後一個鍵值對,字典是無序的所以也叫隨機刪除,以元組的形式返回刪除的鍵值對
print(a,dic4)
其他操作
dict6 = dict.fromkeys(['host1','host2','host3'],['test2','test2']) #將第二項引數同意賦值給第一項,第一項為鍵
print(dict6) #{'host1': ['test2', 'test2'], 'host2': ['test2', 'test2'], 'host3': ['test2', 'test2']}
dict6['host2'][1] = 'test3' #想修改host2對應的值的第二項
print(dict6) #{'host1': ['test2', 'test3'], 'host2': ['test2', 'test3'], 'host3': ['test2', 'test3']}全修改了
排序
#排序
dic7 = {'1':'111','2':'110','0':'000'}
print(sorted(dic7))#['0', '1', '2']給鍵排序
print(sorted(dic7.values()))#['000', '110', '111'] 給值排序
print(sorted(dic7.items())) #[('0', '000'), ('1', '111'), ('2', '110')]按鍵給鍵值對排序
遍歷
#遍歷
dic4 = {'age':18,'name':'alex','hobby':'girl'}
for i in dic4:
print(i,dic4[i]) #age 18...
for i in dic4.items():
print(i) #返回元組的形式('age', 18)...
for i,v in dic4.items():
print(i,v) #age 18...
字串
也可以索引切片
重複列印字串
print('hello'*2)#重複列印 hellohello
判斷是否包含該內容
print('el' in 'hello') #判斷內容是否在字串中True,列表等也可以用in判斷
字串拼接
#字串拼接
a = '123'
b = 'abc'
c = a + b
print(c)#123abc
#join
c1 = ''.join([a,b])#拼接a和b字串
c2 = '*****'.join([a,b]) #用*****來拼接a和b字串
print(c1) #123abc
print(c2) #123*****abc
字串內建方法
#字串內建方法
st = 'hello kitty'
st1 = 'h\tello kitty'
st2 = 'hello kitty {name} is {age}'
print(st.count('1')) #統計元素個數
print(st.capitalize()) #首字母大寫
print(st.center(50,'-')) #列印50個字元,原字元居中,用-補足
print(st.endswith('y')) #判斷是否以y結尾
print(st.startswith('he')) #判斷是否以he開始
print(st1.expandtabs(tabsize=10)) #設定tab表示幾個空格
print(st.find('t')) #查詢到該元素第一個元素的位置,找不到返回-1
print(st2.format(name = 'alex',age = '37')) #hello kitty alex is 37
print(st2.format_map({'name':'alex','age':37}))#hello kitty alex is 37
print(st.index('t')) #查詢到該元素第一個元素的位置,找不到會直接報錯
print(st.isalnum()) #是否只包含數字和字母,漢字,有特殊字元(空格)返回False
print(st.isdigit()) #判斷是否是整形數字
print(st.isnumeric())#判斷是否是整形數字
print(st.isidentifier()) #判斷變數名是否非法
print(st.islower()) #判斷是否全小寫
print(st.isupper()) #判斷是否全大寫
print(st.isspace()) #判斷是否為空格
print('My Title'.istitle()) #判斷是否符合標題格式
print('My Title'.lower()) #大寫變小寫
print('My Title'.upper()) #小寫變大寫
print('My Title'.swapcase()) #大小寫反轉
print('My Title'.ljust(50,'*'))#My Title******************************************
print('My Title'.rjust(50,'*'))#******************************************My Title
print(' My Title'.strip())#去除開頭和末尾的空格與換行符,製表符
print(' My Title'.lstrip())#去左
print(' My Title'.rstrip())#去右
print('My Title'.replace('itle','lesson'))#替換
print('My Title Title'.replace('itle','lesson',1))#替換第一個
print('My Title Title'.rfind('t'))#找到右邊開始的第一個t的索引,11
print('My Title Title'.split(' '))#以空格分割字串,['My', 'Title', 'Title']
print('My Title Title'.rsplit('t',1)) #以右邊開始分割,分割1次['My Title Ti', 'le']
print('My title title'.title()) #轉換成標題格式,My Title Title
三級選單
簡單版
menu = {
'北京':{
'朝陽':{
'國貿':{
'CICC':{}
},
'望京':{
'陌陌':{},
'賓士':{}
}
}
},
'上海':{
}
}
back_flag = False
exit_flag = False
while not back_flag and not exit_flag:
for key in menu:
print(key)
choice = input('>>:').strip()
if choice in menu:
while not back_flag and not exit_flag:
for key2 in menu[choice]:
print(key2)
choice2 = input('>>:').strip()
if choice2 == 'b':
back_flag = True
if choice2 in menu[choice]:
while not back_flag and not exit_flag:
for key3 in menu[choice][choice2]:
print(key3)
choice3 = input('>>:').strip()
if choice3 == 'b':
back_flag = True
if choice3 in menu[choice][choice2]:
while not back_flag and not exit_flag:
for key4 in menu[choice][choice2][choice3]:
print(key4)
choice4 = input('>>:').strip()
print('last level')
if choice4 == 'b':
back_flag = True
if choice4 =='q':
exit_flag = True
else:
back_flag = False
else:
back_flag = False
else:
back_flag = False
進階版
#__author:"Shao Dongheng"
#date:2018/11/1
menu = {
'北京':{
'朝陽':{
'國貿':{
'CICC':{}
},
'望京':{
'陌陌':{},
'賓士':{}
}
}
},
'上海':{
}
}
current_layer = menu #記錄前層,用於迴圈
#parent_layer = menu
parent_layers = [] #儲存父層
while True:
for key in current_layer:
print(key)
choice = input('>>:').strip()
if len(choice) == 0:continue
if choice in current_layer:
#parent_layer = current_layer #將改之前的current_layer賦給parent_layer
parent_layers.append(current_layer)
current_layer = current_layer[choice] #修改成子層
elif choice == 'b':
#current_layer = parent_layer #子層得到父層的值
if parent_layers: #如果列表不為空
current_layer = parent_layers.pop()
else:
print('無此項')
編碼解碼
python3:
預設是unicode。
encode 在編碼的同時,會把資料轉換成bytes型別;
decode 在解碼的同時,會把bytes型別轉換成字元。
檔案操作
小重山
昨夜寒蛩不住鳴。
驚回千里夢,已三更。
起來獨自繞階行。
人悄悄,簾外月朧明。
白首為功名,舊山松竹老,阻歸程。
欲將心事付瑤琴。
知音少,絃斷有誰聽。
讀
data = open('小重山','r',encoding='utf8').read()
f = open('小重山','r',encoding='utf8') #讀模式只能讀,寫模式只能寫
#data = f.read()
data = f.read(5)#取前5個字元
print(data)
f.close()
f = open('小重山','r',encoding='utf8') #讀模式只能讀,寫模式只能寫
print(f.readline())
print(f.readline())#會接著讀下一行
f.close()
f = open('小重山','r',encoding='utf8') #讀模式只能讀,寫模式只能寫
print(f.readlines())#讀整個檔案,返回列表['昨夜寒蛩不住鳴。\n', '驚回千里夢,已三更。\n', '起來獨自繞階行。\n',
# '人悄悄,簾外月朧明。\n', '白首為功名,舊山松竹老,阻歸程。\n', '欲將心事付瑤琴。\n', '知音少,絃斷有誰聽。']
f.close()
f = open('小重山','r',encoding='utf8') #讀模式只能讀,寫模式只能寫
for i in f.readlines():
print(i.strip()) #因為檔案中的每一句有一個預設換行,print也有一個自動換行,所以去掉預設換行
f.close()
f = open('小重山','r',encoding='utf8') #讀模式只能讀,寫模式只能寫
for i in f: #內部將f作為迭代器,用一個用一個,用一行取一行,但如果要用enumerate()只能是f.readlines
print(i.strip()) #因為檔案中的每一句有一個預設換行,print也有一個自動換行,所以去掉預設換行
f.close()
寫
f = open('小重山','w',encoding='utf8') #會清空檔案中的內容
f.write('hello world')
f.close()
f = open('小重山2','w',encoding='utf8') #建立了一個空檔案
print(f.fileno()) #返回一個整數,檔案描述符,每個檔案唯一
f.write('hello world')
f.write('alex\n')#hello worldalex直接跟在上一句後面
f.write('alex') #新增換行符才能換行
f.close()
新增
f = open('小重山2','a',encoding='utf8')#向檔案新增內容,不可讀
f.write('hello world')#直接跟在上一句後面
f.close()
游標
f = open('小重山','r',encoding='utf8')
print(f.tell())
print(f.read(4))
print(f.tell()) #游標的位置,字母是返回4,中文返回12
f.seek(3)#移動游標位置到3處,由於是中文,移動一個字元要移動3位元組的游標
print(f.tell())
print(f.read())#從游標位置3處開始讀,即第二個中文開始
f.close()
可讀可寫
#r+,w+,a+
f = open('小重山','r+',encoding='utf8') #可讀可寫,從頭開始讀
print(f.readline())
f.write('岳飛') #緊跟在檔案末尾新增內容
f.close()
f = open('小重山2','w+',encoding='utf8') #先清空,可讀可寫
print(f.readline())
f.write('岳飛')
print(f.tell()) #6,寫的時候,游標也移動了
print(f.readline())#游標在文字後面,所以讀不到東西
f.close()
f = open('小重山2','a+',encoding='utf8') #a是從檔案最後開始向檔案追加內容的,游標在最後,可讀可寫
f.write('岳飛')
print(f.readline())#也讀不到東西
f.close()
修改
修改檔案內容:
得先取出所有內容,在修改後存回去,因為write只會在檔案末尾新增內容
f_read = open('小重山2','r',encoding='utf8')
f_write = open('小重山3','w',encoding='utf8')
num = 0
for line in f_read:
num += 1
if num == 5:#修改第五行內容
line = ''.join([line.strip(),'alex\n'])#在句尾新增alex
f_write.write(line)
字典等型別存入檔案
#字典等型別存入檔案
a = str({'beijing':{'1':111}}) #轉換成字串
print(type(a))
print(a)#輸出的是字串 '{'beijing':{'1':111}}'
a = eval(a)
print(type(a))
print(a) #輸出{'beijing':{'1':111}}
with
#with 不需要close
with open('log','r') as f:
f.readline()
#同時管理多個檔案物件
with open('log1','r') as f_read,open('log2','w') as f_write:
for line in f_read:
f_write.write(line)
ubuntu
以後補吧。先用什麼查什麼。
。。。
Python進階基礎
深淺拷貝
淺拷貝
s = [1,'alex','alvin']
print(s)
s1 = s #讓s1也指向該列表,並不是拷貝了資料
s1[0] = 2
print(s1) #[2, 'alex', 'alvin']
print(s) #s1的修改影響s,[2, 'alex', 'alvin']
s2 = s.copy() #淺拷貝
s2[0] = 3
print(s2) #[3, 'alex', 'alvin']
print(s) #s2的修改不影響S,[2, 'alex', 'alvin']
#淺拷貝
ss = [[1,2],'alex','alvin']
ss1 = ss.copy()
print(ss1)
ss1[0] = 'linux' #修改拷貝資料的第一層
print(ss1) #['linux', 'alex', 'alvin']
print(ss) #[[1, 2], 'alex', 'alvin'],淺拷貝沒改變原資料第一層的資料
ss = [[1,2],'alex','alvin']
ss1[0][1] = 3
print(ss1)#[[1, 3], 'alex', 'alvin']
print(ss) #[[1, 3], 'alex', 'alvin'],淺拷貝修改拷貝資料第二層,會使源資料第二層也被改變
深拷貝
import copy
a = [[1,2],'alex','alvin']
a1 = copy.copy(a) #淺拷貝,修改第二層的拷貝資料會改變原資料,(修改第一層不會)
a1[0][1] = 4
print(a) #[[1, 4], 'alex', 'alvin']
print(a1) #[[1, 4], 'alex', 'alvin']
a2 = copy.deepcopy(a) #深拷貝,修改拷貝資料不會改變原資料
a2[0][1] = 5
print(a) #[[1, 4], 'alex', 'alvin']
print(a2) #[[1, 5], 'alex', 'alvin']
集合set
hash
一個物件能被稱為 hashable , 它必須有個 hash 值,這個值在整個生命週期都不會變化,而且必須可以進行相等比較,所以一個物件可雜湊,它必須實現__hash__() 與 __eq__() 方法。
Python 的某些連結庫在內部需要使用hash值,例如往集合中新增物件時會用__hash__() 方法來獲取hash值,看它是否與集合中現有物件的hash值相同,如果相同則會捨去不加入,如果不同,則使用__eq__() 方法比較是否相等,以確定是否需要加入其中。
對於 Python 的內建型別來說,只要是建立之後無法修改的(immutable)型別都是 hashable 如字串,可變動的都是 unhashable的比如:列表、字典、集合,他們在改變值的同時卻沒有改變id,無法由地址定位值的唯一性,因而無法雜湊。我們自定義的類的例項物件預設也是可雜湊的(hashable),而hash值也就是它們的id()。
作者:三十六_
連結:https://www.jianshu.com/p/bc5195c8c9cb
集合的建立
#集合的建立
#無序,不重複
a = {'alex li','a'}
print(a) #{'a', 'alex li'}
print(type(a)) #<class 'set'>
s = set('alex li')
print(s) #{'x', ' ', 'e', 'a', 'l', 'i'} 去除了重複的l
s1 = ['alex','1']
ss = set(s1) #列表轉集合
print(ss) #{'1', 'alex'}
s2 = list(s1) #轉換成列表
print(s2) #['alex', '1']
li = [[1,2],2,'alex']
s3 = set(li) #TypeError: unhashable type: 'list',不可hash的元素不能轉集合
print(s3)
集合的修改
#修改集合
s1 = ['alex','1']
ss = set(s1) #列表轉集合
ss.add('uu') #新增一個元素
print(ss) #{'uu', 'alex', '1'}
ss.update('ops')
print(ss) #{'s', 'alex', 'p', 'uu', 'o', '1'} #將字串的每個元素當單獨元素新增
ss.update([12,'eee']) #新增多個
print(ss) #{'s', '1', 'p', 'uu', 'eee', 12, 'o', 'alex'}
集合的刪除
#刪除
s1 = ['alex','1','2']
ss = set(s1) #列表轉集合
ss.remove('2')
print(ss)#{'1', 'alex'}
s1 = ['alex','1','2']
ss = set(s1) #列表轉集合
ss.pop() #隨機的
print(ss)#{'1', 'alex'}
ss.clear()#空集合
print(ss)
del ss #刪除集合
print(ss)
判斷
#判斷子集
print(set('alex') == set('alexlexlex')) #True,相等價的
print(set('alex') < set('alexwwwww'))#True,是否包含
print(set('alex') < set('alex'))#False,要後者比前者元素多
關係測試
#關係測試
a = set([1,2,3,4,5])
b = set([4,5,6,7,8])
#交集
print(a.intersection(b)) #{4, 5}
print(a & b) #{4, 5}
#並集
print(a.union(b)) #{1, 2, 3, 4, 5, 6, 7, 8}
print(a | b) #{1, 2, 3, 4, 5, 6, 7, 8}
#差集
print(a.difference(b)) #{1, 2, 3}
print(a - b)
#對稱差集
print(a.symmetric_difference(b)) #{1, 2, 3, 6, 7, 8}除去交集元素
print(a ^ b)
#超集
print(a.issuperset(b)) #False,a是否是b的超集,是否包含b
#子集
print(a.issubset(b))#False,a是否是b的子集