1. 程式人生 > >Python學習之旅—Day03

Python學習之旅—Day03

系列 mil 執行 成了 地址 可能 %d 基本用法 方式

---恢復內容開始---

前言

  前面兩次博客對Python的安裝以及相關基礎內容進行了整理和介紹,本次博客內容主要專註於解決字符串,列表,元組,字典等四大數據類型的主要用法。涉及到的基本用法本文在此不再贅述,因此本篇博客主要整理和討論一些重要,易混淆的知識點。希望能夠讓大家抓住重點,有針對性地掌握相關知識點。


1.字符串

  關於字符串所提供的一些方法,例如,去除空格,變化大小寫等方法在此不再討論。在這裏大家需要關註一個比較重要的知識點,就是對原始字符串操作後會形成新的字符串,而且這兩個字符串在內存中的地址值是不一樣的。舉例如下:

>>> name = "spark
" >>> id(name) 2847482279840 >>> name.title() Spark >>> id(name.title()) 2847482280848

從上面的代碼中可知原始字符串name的內存地址值為:2847482279840;對name調用title()方法,形成了新的字符串,其內存地址值為:2847482280848。很明顯這是兩個不同的字符串,原始字符串沒有發生改變。如果想讓原始字符串name的值為:Spark,必須在調用title()方法後,將值重新賦予給name.代碼如下:

>>> name = "
spark" >>> id(name) 2455126570968 >>> name = name.title() >>> id(name) 2455126571920 >>> name Spark

從上面的代碼中可知,我們將新生成的字符串name.title()再重新賦予給name,此時name的值由原來的spark變為現在的Spark,而且其內存地址值也改變了。所以大家平時在操作字符串時一定要有這樣的概念,避免不必要的錯誤。


2.列表

我們可以將列表看作是一個可變的容器,裏面可以存儲各種不同的數據類型。例如,整型,字符串,元組,字典,布爾值等。比如我們定義一個列表,如下:

 li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]

   在列表中,我們要註意四點,下面來詳細討論下。

【001】 追加方法append()與插入方法insert()的使用與區別:

  append方法表示向列表末尾插入元素,我們只需在append方法的參數中傳入我們想要插入的值即可。而insert方法表示在指定位置插入我們想要的元素,其方法需要傳入2個參數,一個是位置索引,另一個是需要插入的值。而且插入的值可以是任意類型,因為列表本身就是一個大容器。我們可以看看如下的代碼:

>>> li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]
>>> print(li)
[11, 22, 33, [123, spark, True, [22, 33, 44]], False, (11, 22, 33), kafka]
>>> li.append((11,22,33))
>>> print(li)
[11, 22, 33, [123, spark, True, [22, 33, 44]], False, (11, 22, 33), kafka, (11, 22, 33)]>>> li.insert(8,[11,22,33])
>>> print(li)
[11, 22, 33, [123, spark, True, [22, 33, 44]], False, (11, 22, 33), kafka, [11, 22, 33], [11, 22, 33], (11, 22, 33)]

【002】通過上面的例子可知,列表本身是一個變化的容器,當我們對列表進行增加,刪除,修改時,這些操作會直接作用於原始的列表,我們一起來看看如下的代碼,並結合列表在內存中的地址值進行分析:

>>> id(li)
2455126510408
>>> del li[3] >>> print(li) [11, 22, 33, False, (11, 22, 33), kafka, [11, 22, 33], [11, 22, 33], (11, 22, 33)]
>>> id(li) 2455126510408

>>> li[6].insert(3,44) >>> print(li) [11, 22, 33, False, (11, 22, 33), kafka, [11, 22, 33, 44], [11, 22, 33], (11, 22, 33)]
>>> id(li) 2455126510408

從上面的代碼分析可知,當我們對列表進行增加,刪除和修改時,會直接將操作用於原始列表,因此列表的內容會改變,但從始至終,列表li在內存中的地址值始終沒有變化過。這點是與字符串的最大區別。

【003】關於列表中的第三點,我們需要註意的是,批量替換列表中的元素。同樣我們結合具體代碼來進行分析:

>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> print(name_list)
[spark, hadoop, cisco, kafka]
>>> name_list[2:4] = ["hbase", "flink", "hive", "mapreduce", "mongodb"]
>>> print(name_list)
[spark, hadoop, hbase, flink, hive, mapreduce, mongodb]

由上面的代碼可知,我們想替換原始列表name_list中的最後兩個元素,直接采用切片的方式指定最後兩個列表的索引,然後使用列表["hbase", "flink", "hive", "mapreduce", "mongodb"]

來進行替換。同時我們發現,當替換完最後兩個元素後,新的列表還有其他元素,也一起被添加到name_list中,成為了name_list的新元素。我們再來看下,如果新添加的元素為字符串,會發生什麽樣的情形:

>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> name_list[2:4] = "hive"
>>> print(name_list)
[spark, hadoop, h, i, v, e]
>>> name_list = ["spark", "hadoop", "cisco", "kafka"] >>> name_list[2:4] = "林俊傑" >>> print(name_list) [spark, hadoop, , , ] >>>

由上面的代碼分析可知,當要插入元素為一個字符串,批量替換時,列表會自動將字符串進行切分,然後將每個字符作為一個元素插入到列表中。另外,在上例中,我們需要批量替換列表中索引位置為2和3的元素,但是如果替換的元素只有一個會發生什麽樣的情形,看如下代碼:

>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> name_list[2:4] = ["hbase",]
>>> print(name_list)
[spark, hadoop, hbase]

從上面的代碼中可知,當替換的元素個數小於被替換的元素個數時,只會將替換的元素替代原始被替換的元素。就像上面使用hbase替換cisco,而沒有元素來替換kafak,所以最後列表元素變為:[‘spark‘, ‘hadoop‘, ‘hbase‘]。另外要註意,我們習慣將只有1個列表的元素寫為["hbase",],雖然可以去掉列表中的逗號。但在Python中加一個逗號是約定俗成的,這點還請大家註意。


3.元祖

  我們可以將元組看作是一個不可變的容器,即其裏面的元素值是不可變的。大家主要註意的是元組與列表的混合使用,我們來看一個例子:

>>> li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]
>>> print(li)
[11, 22, 33, [123, spark, True, [22, 33, 44]], False, (11, 22, 33), kafka]
>>> li[-2].append(22) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: tuple object has no attribute append >>>

從上面的代碼可知,li[-2]的元素值是一個元組(11, 22, 33),當我們想對元組進行添加元素時會報錯,這是因為元組中的元素是不可變的。我們再來看如下一個可能令大家困惑的例子:

>>> name_tuple = (1,2,3,[11,22,33])
>>> name_tuple[-1].append(44)
>>> print(name_tuple)
(1, 2, 3, [11, 22, 33, 44])

元組name_tuple的最後一個元素是一個列表,因此我們可以對列表進行添加元素,所以name_tuple[-1].append(44)可以執行成功。我們可以將li = [11,22,33],我們僅僅是對元組中的列表進行修改,而元組本身的元素並沒有發生改變。這也是區別於上面例子的地方,希望大家能夠好好體會。


4.字典

  我們可以將字典看作是鍵值對的集合,即字典中的元素是一個個的鍵值對。關於字典,我們需要主要如下幾點:

【001】通過key來獲取value元素:get方法。我們來看下面的例子:

>>> dict = {"k1": "v1", "k2": "v2"}
>>> dict.get(k1)
v1
>>> dict.get(k3)
>>> dict[k1]
v1
>>> dict[k3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: k3

從上面的代碼中可知,當我們通過get方法根據key來獲取value時,如果key不存在,返回值為None,它不會報錯。但是使用dict[‘k3‘]獲取value值時,如果key不存在,那麽會報錯。

【002】關於字典我們需要註意的第二點是嵌套。在實際項目中,我們往往有一系列的需求,例如將一系列字典存儲在列表中,或者將列表作為值存儲在字典中,甚至可以在字典中嵌套字典。我們可以通過如下的代碼進行說明:

# 在列表中嵌套字典
user_list = [] for user_number in range(1, 302): new_user = {user: alex-%d % user_number, email: [email protected] % user_number, pwd: pwd%d % user_number} user_list.append(new_user)

上面代碼演示了如何在列表中嵌套字典,列表的元素是一個一個的字典,如果我們想取出列表中的元素,可以使用如下的代碼:

 for user in user_list[:10]:
            print(user)

下面我們接著來看如何在字典中嵌套列表:

favorite_language = {
    alex: [python, go],
    sara: [c],
    carson: [ruby,go],
    tom: [java,python]
}

如上所示,我們在字典中嵌套了列表。每個被調查的人都與其關聯一個語言列表。

以上就是列表中要註意的相關點,更多的知識需要各位在平時的練習中加以熟練,並結合實際需求來設計合理的數據結構!


本篇博客主要記錄了字符串,元組,列表中的一些重點知識,希望能夠對大家有幫助,達到夯實基礎的目的。

  

  

  

---恢復內容結束---

Python學習之旅—Day03