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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...