編寫程式將一行英文中指定的字串替換為另一字串後輸出。注意:查詢指定字串_Python 基礎入門(五)從字串到字典 學習小結...
技術標籤:編寫程式將一行英文中指定的字串替換為另一字串後輸出。注意:查詢指定字串
一. 學習路線概述
學習地址:
Python入門(中) - AI開發者體驗中心developer.aliyun.com總學習路線:
- 列表
- 元組
- 字串
- 字典
- 集合
- 序列
本章學習3~4小節。
二. 具體學習內容
字串
1. 字串的定義
- Python 中字串被定義為引號之間的字元集合。
- Python 支援使用成對的 單引號 或 雙引號。
舉一個小例子:
t1 = 'i love Python!' print(t1, type(t1)) # i love Python! <class 'str'> t2 = "I love Python!" print(t2, type(t2)) # I love Python! <class 'str'> print(5 + 8) # 13 print('5' + '8') # 58
Python
中的字串操作相比於其他語言中的字串操作要簡單易懂一點。
Python 的常用轉義字元:
這些和其他語言中的語法大致一致,這裡便不再多說,只再強調一個“原始字串”的概念。
# 【例子】原始字串只需要在字串前邊加一個英文字母 r 即可。
print(r'C:Program FilesIntelWifiHelp') # 原本字串中有很多符號容易導致歧義,但是加上 r 表示原始字串後就能相對簡單地解決這個問題。
# 執行結果:
# C:Program FilesIntelWifiHelp
在對換行有特別需要的時候,為了程式碼書寫的簡潔,可以使用 ''' ''' 或 """ """的形式來寫字串。
# 例子:
para_str = """這是一個多行字串的例項
多行字串可以使用製表符
TAB ( t )。
也可以使用換行符 [ n ]。
"""
print(para_str)
# 執行結果:
# 這是一個多行字串的例項
# 多行字串可以使用製表符
# TAB ( )。
# 也可以使用換行符 [
# ]。
2. 字串的切片與拼接
- 類似於元組具有不可修改性
- 從 0 開始 (和 Java 一樣)
- 切片通常寫成
start:end
這種形式,包括「start
索引」對應的元素,不包括「end
索引」對應的元素。 - 索引值可正可負,正索引從 0 開始,從左往右;負索引從 -1 開始,從右往左。使用負數索引時,會從最後一個元素開始計數。最後一個元素的位置編號是 -1。
總而言之這些有序列的資料的切片操作幾乎一致,便只舉一個例子不再細談。
# 例子:
str1 = 'I Love LsgoGroup'
print(str1[:6]) # I Love
print(str1[5]) # e
print(str1[:6] + " 插入的字串 " + str1[6:])
# I Love 插入的字串 LsgoGroup
s = 'Python'
print(s) # Python
print(s[2:4]) # th
print(s[-5:-2]) # yth
print(s[2]) # t
print(s[-1]) # n
3. 字串的常用內建方法
這裡給出常用的字串的內建方法,在這裡就不再細談,根據需要查閱便是。
capitalize()
將字串的第一個字元轉換為大寫。lower()
轉換字串中所有大寫字元為小寫。upper()
轉換字串中的小寫字母為大寫。swapcase()
將字串中大寫轉換為小寫,小寫轉換為大寫。count(str, beg= 0,end=len(string))
返回str
在 string 裡面出現的次數,如果beg
或者end
指定則返回指定範圍內str
出現的次數。endswith(suffix, beg=0, end=len(string))
檢查字串是否以指定子字串suffix
結束,如果是,返回 True,否則返回 False。如果beg
和end
指定值,則在指定範圍內檢查。startswith(substr, beg=0,end=len(string))
檢查字串是否以指定子字串substr
開頭,如果是,返回 True,否則返回 False。如果beg
和end
指定值,則在指定範圍內檢查。find(str, beg=0, end=len(string))
檢測str
是否包含在字串中,如果指定範圍beg
和end
,則檢查是否包含在指定範圍內,如果包含,返回開始的索引值,否則返回 -1。rfind(str, beg=0,end=len(string))
類似於find()
函式,不過是從右邊開始查詢。isnumeric()
如果字串中只包含數字字元,則返回 True,否則返回 False。ljust(width[, fillchar])
返回一個原字串左對齊,並使用fillchar
(預設空格)填充至長度width
的新字串。rjust(width[, fillchar])
返回一個原字串右對齊,並使用fillchar
(預設空格)填充至長度width
的新字串。replace(old, new [, max])
把 將字串中的old
替換成new
,如果max
指定,則替換不超過max
次。split(str="", num)
不帶引數預設是以空格為分隔符切片字串,如果num
引數有設定,則僅分隔num
個子字串,返回切片後的子字串拼接的列表。splitlines([keepends])
按照行('r', 'rn', n')分隔,返回一個包含各行作為元素的列表,如果引數keepends
為 False,不包含換行符,如果為 True,則保留換行符。maketrans(intab, outtab)
建立字元對映的轉換表,第一個引數是字串,表示需要轉換的字元,第二個引數也是字串表示轉換的目標。translate(table, deletechars="")
根據引數table
給出的表,轉換字串的字元,要過濾掉的字元放到deletechars
引數中。
4. 字串格式化
字串的格式化輸出幾乎是所有語言的重點,但所幸並非難點。和其他語言一樣,Python中的格式化輸出也有常用寫法:
name = '小明'
age = 10
print("我叫 %s 今年 %d 歲!" % (name, age))
# 執行結果:
# 我叫 小明 今年 10 歲!
常規寫法如此,但是Python中還有一種寫法——Python中有format()格式化函式,一定程度上減輕了開發者的記憶負擔。
我就直接拿上面的例子修改了:
name = '小明'
age = 10
print("我叫 {} 今年 {} 歲!".format(name, age))
# 執行結果:
# 我叫 小明 今年 10 歲!
這樣以來,就不必再去強記複雜的格式化符號了。
補充:
字典
1. 可變型別與不可變型別
- 序列是以連續的整數為索引,與此不同的是,字典以"關鍵字"為索引,關鍵字可以是任意不可變型別,通常用字串或數值。
- 字典是 Python 唯一的一個 對映型別,字串、元組、列表屬於序列型別。
那麼如何快速判斷一個數據型別 X
是不是可變型別的呢?兩種方法:
- 麻煩方法:用
id(X)
函式,對 X 進行某種操作,比較操作前後的id
,如果不一樣,則X
不可變,如果一樣,則X
可變。 - 便捷方法:用
hash(X)
,只要不報錯,證明X
可被雜湊,即不可變,反過來不可被雜湊,即可變。
# 使用id()方法
i = 1
print(id(i)) # 140732167000896
i = i + 2
print(id(i)) # 140732167000960
l = [1, 2]
print(id(l)) # 4300825160
l.append('Python')
print(id(l)) # 4300825160
# 使用雜湊方法:
print(hash('Name')) # 7047218704141848153 # 即不可變
print(hash((1, 2, 'Python'))) # 1704535747474881831 # 即不可變
print(hash([1, 2, 'Python']))
# 不可被雜湊,即可變
# TypeError: unhashable type: 'list'
總結:
- 數值、字元和元組 都能被雜湊,因此它們是不可變型別。
- 列表、集合、字典不能被雜湊,因此它是可變型別。
2. 字典的定義
字典 是
無序的 鍵:值(
key:value
)對集合,鍵必須是互不相同的(在同一個字典之內)。
dict
內部存放的順序和key
放入的順序是沒有關係的。dict
查詢和插入的速度極快,不會隨著key
的增加而增加,但是需要佔用大量的記憶體。
字典 定義語法為
{元素1, 元素2, ..., 元素n}
- 其中每一個元素是一個「鍵值對」-- 鍵:值 (
key:value
) - 關鍵點是「大括號 {}」,「逗號 ,」和「冒號 :」
- 大括號 -- 把所有元素綁在一起
- 逗號 -- 將每個鍵值對分開
- 冒號 -- 將鍵和值分開
3. 建立和訪問字典
使用大括號{}可以建立字典,如下:
dic = {'李寧': '一切皆有可能', '耐克': 'Just do it', '阿迪達斯': 'Impossible is nothing'}
print('耐克的口號是:', dic['耐克'])
# 執行結果:
# 耐克的口號是: Just do it
看如上程式碼的dic['耐克'],是不是從感覺上就覺得有些像使用索引值來訪問列表、元組?只不過在這裡中括號內的不再是索引值,而是對應的“鍵”。這也從另一個角度說明了上文中提到的“字典是無序的”(沒看到的建議往上翻翻再看一遍定義)
注意:如果我們取的鍵在字典中不存在,會直接報錯KeyError
。
鍵所對應的值也是可以被覆蓋/修改的,看如下程式碼:
dic = dict()
dic['a'] = 1
dic['b'] = 2
dic['c'] = 3
print(dic)
# {'a': 1, 'b': 2, 'c': 3}
dic['a'] = 11
print(dic)
# {'a': 11, 'b': 2, 'c': 3}
字典的不同寫法:
dict(mapping)
new dictionary initialized from a mapping object's (key, value) pairs
# 例子:
dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])
print(dic1) # {'cherry': 4098, 'apple': 4139, 'peach': 4127}
dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))
print(dic2) # {'peach': 4127, 'cherry': 4098, 'apple': 4139}
dict(**kwargs)
-> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)
# 例子:這種情況下,鍵只能為字串型別,並且建立的時候字串不能加引號,加上就會直接報語法錯誤。
dic = dict(name='Tom', age=10)
print(dic) # {'name': 'Tom', 'age': 10}
print(type(dic)) # <class 'dict'>
4. 字典的內建方法
老規矩,不強記,根據需求查:
dict.fromkeys(seq[, value])
用於建立一個新字典,以序列seq
中元素做字典的鍵,value
為字典所有鍵對應的初始值。dict.keys()
返回一個可迭代物件,可以使用list()
來轉換為列表,列表為字典中的所有鍵。dict.values()
返回一個迭代器,可以使用list()
來轉換為列表,列表為字典中的所有值。dict.items()
以列表返回可遍歷的 (鍵, 值) 元組陣列。dict.get(key, default=None)
返回指定鍵的值,如果值不在字典中返回預設值。dict.setdefault(key, default=None)
和get()
方法 類似, 如果鍵不存在於字典中,將會新增鍵並將值設為預設值。key in dict
in
操作符用於判斷鍵是否存在於字典中,如果鍵在字典 dict 裡返回true
,否則返回false
。而not in
操作符剛好相反,如果鍵在字典 dict 裡返回false
,否則返回true
。dict.pop(key[,default])
刪除字典給定鍵key
所對應的值,返回值為被刪除的值。key
值必須給出。若key
不存在,則返回default
值。del dict[key]
刪除字典給定鍵key
所對應的值。dict.popitem()
隨機返回並刪除字典中的一對鍵和值,如果字典已經為空,卻呼叫了此方法,就報出KeyError異常。dict.clear()
用於刪除字典內所有元素。dict.copy()
返回一個字典的淺複製。dict.update(dict2)
把字典引數dict2
的key:value
對 更新到字典dict
裡。