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 ...
一周排行
  • 一、引言 按照專用隊列解釋: MachineName\Private$\QueueName,只針對於本機的程式才可以調用的隊列,有些情況下為了安全起見定義為私有隊列。所以剛開始的時候認為,要想訪問遠程消息隊列,只能使用公共隊列。但是後來發現,公共隊列依賴Domain Controller(域控),在 ...
  • 本文只對api介面,header請求參數進行簡單驗證,起到拋磚引玉使用,需要深入驗證,請自行擴展 項目目錄結構如圖 中間件類 using ApiMiddleware.Common.DataEnityModel; using ApiMiddleware.Common.DbContext; using ...
  • 前言:由於公司占時沒有運維,出於微服務的需要,Apollo只能先裝在windows 阿裡雲上跑起來,由於環境及網路等問題,在安裝過程中遇到很多坑,算是一個個坑填完後,最終實現。 一. java jdk環境 java jdk 1.8下載地址: https://www.oracle.com/java/t ...
  • 前言 nuget 是 .net 的常用包管理器,目前已經內置到 Visual Studio 2012 以後的版本。大多數 .net 包都托管在 nuget.org,包括 .net core 框架基礎包,得益於 .net core 的模塊化設計,很多非核心包都可以進行一定程度的獨立升級。 製作並上傳 ...
  • 簡單的介紹一下集合,通俗來講就是用來保管多個數據的方案。比如說我們是一個公司的倉庫管理,公司有一堆貨物需要管理,有同類的,有不同類的,總而言之就是很多、很亂。我們對照集合的概念對倉庫進行管理的話,那麼 數組就是將一堆貨整整齊齊的碼在倉庫的某個地方,普通列表也是如此;Set就是在倉庫里有這麼一個貨架, ...
  • 中間件分類 ASP.NET Core 中間件的配置方法可以分為以上三種,對應的Helper方法分別是:Run(), Use(), Map()。 Run(),使用Run調用中間件的時候,會直接返回一個響應,所以後續的中間件將不會被執行了。 Use(),它會對請求做一些工作或處理,例如添加一些請求的上下 ...
  • 字元串的常用操作 很好理解 字元串可以用 ' + ' 連接,或者乘一個常數重覆輸出字元串 字元串的索引操作 通過一對中括弧可以找到字元串中的某個字元 可以通過正負數雙向操作噢 用一個中括弧來實現 為什麼沒有-0??去清醒腦子想想 -0 和 0 有差嗎? 還有一個切片操作 就像切菜那樣簡單,同樣是中括 ...
  • title: Java基礎語法(3) 運算符 blog: "CSDN" data: "Java學習路線及視頻" 1.算術運算符 算術運算符的註意問題 如果對負數取模,可以把模數負號忽略不記,如:5% 2=1。 但被模數是負數則不可忽略。此外,取模運算的結果不一定總是整數。 對於除號“/”,它的整數除 ...
  • 下麵是互相轉換的代碼: 有想要瞭解更多關於python知識的請在下方評論或私信小編 ...
  • 引言 構建分散式系統並不容易。然而,人們日常所使用的應用大多基於分散式系統,在短時間內依賴於分散式系統的現狀並不會改變。ApacheZooKeeper旨在減輕構建健壯的分散式系統的任務。ZooKeeper基於 分散式計算的核心概念而設計,主要目的是給開發人員提供一套容易理解和開發的介面,從而簡化分佈 ...
x