python day5 lambda,內置函數,文件操作,冒泡排序以及裝飾器

来源:https://www.cnblogs.com/lanxing0422/archive/2019/10/08/pythonday5.html

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()

您的分享是我們最大的動力!

更多相關文章
  • Josephus問題,在這個古老的問題中,N個深陷絕境的人一致同意通過以下方式減少生存的人數。他們圍坐一圈(位置記為0~N-1)並從第一個人報數,報到M的人會被殺死, 知道最後一個人留下來。傳說中Josephus找到了不會被殺死的位置。 接收N和M的值,列印出被殺死的順序: ...
  • 一、IDE上繼續新建工程 1.在src目錄下新建軟體包:package機制後面再講,目前先用著 2.給package命名一個名稱:com.bjpowernode.java_learning 3.軟體包下新建一個類 4.軟體包是Java語法中的一部分,後面再講 面向對象的封裝性 二、快捷鍵 CTRL ...
  • 1. 基本類型包裝類 大家回想下,在第三篇文章中我們學習Java中的基本數據類型時,說Java中有8種基本的數據類型,可是這些數據是基本數據,想對其進行複雜操作,變的很難。怎麼辦呢? 1.1 基本類型包裝類概述 在實際程式使用中,程式界面上用戶輸入的數據都是以字元串類型進行存儲的。而程式開發中,我們 ...
  • 1. 快速入門 (1)我們從官網下載源碼 BCrypt 官網 http://www.mindrot.org/projects/jBCrypt/ (2)新建工程,將源碼類BCrypt拷貝到工程 (3)新建測試類,main方法中編寫代碼,實現對密碼的加密 String gensalt = BCrypt. ...
  • 1. 正則表達式 1.1 正則表達式的概念 正則表達式(英語:Regular Expression,在代碼中常簡寫為regex)。 正則表達式是一個字元串,使用單個字元串來描述、用來定義匹配規則,匹配一系列符合某個句法規則的字元串。在開發中,正則表達式通常被用來檢索、替換那些符合某個規則的文本。 1 ...
  • 1989,為了度過聖誕假期,Guido開始編寫Python語言編譯器。Python這個名字來自Guido的喜愛的電視連續劇《蒙蒂蟒蛇的飛行馬戲團》。他希望新的語言Python能夠滿足他在C和Shell之間創建全功能、易學、可擴展的語言的願景。 今天,世界上有將近600種編程語言,但也有20種流行語言 ...
  • 類型參數 表現形式:在名稱後面以方括弧表示, 何處使用 class 中,用於定義變數、入參、返回值 函數、方法 類型邊界 上邊界 compareTo Comparable` 的子類型,即需要添加上邊界 scala class Pair[T : LowerBound` 替換第一個元素為 T 的父類 R ...
  • ① 下載JDBC-MySQL資料庫驅動 鏈接:https://pan.baidu.com/s/1KtSZZ5hXlxu2QrmsXg3lkA 提取碼:1pbl ② 載入JDBC-MySQL資料庫驅動 範例:MySQL資料庫驅動載入 Class.forNmae("com.mysql.jdbc.Driv ...
一周排行
  • 上一篇文章(https://www.cnblogs.com/meowv/p/12943699.html)完成了項目的全局異常處理和日誌記錄。 在日誌記錄中使用的靜態方法有人指出寫法不是很優雅,遂優化一下上一篇中日誌記錄的方法,具體操作如下: 在.ToolKits層中新建擴展方法Log4NetExte ...
  • 先安裝幾個包 獲取地址如下https://www.nuget.org/packages/QRCoder/https://www.nuget.org/packages/SixLabors.Fonts/https://www.nuget.org/packages/SixLabors.ImageSharp ...
  • 0. 前言 前一篇我們詳細的介紹了SqlSugar的增刪改查,那些已經滿足我們在日常工程開發中的使用了。但是還有一點點在開發中並不常用,但是卻非常有用的方法。接下來讓我們一起來看看還有哪些有意思的內容。 1. 不同尋常的查詢 之前介紹了針對單個表的查詢,同樣也是相對簡單的查詢模式。雖然開發完全夠用, ...
  • 最新.net core 圖片合併生成二維碼合成圖片 圖片添加文字 先安裝幾個包 獲取地址如下 https://www.nuget.org/packages/QRCoder/ https://www.nuget.org/packages/SixLabors.Fonts/ https://www.nug ...
  • 前言 之前我寫過一篇關於 Blazor WebAssembly 的文章瀏覽器中的 .Net Core —— Blazor WebAssembly 初體驗,如今已經更新到 RC-1,與預覽版有著較大的差異,為此補充這篇文章。 正文 與預覽版的主要差異 1、這次的候選版修改了大部分包名和命名空間,因此無 ...
  • 藍牙設置相關界面,以下是通過C#方式打開的幾個方式,記錄一下 藍牙設置界面 1.控制面板命令bthprops.cpl 可以用控制面板 control+bthprops.cpl,也可以直接bthprops.cpl。更多的命令見:所有運行命令指令大全、CMD & CPL:快捷系統命令和控制面板命令 bt ...
  • 一:背景 1. 講故事 去年阿裡聚石塔上的所有isv簡訊通道全部對接阿裡通信,我們就做了對接改造,使用阿裡提供的.net sdk。 網址:https://help.aliyun.com/document_detail/114480.html 同事當時使用的是ons-.net v1.1.3版本,程式上 ...
  • 一.相關介紹 Dockerfile:關於Dockerfile的使用說明,我在文章《讓.NetCore程式跑在任何有docker的地方》中有說到,這裡不在贅述,需要的可以先看下,本文主要介紹Jenkinsfile結合dockerfile配合使用,自動構建.NetCore應用程式。 Jenkinsfil ...
  • 當用戶嚮應用程式發出請求時,伺服器將解析該請求,生成響應,然後將結果發送給客戶端。用戶可能會在伺服器處理請求的時候中止請求。就比如說用戶跳轉到另一個頁面中獲取說關閉頁面。在這種情況下,我們希望停止所有正在進行的工作,以浪費不必要的資源。例如我們可能要取消SQL請求、http調用請求、CPU密集型操作 ...
  • 在.NET中,我們可以通過Task.WhenAll用來等待多個任務。任務完成之後,我們可以使用await等待他們來獲取結果。 Task<int> task1 = Task.Run(() => 1); Task<string> task2 = Task.Run(() => "hello"); awai ...