Python學習之旅—Day03
---恢復內容開始---
前言
前面兩次博客對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