python day 5 2019/10/08 學習資料來自老男孩教育 [TOC] 1. 匿名函數lambda 函數名就是變數,使用lambda表達來創建一些簡單功能的函數。 lambda定義簡單函數時,比用def定義要簡潔,會用在map,reduce,filter等函數中。 def f1(x,y) ...
目錄
python day 5
2019/10/08
學習資料來自老男孩教育
1. 匿名函數lambda
函數名就是變數,使用lambda表達來創建一些簡單功能的函數。
lambda定義簡單函數時,比用def定義要簡潔,會用在map,reduce,filter等函數中。
```def f1(x,y):
return x+y
ret = f1(1,2)
print(ret)
lambda 參數: 函數執行體
,與上面def定義的函數f1功能是一樣的。
f2 = lambda x,y : x+y
ret2 = f2(1,2)
print(ret2)
```
user = input('請輸入用戶名:>>>')
passwd = input('請輸入密碼:>>>')
def login(username,passwd):
'''
用於用戶名與密碼驗證
:param username: 用戶名
:param passwd: 密碼
:return: True,用戶名驗證成功;False,用戶驗證失敗。
'''
with open('db','r',encoding='utf-8') as f1:
for line in f1:
#strip預設無參數時,移除空格,換行符,有參數時,移除兩側指定的值
line = line.strip()
line_list = line.split('$')
#print(line_list)
if username == line_list[0] and passwd== line_list[1]:
return True
return False
is_login = login(user,passwd)
if is_login:
print('登錄成功')
2. python的內置函數
0,None,以及空值都是假的。
abs(),返回絕對值。
all(),遍歷可迭代對象的每一個元素,如果全部為真,則返回真。
any(),遍歷可迭代對象的每一個元素,只要有一個為真,則返回真。
ascii(),去參數對應的類中找__rep__,並返回__rep__的返回值。
bin() ,將十進位轉換成二進位。
oct(),將十進位轉換成八進位。
int(),將十進位轉換成十進位。
hex(),將十進位轉換成十六進位。
boll(),將一個對象轉換成boll值。
bytes('xxxx',encoding='utf-8') #將字元串轉換成以utf-8編碼的位元組,一個位元組是8位bit。
chr(), 將十進位數字轉換成為ascii碼表對應的字元。(65,90)是ASCII表中字母數字區間。
ord(),將ascii碼表中的字元轉換成對應的十進位數字。
callable(),判斷一個對象是否可執行,即該對象是否是一個函數名。
compile(),將字元串編譯成可執行的函數,當然,該字元串是函數語句。
dict(map),創建字典。
list(iterable),創建列表。
dir(),輸出對象的所有方法與屬性。
divmod(x,y),返回元素為x除以y的商與餘數的元組。
enumerate(),給可迭代對象增加序列號。
ret = eval('a+60',{'a':9}),可以執行一個字元串形式的表達式,簡單的加減乘除運算。
exec('for i in range(5):print(i)'),執行字元串形式的代碼,沒有返回值。
filter(func,iterable), 篩選:可迭代對象的每一個元素都作為實參傳遞到函數中去,函數返回值為真的元素留下,為假的元素不留,並返回一個迭代器。
iter1 = filter(lambda x: x>22, [11,22,33,44])
for i in iter1:
print(i)
map(func,iterable),映射:可迭代對象的每一個元素都作為實參傳遞到函數中去,函數返回值作為新的迭代器元素返回,最終返回的是一個迭代器。
format(),字元串格式化的方法。
s1 = '{0} is working hard , so is {1}'.format('lanxing', 'his wife')
s2 = '{name} is working hard, so is { name2} '.format(name='lanxing',name2='his wife')
globals(),獲取當前程式的所有全局變數。
locals(),獲取當前程式的所有局部變數。
hash(),計算哈希值,
isinstance(1,int),判斷第一個參數(對象)是否是第二個參數(類)的實例對象,是就返回真。
issubclass(int,object),判斷第一個參數(類),是否是第二個參數(類)的子類,是就返回真。
iter(iterable),將可迭代對象轉換為迭代器。
len(),計算序列字元的長度。
max(),得出序列中的最大值,
min(),得出序列中的最小值
next(),輸出迭代器的下一個值。
open(),打開文件,需要重點掌握。
pow(2,4),計算2的4次方
reversed(iterable),返回一個逆序排列的迭代器。
round(),四捨五入。
sorted(iterable,/,*,key=None, reverse = False),排序,預設返回一個升序排列的新列表,如果reverse為True,則降序排列。key接收一個排序的函數。數字完全按照大小進行排序,字元串分三類順序:數字字元串,字母字元串,中文字元串,前兩類按照ASCII碼排序,後一類按照Unicode碼排序。
str(),將對象轉換為字元串
sum(),將序列求和
super(),返回父類。
tuple(),將可迭代對象轉換為元組。
type(),返回對象所屬的類。
vars(),返回程式有多少個變數。
zip(iterable1,iterable2),將兩個可迭代對象的元素一一對應成為元組,元組作為元素並返回一個迭代器。
r = import(random) ,將引入的random模塊賦予變數r。
3. python文件操作
使用內置函數open來操作文件。操作文件有三步:打開文件,操作文件,關閉文件。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
3.1. file如果只寫文件名,比如'file1.txt',則預設是當前路徑,如果當前路徑沒有這個名字的文件,則報錯,如果是其他目錄的文件,則需要加上文件路徑。
3.2. mode有4種模式:'r'表示只讀模式,'w'代表只寫入模式(如果文件存在,則覆蓋掉,不存在則創建),'x'表示新創建一個文件,併進入寫入模式(如果文件存在,則報錯),'a'表示追加寫入模式,所有寫入內容都在文件末尾。打開file有三種模式,'b'代表二進位模式,'t'代表文本模式,'+'表示讀寫模式。預設文件打開是'rt'模式。
3.3. encoding如果沒傳入,則預設是平臺當前的編碼方式。只在文本模式中需要編碼。二進位模式不需要encoding。
3.4. buttering,指緩衝,預設是-1,代表
讀時是按照指針的順序,從前往後讀,寫時,都是寫到最後,指針也到了最後。
help(open)
f1 = open('hello.txt', 'w', encoding='utf-8')
f1.write('hello,lanxing') #將字元串寫入文件。
f1.close() #關閉文件
f2 = open('hello.txt', 'rb')
data = f2.read() #read表示讀取多少個字元,如果不加參數,則預設讀取全部內容。
print(data)
data2 = str(data,encoding='utf-8')
print(data2)
f2.close()
f3 = open('test1.txt', 'wb')
# 以二進位模式進行寫入操作,write的參數必須是位元組形式,所以用bytes將字元串轉換成位元組。
f3.write(bytes('中國人', encoding='utf-8'))
f3.close()
f4 = open('test1.txt', 'rb+')
data4 = f4.read(3) #只讀取3個位元組
print(data4)
str_data4 = str(data4,encoding='utf-8')
print(str_data4)
f4.close()
# 一,以下是讀寫模式,先讀再寫。
f5 = open('test1.txt', 'r+', encoding='utf-8')
# tell告訴當前指針(或叫游標)在哪個位置,一個位元組就是一個指針位
print(f5.tell()) # tell
data5 = f5.read(1) # 讀取1個字元,utf-8編碼中,一個中文字元是3個位元組。
print(f5.tell()) # 所以現在是3個指針位
print(data5)
data6 = f5.read(1) # 再讀1個字元位。
print(data6)
print(f5.tell()) # 現在指針在第6個位元組位處了
f5.seek(0) # 將指針重新調整到起始位置。
f5.write('日本人') # 寫入操作,會在末尾追加,指針調整到最後。
f5.close()
# 二,以下是寫讀模式,先寫再讀,即先清空再讀。寫入的同時,指針就在最後了。
f6 = open('test1.txt', 'w+', encoding='utf-8')
data6 = f6.read()
print(data6) #空值,因為先寫,已經清空整個文件了。
f6.write('中國人')
print(f6.tell()) #是9,因為3個漢字是9個位元組。
data7 = f6.read() #還是空值,因為現在指針在9,9後面沒有數據了。
f6.seek(0) #將指針調到到開始。
data8 = f6.read()
print(data8)
f6.close()
# 三,a+模式,打開時,指針已經在最後了。
打開文件一定要記得關閉文件,最好使用with來打開文件,with打開文件會自動關閉文件。
with open('test1.txt','w+',encoding='utf-8') as f:
f.write('中國人')
with open('test1.txt','r+',encoding='utf-8') as f1, open('test2.txt','w+',encoding='utf-8') as f2:
#with可以同時打開多個文件。
for line in f1:
#將f1的每一行都寫入到f2文件中去。
f2.write(line)
文件的基本操作還有:
flush(), 即時刷新,可以在文件未關閉之前看到文件更新內容,不接參數。
readline(),讀取當前指針處的一行內容。
readlines(n),讀取當前指針處的n個字元,如果n不寫,則預設全讀完,如果n小於當前行的字元長度,則讀取當前行內容,包括換行符\n,如果n大於當前行的字元長度,則一直到第從當前指針處的第n個字元所在的行,每一行的內容包括換行符作為一個列表的元素,最終返回該列表。
close(),關閉文件
seek(n),調整指針位置
tell(),返回當前指針位置。
truncate(),截取當前指針處之前的位元組內容。文件關閉時,就只有截取的內容了。
read(n),讀取從當前指針處的多少個字元。返回的是字元串。
write(),寫入字元串或位元組。
def del_user(username):
'''
delete the specified user and the password referenced.
:param username: username
:return: True
'''
with open('db.txt','r',encoding='utf-8') as f1,open('db2.txt','w',encoding='utf-8') as f2 :
for line in f1:
if username not in line:
f2.write(line)
with open('db.txt', 'w', encoding='utf-8') as f1, open('db2.txt', 'r', encoding='utf-8') as f2:
for line in f2:
f1.write(line)
return True
def ch_passwd(username):
'''
change the password for the user specified.
:param username: username
:param password: password
:return: True
'''
with open('db.txt','r',encoding='utf-8') as f1,open('db2.txt','w',encoding='utf-8') as f2 :
for line in f1:
if username in line:
password = input('請輸入修改的密碼:>>>')
line= line.strip()
line_list = line.split('$')
line_list[1] = password
line = '%s$%s\n'%(line_list[0],line_list[1])
f2.write(line)
else:
f2.write(line)
with open('db.txt', 'w', encoding='utf-8') as f1, open('db2.txt', 'r', encoding='utf-8') as f2:
for line in f2:
f1.write(line)
return True
def register(username,passwd):
'''
用於註冊新用戶
:param username: user's name
:param passwd: user's password
:return: True when registerd.
'''
with open('db.txt','a+',encoding='utf-8') as f1:
f1.write('\n{0}${1}'.format(username,passwd))
return True
def user_exist(username):
'''
check if user exists in the file 'DB'
:param username: username
:return: True if username exists, False if not exists.
'''
with open('db.txt','r',encoding='utf-8') as f1:
for line in f1:
line = line.strip()
line_list = line.split('$')
if username == line_list[0]:
return True
return False
def login(username,passwd):
'''
用於用戶名與密碼驗證
:param username: 用戶名
:param passwd: 密碼
:return: True,用戶名驗證成功;False,用戶驗證失敗。
'''
with open('db.txt','r',encoding='utf-8') as f1:
for line in f1:
#strip預設無參數時,移除空格,換行符,有參數時,移除兩側指定的值
line = line.strip()
line_list = line.split('$')
#print(line_list)
if username == line_list[0] and passwd== line_list[1]:
return True
return False
def main():
user_choice = input('輸入1註冊,輸入2登錄,輸入3註銷用戶,輸入4修改密碼:>>>')
user = input('請輸入用戶名:>>>')
passwd = input('請輸入密碼:>>>')
if user_choice =='1':
if user_exist(user):
print('該用戶已存在,請直接登錄')
else:
register(user,passwd)
print('註冊成功')
elif user_choice=='2':
is_login = login(user, passwd)
if is_login:
print('登錄成功')
else:
print('用戶名與密碼不符,請重新輸入')
if user_choice == '3':
#先判斷是否登錄成功,登錄成功之後方可註銷用戶
if login(user,passwd):
del_user(user)
elif user_choice == '4':
# 先判斷是否登錄成功,登錄成功之後方可修改密碼
if login(user, passwd):
ch_passwd(user)
if __name__=='__main__':
main()
4. 遞歸函數
def f1():
return 'f1'
def f2(args):
a = args()
return a
f1,f2也是變數,其是函數對象地址的引用,所以函數名也可以作為實參傳入另外一個函數中。
f2(f1) #f1作為實參傳入形參args。
數學意義上的階乘:5! = 5* 4!, 4!= 43!, 3!= 32!, 2!= 2*1!, 1!=1
可以使用遞歸函數解決,遞歸函數指在函數內部調用自己的函數。
def factoria(n):
if n==1:
return 1
return n*factoria(n-1)
5. 冒泡排序
li = [33,2,10,1]
#使用冒泡排序按照由小到大的順序進行排列
for i in range(len(li)-1):
if li[i]>=li[i+1]:
temp = li[i]
li[i]=li[i+1]
li[i+1]=temp
for i in range(len(li)-2):
if li[i] >= li[i + 1]:
temp = li[i]
li[i] = li[i + 1]
li[i + 1] = temp
for i in range(len(li)-3):
if li[i] >= li[i + 1]:
temp = li[i]
li[i] = li[i + 1]
li[i + 1] = temp
print(li)
#總共迴圈了3次,可以優化下,實際自己做的時候,就寫到上面這一步。
#可以簡化成下麵
def maopao(li):
'''
按照冒泡排序演算法對列表進行處理
:param list1: a list
:return: list sorted in ascending
'''
for j in range(1, len(li)): # 1,2,3
for i in range(len(li) - j):
if li[i] > li[i+ 1]:
temp = li[i]
li[i] = li[i + 1]
li[i + 1] = temp
return li
print(maopao(li))
6. 裝飾器
開放封閉原則:對於函數內部是封閉的,即不可修改;函數外部是開放的,可以修改。
裝飾器用來裝飾函數,使得函數在執行之前或執行之後進行某個功能。
def outter(func):
def inner():
print('inner')
#原hello函數
ret = func()
print('inner2')
return ret
return inner
# 解釋器看到@符號會自動做兩件事
# 1,執行 outter函數,將下麵的函數名hello作為實參傳遞給func
# 2,再將outter函數的返回值重新賦值給hello。
# 就是執行了hello = outter(hello)=inner
@outter
def hello():
print('hello')
hello()