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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...