python day4 元組/字典/集合類知識點補充

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

python day4 元組/字典/集合類知識點補充 (學習資源來自老男孩教育) 2019/10/7 [TOC] 1. 元組tuple知識點補充 創建和轉換 ,比如 元組的特性 元組的特性:元組的元素不可修改,但是元素的元素可以被修改。即元組的兒子不能變,但是元組的孫子可以變。 2. 字典dict的 ...


目錄

python day4 元組/字典/集合類知識點補充

(學習資源來自老男孩教育)

2019/10/7

1. 元組tuple知識點補充

  • 創建和轉換

t = (11,22,33)
t = tuple(iterable),比如tuple([11,22,33])

  • 元組的特性
    元組的特性:元組的元素不可修改,但是元素的元素可以被修改。即元組的兒子不能變,但是元組的孫子可以變。
t = (11,22,33,['lan',{'name':'lanxing'}])
t[5]=44  #會報錯,因為元組的元素不可修改 
t[3][0]='xing' #不會報錯,因為元組的孫子可以修改。

2. 字典dict的知識點補充

  • 創建和轉換

dict1 = {'k1':33,'k2':'xy'}
dict2=dict(k1=33,k2='xy')` 本質上都是用的第二種方法。

  • fromkeys值的指向是同一個記憶體地址
d1 ={'k1':[],'k2':[],'k3':[]}
d1['k1'].append('x')  
print(d1) 
d2 =d1.fromkeys(d1,[])
x1 = d2['k1'].append('x')
print(d2)  # 因為fromkeys(iterable,v),這個v指向是同一個記憶體地址

3. 基本數據類型set

集合set是一個無序且元素唯一的元素集合。集合主要用來做關係測試。

  • 創建一個集合

s1 = {1,2,'x','y',True}
s2 = set((1,2,'x','y',True)) set()中的參數是可迭代對象。
本質上集合set就是字典的keys。

  • 集合的方法

add,clear,difference,difference_update,discard,remove,intersection,isdisjoint,issubset,

s2 = set((1,2,'x','y',True)) 
s2.add(3)  #往集合裡面添加元素3
s2.add('z')
s1 = {1,2,'x','y',True,'name'} 
s1.difference(s2) # 找s1中存在,s2中不存在的元素。即找差集
s1-s2 # 找s1中存在,s2中不存在的元素。與difference功能一樣
s1.difference_update(s2) # 找s1中存在,s2中不存在的元素,並更新自己,也就是s1把兩者之間的交集去掉。
s1.discard('x') #移除指定元素,元素不存在也不報錯。
s1.discard('x')  #移除指定元素,不存在則會報錯。
s1.intersection(s2)  #找交集,即s1中存在,s2中也存在的元素。
s1.isdisjoint(s2)  #判斷是否沒有交集,有交集是False,沒有交集是False。
s1.issubset(s2)  # 判斷s1是否是s2是子集合
s1.symmetric_difference(s2)  #求對稱差集,即s1中存在,s2中也存在,但不是雙方都存在的元素。
s1 ^ s2 # 求對稱差集
s1.union(s2) #求並集。
s1 | s2  #求並集

作業:
有兩個字典old_dict和new_dict,要求:

  1. 兩個字典的key相同的,將old_dict[key]中的值更新為new_dict[key]的值。
  2. new_dict.keys()存在的,在old中添加,不存在的,old中刪除。
old_dict =dict(#1=11,#2=22,#3=100)
new_dict = dict(#1=33,#4=22,#7=100)

# 字典的key相同即判斷是否有交集,所以第一步先找出交集
s1 = set(old_dict.keys())
s2 = set(new_dict.keys())
s3 = s1.intersection(s2)

# 使用for迭代來更新old中的值
for i in s3:
    old_dict[i] = new_dict[i]
# 找到s1與s2的差集,併進行迭代,刪除舊元素。
s4 = s1 - s2
for i in s4:
    old_dict.pop(i)
s5 = s2 - s1
for i in s5:
    old_dict[i]=new_dict[i]
print(old_dict)

4. 三元運算,又叫三目運算

if 1==1:
    name ='x'
else:
    name='y'

name ='x' if 1==1 else 'y'  #這就叫三元運算。

5. 深複製淺複製

  1. 對於數字和字元串來說,不需要追究深淺複製的不同,因為他們是不可變對象,永遠指向的同一個記憶體地址。
  2. 對於列表,字典,元組,集合等,深淺複製是不同的。
    淺複製時,只複製第一層記憶體地址,而深複製時,全部複製。
    淺複製
import copy
li1 = [1,2,[3,4]]
li2 = copy.copy(li1)  # 淺複製,只是複製第一層元素的記憶體地址引用。即li2的嵌套列表的悠會影響原列表的嵌套列表。
id(li1) == id(li2)
li2[2].append(5)
li2.append(6)
print(li1,li2)
li3 = copy.deepcopy(li1)  # 深複製,li3的任何修改都與li1無關了。
li3[2].append(5)
li3.append(6)
print(li1,li3)

6. 函數

編程有三類:函數式編程,面向對象過程,面向過程編程。

  1. 面向過程編程:根據業務邏輯從上到下按順序實現功能,開發過程中最常見的操作就是粘貼複製,也就是將之前的代碼塊複製到現需功能。
  2. 函數式編程:即將指定的功能編成函數,想用的時候就拿出來。在函數式編程中,每一個功能都是一個函數。函數式編程,先考慮動詞。
  3. 面向對象編程:將不同對象進行分類,再考慮不同對象擁有哪些功能。開發時先考慮名詞,即不同的對象。
  • 定義函數

函數就是擁有功能的代碼塊,可以不斷進行復用。
數學函數:f(x,y)=xy2,f是函數名,x,y是參數,xy2是函數執行語句。

  1. 定義函數的語法:
def funcname(x,y,z='hello',*args,**kwargs):  #定義函數
    print(x,y,z,args,kwargs)  #函數的執行語句
    return x,y,z,args,kwargs  #函數的返回值
  1. def是定義函數的關鍵字,funcname是函數的名稱,是一個變數,可以不斷修改,()裡面是函數的參數,return關鍵字後面的內容是函數的返回值。調用函數時,遇到return就結束了。如果沒有return關鍵字,則預設返回None(空)。
    函數的調用,如果要使用函數,funcname(1,2),即函數名+括弧(參數1,參數2)即可,就會自動執行函數體(函數的執行語句)。
  • 函數的參數
def func(x,y,z='hello'):
    pass  #pass關鍵字是什麼也不做,表示占位符
  1. 括弧裡面的x,y,z叫做參數中的位置參數,等到執行的時候,func(1,2),即表示將1,2賦值給了x,y,也叫1,2傳入了參數x,y。這裡1,2叫做實參
  2. z叫做預設參數,預設參數在函數調用時,是可選傳入的,如果不傳入,則預設z的實參就是'hello'。
  3. 函數調用時,參數的傳值預設按照位置形參的位置進行傳入。預設參數的實參必須在位置參數的後面。但如果指定形參傳入實參,可以不按照順序
    func(1,2),func(y=2,x=1)是一樣的效果,沒有傳入形參z的實參,因為z有預設值。
    func(1,2,4) 與func(y=2,z=4,x=1)是一樣的效果。
    函數的動態參數:動態參數可以接收無限個實參。
def myfunc(x,y,z='hello',*args,**kwargs):  # 其中*args叫做動態位置參數,**kwargs叫動態關鍵字參數
    print(x,y,z,args,kwargs,sep=',')  #函數的執行語句
    return x,y,z,args,kwargs  #函數的返回值

動態參數
函數調用時,動態位置參數必須在動態關鍵字參數前面。 動態位置參數是一個元組,動態關鍵字參數是一個字典。
myfunc(1, 2, 'hellow world', 4, 5, k='hello,lanxing', my='lanxing')
1,2,hellow world,(4, 5),{'k': 'hello,lanxing', 'my': 'lanxing'}

  1. 為動態參數傳入列表,字典,元組時,列表,表示將列表中的每個元素都當作位置參數的實參傳入,字典,就是將字典中的每個鍵值對都當作關鍵字參數。
  • 全局變數和局部變數

函數內部中的變數只作用於該函數內部,對外界沒有影響。

a=1  #全局函數,都有作用
def func1():
    b=2  #局部變數
    global a #通過關鍵字global 聲明a是全局變數,會影響函數外部的a
    a = 3  #修改了全局變數a的賦值
    
    print(a)  #全局變數作用於整個頁面
    print(b) 
print(a) #這裡輸出的是修改了的全局變數a
print(b)  #會報錯,因為局部變數只作用於函數內部
func1()  #調用函數

作業

def countLength(s):
    li1 = []
    li2 = []
    li3 = []
    for i in range(len(s)):
        if s[i].isdigit():
            li1.append(s[i])
        elif s[i].isalpha():
            li2.append(s[i])
        elif s[i].isspace():
            li3.append(s[i])

    return len(li1), len(li2), len(li3), len(s)-len(li1)-len(li2)-len(li3)


#countLength('  123  xyz aa 藍星***')

def countLen(obj):
    if len(obj) >= 5:
        print('%s長度大於5' % obj)
    else:
        print('%s長度小於5' % obj)


# countLen([1, 2, 3, 4])

def isSpace(obj):
    a = 0
    for i in obj:
        for j in i:
            if j.isspace():
                a += 1
    return a


li = ['x y', 'abc12  4 5', '  z  y  ']
# print(isSpace(li))


def chlist(li):
    if len(li) > 2:
        return li[:2]
    return li


#print(chlist([1, 2, 3, 4]))
def oddSeq(li):
    list1 = []
    for i in range(len(li)):
        if i % 2 != 0:
            list1.append(li[i])
    return list1


#print(oddSeq([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

dict1 = {'k1': 'v1v1', 'k2': [11, 22, 33, 44]}


def lenDict(**kwargs):
    for k, v in kwargs.items():
        if len(v) > 2:
            kwargs[k] = v[:2]
    return kwargs
# print(lenDict(**dict1))


def feibonaqi(n):

    if n == 0:

        return 0
    elif n==1:
        
        return 1   
    else:

        return feibonaqi(n-2)+feibonaqi(n-1)  #遞歸就是在函數內部調用自己,相當於數學函數中的f(x)=f(x-1),f(0)=0
print(feibonaqi(9))
i = 0
li =[]
while i<10:
    li.append(feibonaqi(i))
    i +=1

print(li,len(li))

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

-Advertisement-
Play Games
更多相關文章
  • 1. 類型強制轉換 1.1 string強制轉換為數字 可以用 *1來轉化為數字(實際上是調用 .valueOf方法) 然後使用 Number.isNaN來判斷是否為 NaN,或者使用 a!==a 來判斷是否為 NaN,因為 NaN!==NaN 常用:也可以使用 +來轉化字元串為數字 1.2 obj ...
  • 下表列出了用於操作HTML和CSS的所有方法。 ...
  • 0--前言 對於分散式系統環境,主鍵ID的設計很關鍵,什麼自增intID那些是絕對不用的,比較早的時候,大部分系統都用UUID/GUID來作為主鍵,優點是方便又能解決問題,缺點是插入時因為UUID/GUID的不規則導致每插入一條數據就需要重新排列一次,性能低下;也有人提出用UUID/GUID轉lon ...
  • 中介者模式: 1、定義:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用, 從而使其耦合鬆散,而且可以獨立地改變它們之間的交互 2、模型結構: (1)抽象中介者(Mediator):它是中介者的介面,提供了同事對象註冊與轉發同事對象信息的抽象方法 (2)具體中介者(Concr ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
  • 1. final關鍵字 1.1 final的概念 繼承的出現提高了代碼的復用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對其中的方法進行重寫,那怎麼解決呢? 要解決上述的這些問題,需要使用到 ...
  • GoLang 開山篇 1、Golang 的學習方向 Go語言,我們可以簡單的寫成Golang. 2、GoLang 的應用領域 2.1 區塊鏈的應用開發 2.2 後臺的服務應用 2.3 雲計算/雲服務後臺應用 3、學習方法的介紹 建立一個整體框架、然後細節 在實際工作中,要培養用到什麼,能夠快速學習什 ...
  • 一、遞歸 1、遞歸的定義 在一個函數內部調用函數自身。 2、遞歸的最大深度--996 修改最大深度 我們會發現,將遞歸的最大深度改成100000後,並沒有達到100000,這是由我們的電腦性能決定的。 3、遞歸的特點 (1)調用自身 (2)必須要有結束條件 4、實例 菲波那切數列:0 1 1 2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...