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

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

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

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

-Advertisement-
Play Games
更多相關文章
  • 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 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...