牛客網刷題之路---Python糾錯本(持續更新)

一、關於變量

  • 變量無需事先聲明
  • 變量無需指定類型
  • 程序員不用關心內存管理
  • 變量名會被“回收”
  • del語句能夠直接釋放資源
  • 變量只有被創建和賦值後才能被使用

二、關於數據類型

1、list

  1. 構造list,使用[ ]把list的所有元素都括起來就是一個列表,用變量L表示。其中的元素不要求是同一種數據類型。
  2. 列表中元素是有序的。可以通過索引來訪問。
  3. 訪問list的元素,L[0]:表示列表中的第一個元素,L[-1]:表示列表中的最後一個元素。 L[起始索引:終止索引]:表示訪問列表中的多個元素,包含頭,不包含尾。
  4. 列表是可以被修改的,包括添加元素,刪除元素,替換元素。
      1)添加元素:L.append(元素)、L.insert(元素插入到列表中的位置,元素)
      2)刪除元素:L.pop()<==>L.pop(-1),L.pop(要刪除元素在列表中的位置)、L.remove(要刪除元素),刪除列表中第一次匹配到的元素
      3)替換元素:L[要替換元素在列表中的位置]=新的元素值
  5. 計算列表的長度:len(L)
  6. 計算列表中某一個元素在列表中出現的次數:L.count(要統計的元素)
  7. 列表拼接,用+,L1=[1,2],L2=[3,4],L1+L2=[1,2,3,4]
  8. 列表中元素複製,用*,L= [2,3],L*3 = [2,3,2,3,2,3]

2、tuple

  1. 構造tuple,使用()把tuple的所有元素都括起來就是一個元組,用變量T表示。python規定只有單個元素的元組應表示成(元素,),避免歧義。其中的元素不要求是同一種數據類型。
  2. 元組中元素是有序的。可以通過索引訪問。
  3. 訪問tuple的元素,T[0]:表示元組中的第一個元素,T[-1]:表示元組中的最後一個元素。
  4. 元組是不可以被修改的,因此它沒有append()、insert()、pop()等方法。
    注意: 元組中可以包含列表,如T= (1,2,[4,5]),T[2] = [ ],錯誤;T[2][1] =5,正確

3、dict

  1. 構造dict,使用{ }把dict所有元素都括起來就是一個字典,用D表示。D中元素的形式是key:value的形式。其中的key或者value都不要求是同一種數據類型。
  2. 字典中元素是無序的。不可以通過索引訪問。
  3. 訪問dict的元素,使用D[key]來查找對應的value。如果key不存在,則會報錯。爲避免報錯:
     1)訪問前先判斷
      if key in D:
      print(D[key])
     2)使用get()方法
      print(D.get[key]),key不存在會輸出None
  4. 字典是可以被修改的。D[key] = 新的value,如果key不存在,則會想字典中添加這一鍵值對。
    注意:
    字典的一個最明顯的特點是查找速度快,無論字典中有多少個數據,查找的速度都是一樣的,因爲它是按照key來查找的。但是它佔用的內存大。典型的以空間換時間的思想。

4、set

  1. 構建set,S = set(傳入一個列表),或者S = {元素1,元素2,…}。其中的元素不會重複。如:S= set([1,2,3,3,4,5]),print(S) #{1,2,3,4,5}
    注意:創建空集合只能使用S = set(),而不能使用S = { },這是用來創建空字典的。
  2. 集合中元素是無序的。不可以通過索引來訪問元素。
  3. 集合是可以被修改的。
  4. 添加元素和刪除元素
      1)S.add(元素)
      2)S.remove(元素)。刪除之前要進行判斷:if 元素 in S,S.remove(元素),否則會報錯。

三、大小比較

  • Python2 與 Python3 均不支持複數比較大小
  • Python2 與 Python3 均支持連續比較,相當於 3>2 and 2>2,後一個判斷式爲假,因此整個表達式都爲假。
  • Python2 支持數字與字符串之間的比較,而 Python3 則不支持,會報以下錯誤:TypeError: ‘>’ not supported between instances of ‘int’ and ‘str’
  • tuple 的比較是從兩者的第一個元素的 ASCII 碼開始,直至兩個元素不相等爲止,若前面元素都相等,則元素個數多的 tuple 較大。

(1,9) < (2,3) # True
(8,9) < (1,2,3) # False
(1,2,3) == (1,2,3) # True
(3,2) < (‘a’,‘b’) # True
字母與數字的ASCII 碼大小範圍是 “a-z” > “A-Z” > “0-9”,D選項中 ‘a’ < ‘x’,因此
‘abc’ > ‘xyz’ # False

  • 類似元組、字符串、列表這類格式,在進行兩者之間的比較時,先從第一個元素開始比較 ASCII 碼值大小,如果相等,則依次向後比較,如果全部相等,則比較數量大小。

ASCII 碼值大小:

數字:0-9: 48-57
字母:A-Z:65-90,a-z: 97-122

一串數字、字符的 ASCII 碼值大小取決於最後一位的 ASCII 碼值,
例如:
  123454 的ASCII 碼值爲 52

  4 的 ASCII碼值 也爲 52

  ABCDA 爲 65

  A 也是 65

四、編譯型語言和解釋型語言

解釋性語言和編譯性語言的定義:
計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。

解釋性語言(python,java)的定義:
解釋性語言的程序不需要編譯,在運行程序的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就需要逐行翻譯一次,效率比較低。
現代解釋性語言通常把源程序編譯成中間代碼,然後用解釋器把中間代碼一條條翻譯成目標機器代碼,一條條執行。

編譯性語言(C、C++)的定義:
編譯性語言寫的程序在被執行之前,需要一個專門的編譯過程,把程序編譯成爲機器語言的文件,比如exe文件,以後要運行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe文件),因爲翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高。

解釋型語言的特點:

  • 非獨立:需要依賴解釋器
  • 效率低:邊解釋邊執行。解釋器每次運行程序時都要先轉成另一種語言再作運行,因此解釋器的程序運行速度比較緩慢。它不會一次把整個程序翻譯出來,而是每翻譯一行程序敘述就立刻運行,然後再翻譯下一行,再運行,如此不停地進行下去。(而編譯型語言被編譯器一次性將所有源代碼翻譯成另一種機器語言,運行時無需再依賴編譯器,因此運行速度比較快。)
  • 跨平臺兼容性好(編譯型語言進行移植後要重新編譯)

五、閉包

1、如果一個函數的內部定義了另一個函數,外部的我們叫他外函數,內部的我們叫他內函數
2、在一個外函數中定義一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包
3、一般情況下,如果一個函數結束,函數內部的所有東西都會釋放掉,還給內存,局部變量也會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給內部函數,然後自己再結束。

 def adder(x):
    def wrapper(y):
    
        return x + y
    
    return wrapper
adder5 = adder(5)
print(adder5(adder5(6)))
print(adder5(6))
print(adder5(1))
print(adder5(2))
---------------------------------
16
11
6
7 

六、Python的數據類型

Python中有6個標準的數據類型:

  • Numbers(數字)
  • String(字符串)
  • List(列表)
  • Tuple(元組)
  • Dictionary(字典)
  • Set(集合)

其中數字類型有:
Python支持的數字類型有4種:

  • int(有符號整型)
  • long(長整型)
  • float(浮點型)
  • complex(複數)

注意:
string不是char!!!
可變數據類型:列表list[ ],集合set,字典dict{ }
不可變數據類型:字符串str,整型int,元組tuple( )

七、map函數

map( )接收兩個參數,第一個參數function,另一個參數是list,function以參數序列中的每一個元素調用function函數,返回包含每次function函數返回值的新列表。

map( )函數語法:

map(function, iterable, ...)

八、賦值、淺拷貝和深拷貝的區別

賦值: b = a,a和b都指向同一個對象,指向同一塊內存空間(id),任意一方數據的改變,另一方數據也跟着一起改變

首先深拷貝和淺拷貝都是對象的拷貝,都會生成一個看起來相同的對象,他們的本質區別是拷貝出來的對象的地址是否和原對象一樣,也就是地址的複製還是值的複製的區別。

可變對象和不可變對象:

可變對象指的是,一個對象在不改變其所指向的地址的前提下,可以修改其所指向的地址中的值;

不可變對象指的是,一個對象所指向的地址上的值是不能夠修改的,如果你修改了這個對象的值,那麼它指向的地址就改變了,相當於你把這個對象所指向的值複製了一份出來,然後做了修改後保存到另一個地址上了,可變對象不同的是,直接在對象所指的地址上把值修改了,而這個對象的地址並沒有發生變化。

深拷貝和淺拷貝需要注意的地方就是可變元素的拷貝:

在淺拷貝時,拷貝出來的新對象的地址和原對象的地址是不一樣的,但是新對象裏面的可變元素(如列表)的地址和原對象中可變元素的地址是相同的,也就是說淺拷貝拷貝的是淺層次的數據結構(不可變元素),對象裏的可變元素作爲深層次的數據結構並沒有被拷貝到新的地址裏面去,而是和原對象裏的可變元素指向了同一個地址,所以在新對象或原對象中對可變元素做修改時,兩個對象同時改變;

而深拷貝是將淺層次和深層次的數據結構一起拷貝到新的地址裏面,兩者指向完全不同的地址(包括可變元素也指向不同的地址),所以在新對象或者原對象對可變元素修改時,不會影響另一方的可變對象的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章