日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

【Python】编程笔记3

發(fā)布時(shí)間:2025/3/19 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】编程笔记3 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、dict 和 set

1、字典——dict

思想:空間換時(shí)間
dict 中的 key 必須是不可變對(duì)象

(1)定義、初始化

在其他語(yǔ)言中也稱為 map,使用鍵 - 值(key - value)存儲(chǔ),根據(jù)key通過(guò)hash算法計(jì)算value值,可進(jìn)行快速查找。

## key-value d = {'Michael':95, 'Bob':75, 'Tracy':85} print(d['Michael'])## 其他初始化方式 d['Adam'] = 67 print(d['Adam'])

輸出結(jié)果:

95 67

key-value 存儲(chǔ)方式:必須根據(jù) key算出 value 的存放位置。

(2)查找中,如果 key 不存在, dict 就會(huì)報(bào)錯(cuò)

==》檢測(cè) key 是否在 dict 中:

  • 方法一:in
  • 方法二:get()方法
## 方法1: print('Tom' in d) ## 方法2:如果 key 不存在,可以返回 None,或指定的值 print(d.get('Tom')) print(d.get('Tom', -1))

輸出結(jié)果

False None -1

注意:

  • 返回 None 的時(shí)候 Python 的交互式命令行不顯示結(jié)果。
  • dict 內(nèi)部存放的順序和 key 放入的順序是沒(méi)有關(guān)系的。

(3)刪除 key

pop(key) ==》key 和所對(duì)應(yīng)的 value 均被刪除。

(4)dict vs. list

和 list 比較, dict 有以下幾個(gè)特點(diǎn):

  • 查找和插入的速度極快,不會(huì)隨著 key 的增加而增加;
  • 需要占用大量的內(nèi)存,內(nèi)存浪費(fèi)多。
  • 而 list 相反:

  • 查找和插入的時(shí)間隨著元素的增加而增加;
  • 占用空間小,浪費(fèi)內(nèi)存很少。
  • 2、集合——set

    (1)定義

    set 是一組 key 的集合,不存儲(chǔ) value。且 set 中的元素,沒(méi)有重復(fù)。
    ==》可看作數(shù)學(xué)意義上的無(wú)序和無(wú)重復(fù)元素的集合

    s = set([1, 1, 8, 2, 9, 2, 3, 3]) print(s)

    輸出結(jié)果

    {1, 2, 3, 8, 9}

    (2)添加元素——add(key)

    s.add(4) print(s)

    輸出結(jié)果

    {1, 2, 3, 4, 8, 9}

    (3)刪除元素——remove(key)

    s.remove(4) print(s)

    輸出結(jié)果

    {1, 2, 3, 8, 9}

    (4)其他運(yùn)算

    s1 = set([1, 2, 3]) s2 = set([2, 3, 4]) print(s1 & s2) ## 交集 print(s1 | s2) ## 并集

    輸出結(jié)果

    {2, 3} {1, 2, 3, 4}

    二、不可變對(duì)象

    問(wèn)題:

    a = 'abc' print(a.replace('a','A')) print(a)

    輸出結(jié)果

    Abc abc

    雖然字符串有個(gè) replace()方法,也確實(shí)變出了’Abc’,但變量 a 最后仍是’abc’,應(yīng)該怎么理解呢?

    分析

    重點(diǎn):a 是變量,而’abc’才是字符串對(duì)象
    ==》a 指向的對(duì)象的內(nèi)容是 ’abc‘

    調(diào)用 a.replace(‘a(chǎn)’, ‘A’) 時(shí),作用在字符串對(duì)象 ‘a(chǎn)bc’ 上,replace 方法創(chuàng)建了一個(gè)新字符串’Abc’并返回,如果我們用變量 b 指向該新字符串,就容易理解了,變量 a 仍指向原有的字符串’abc’,但變量 b 卻指向新字符串’Abc’了
    ==》對(duì)于不變對(duì)象來(lái)說(shuō),調(diào)用對(duì)象自身的任意方法,也不會(huì)改變?cè)搶?duì)象自身的內(nèi)容。相反,這些方法會(huì)創(chuàng)建新的對(duì)象并返回,這樣,就保證了不可變對(duì)象本身永遠(yuǎn)是不可變的。

    三、函數(shù)

    一種代碼抽象的方式。

    1、調(diào)用函數(shù)

    調(diào)用函數(shù)的時(shí)候,如果傳入的參數(shù)數(shù)量不對(duì)或者參數(shù)類型錯(cuò)誤,會(huì)報(bào) TypeError 的錯(cuò)誤。

    2、數(shù)據(jù)類型轉(zhuǎn)換函數(shù)

    print(int('123')) print(int(12.34)) print(float('12.34')) print(str(1.23)) print(str(100)) print(bool(1)) print(bool(''))

    輸出結(jié)果

    123 12 12.34 1.23 100 True False

    3、函數(shù)名

    函數(shù)名,本質(zhì)是指向一個(gè)函數(shù)對(duì)象的引用。
    ==》可以把函數(shù)名賦給一個(gè)變量,相當(dāng)于給這個(gè)函數(shù)起了一個(gè)“別名”。

    a = abs print(a(-1))

    輸出結(jié)果

    1

    4、定義函數(shù)

    格式:def 函數(shù)名(參數(shù)):,然后,在縮進(jìn)塊中編寫(xiě)函數(shù)體,函數(shù)的返回值用 return 語(yǔ)句返回。

    如果沒(méi)有 return 語(yǔ)句,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為 None。return None 可以簡(jiǎn)寫(xiě)為 return。

    (1)空函數(shù)——pass語(yǔ)句

    pass用于占位符,可以先讓代碼運(yùn)行起來(lái),之后再進(jìn)行補(bǔ)充。

    def nop():pass

    還可以放在其他語(yǔ)句中,eg:if 語(yǔ)句

    5、參數(shù)檢查——TypeError錯(cuò)誤

    • 參數(shù)個(gè)數(shù)不對(duì)
    • 參數(shù)類型不對(duì)(內(nèi)置函數(shù)可以檢查出來(lái),而自己寫(xiě)的會(huì)不完善==》參數(shù)類型檢查)
    def my_abs(x):## 參數(shù)類型檢驗(yàn)if not isinstance(x, (int, float)):raise TypeError('bad operand type')if x > 0:return xelse:return -x

    6、返回多個(gè)值

    本質(zhì):函數(shù)可以同時(shí)返回多個(gè)值,但其實(shí)就是一個(gè) tuple。

    7、函數(shù)的參數(shù)

    參數(shù)包括:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù)。
    ==》處理復(fù)雜的參數(shù),還可以簡(jiǎn)化調(diào)用者的代碼

    (1)位置參數(shù)(必選參數(shù))

    按照位置順序依次賦給不同的參數(shù)。

    (2)默認(rèn)參數(shù)

    注意:

    • 必選參數(shù)在前,默認(rèn)參數(shù)在后。
    • 多參數(shù)時(shí),將變化大的參數(shù)放在前面,變化小的參數(shù)放在后面,變化小的參數(shù)可以作為默認(rèn)參數(shù)。
    • 當(dāng)不按順序提供部分默認(rèn)參數(shù)時(shí),需要把參數(shù)名寫(xiě)上。
      ==》降低調(diào)用函數(shù)的難度。
    def add_end(L = []):L.append('END')return Lprint(add_end([1,2,3])) print(add_end(['x','y','z'])) print(add_end()) print(add_end()) print(add_end())

    輸出結(jié)果

    [1, 2, 3, 'END'] ['x', 'y', 'z', 'END'] ['END'] ['END', 'END'] ['END', 'END', 'END']

    原因

    • 默認(rèn)參數(shù) L 是一個(gè)變量,它指向?qū)ο骩],每次調(diào)用該函數(shù),如果改變了 L 的內(nèi)容,則下次調(diào)用時(shí),默認(rèn)參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時(shí)的[]了
      ==》默認(rèn)參數(shù)必須指向不變對(duì)象

    修改版本

    def add_end(L = None):if L is None:L = []L.append('END')return Lprint(add_end([1,2,3])) print(add_end(['x','y','z'])) print(add_end()) print(add_end()) print(add_end())

    輸出結(jié)果

    [1, 2, 3, 'END'] ['x', 'y', 'z', 'END'] ['END'] ['END'] ['END']

    (3)可變參數(shù)

    傳入的參數(shù)個(gè)數(shù)是可變的。0 個(gè) 或 任意個(gè)
    ==》可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè) tuple

    def calc(*numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum## 直接調(diào)用 print(calc(1,2)) print(calc()) ## 可以 0 個(gè)參數(shù)## 調(diào)用已有的list或tuple元素 ## *nums 表示把 nums 這個(gè) list 的所有元素作為可變參數(shù)傳進(jìn)去。 nums = [1,2,3] print(calc(*nums))

    (4)關(guān)鍵字參數(shù)

    傳入 0 個(gè)或任意個(gè)含參數(shù)名的參數(shù)
    ==》這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè) dict。
    ==》用于擴(kuò)展函數(shù)的功能,eg:選填參數(shù)

    def person(name, age, **kw):print('name:',name, 'age:',age, 'others:',kw)## 直接調(diào)用 person('Michael', 30) person('Bob', 35, city='Beijing') person('Adam', 45, gender='M', job='Engineer')## 調(diào)用已有的dict元素 extra = {'city': 'Beijing', 'job': 'Engineer'} person('Jack', 24, **extra)

    extra 表示把 extra 這個(gè) dict 的所有 key-value 用關(guān)鍵字參數(shù)傳入到函數(shù)的kw 參數(shù), kw 將獲得一個(gè) dict,注意 kw 獲得的 dict 是 extra 的一份拷貝,對(duì) kw 的改動(dòng)不會(huì)影響到函數(shù)外的 extra。

    (5)命名關(guān)鍵字參數(shù)

    關(guān)鍵字參數(shù)檢查

    調(diào)用時(shí),仍可傳入不受限制的關(guān)鍵字參數(shù)

    def person(name, age, **kw):if 'city' in kw:passif 'job' in kw:passprint('name:',name, 'age:',age, 'others:',kw)person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)

    輸出結(jié)果

    name: Jack age: 24 others: {'city': 'Beijing', 'addr': 'Chaoyang', 'zipcode': 123456}
    命名關(guān)鍵字參數(shù)——只接受特定的關(guān)鍵字參數(shù)

    命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符 *,* 后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。

    def person(name, age, *,city, job):print(name, age, city, job)person('Jack', 24, city='Beijing', job='Enigneer')## 命名關(guān)鍵字參數(shù)可以有缺省值 def person(name, age, *,city = 'Beijing', job):print(name, age, city, job)

    注意:

    • 命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。
    • 命名關(guān)鍵字參數(shù)可以有缺省值;

    (6)參數(shù)組合

    參數(shù)定義順序
    必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)/命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。其中可變參數(shù)無(wú)法與命名關(guān)鍵字參數(shù)混合。

    def f1(a, b, c=0, *args, **kw):print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0, *, d, **kw):print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) f1(1, 2) f1(1, 2, c=3) f1(1, 2, 3, 'a', 'b') f1(1, 2, 3, 'a', 'b', x=99) f2(1, 2, d=99, ext=None)## 通過(guò) tuple 和 dict 調(diào)用 args1 = (1,2,3,4) kw1 = {'d':99,'x':'#'} f1(*args1, **kw1) args2 = (1,2,3) kw2 = {'d':99,'x':'#'} f2(*args2, **kw2)

    輸出結(jié)果

    a = 1 b = 2 c = 0 args = () kw = {} a = 1 b = 2 c = 3 args = () kw = {} a = 1 b = 2 c = 3 args = ('a', 'b') kw = {} a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99} a = 1 b = 2 c = 0 d = 99 kw = {'ext': None} a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'} a = 1 b = 2 c = 3 d = 99 kw = {'x': '#'}

    對(duì)于任意函數(shù),都可以通過(guò)類似 func(*args, **kw)的形式調(diào)用它,無(wú)論它的參數(shù)是如何定義的。

    四、遞歸函數(shù)

    如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。

    優(yōu)點(diǎn):簡(jiǎn)單、邏輯清晰

    1、遞歸過(guò)程

    注意:防止棧溢出

    在計(jì)算機(jī)中,函數(shù)調(diào)用是通過(guò)棧( stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減一層棧幀。由于棧的大小不是無(wú)限的,所以,遞歸調(diào)用的次數(shù)過(guò)多,會(huì)導(dǎo)致棧溢出。
    ==》解決方法:尾遞歸
    ==》尾遞歸:在函數(shù)返回的時(shí)候,調(diào)用自身本身,并且, return 語(yǔ)句不能包含表達(dá)式。這樣,編譯器或者解釋器就可以把尾遞歸做優(yōu)化,使遞歸本身無(wú)論調(diào)用多少次,都只占用一個(gè)棧幀,不會(huì)出現(xiàn)棧溢出的情況。

    def fact(n):return fact_iter(n, 1) def fact_iter(num, product):if num == 1:return productreturn fact_iter(num - 1, num * product)

    遺憾的是,大多數(shù)編程語(yǔ)言沒(méi)有針對(duì)尾遞歸做優(yōu)化, Python 解釋器也沒(méi)有做優(yōu)化,所以,即使把上面的 fact(n)函數(shù)改成尾遞歸方式,也會(huì)導(dǎo)致棧溢出。

    總結(jié)

    以上是生活随笔為你收集整理的【Python】编程笔记3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。